From d35d6a6c6b328fa4dd3c85a77533901cd3e2d1d3 Mon Sep 17 00:00:00 2001 From: Mark Patton Date: Wed, 8 Nov 2023 10:37:11 -0500 Subject: [PATCH] First draft of data model --- docs/dev/README.md | 1 + docs/dev/model/Deposit.md | 38 ++++++++++++++++++ docs/dev/model/File.md | 28 +++++++++++++ docs/dev/model/Funder.md | 15 +++++++ docs/dev/model/Grant.md | 32 +++++++++++++++ docs/dev/model/Journal.md | 27 +++++++++++++ docs/dev/model/Policy.md | 18 +++++++++ docs/dev/model/Publication.md | 17 ++++++++ docs/dev/model/README.md | 26 ++++++++++++ docs/dev/model/README.md~ | 32 +++++++++++++++ docs/dev/model/Repository.md | 42 ++++++++++++++++++++ docs/dev/model/RepositoryCopy.md | 28 +++++++++++++ docs/dev/model/Submission.md | 61 +++++++++++++++++++++++++++++ docs/dev/model/SubmissionEvent.md | 38 ++++++++++++++++++ docs/dev/model/SystemProperties.md | 10 +++++ docs/dev/model/User.md | 30 ++++++++++++++ docs/dev/model/pass_data_model.jpg | Bin 0 -> 47855 bytes 17 files changed, 443 insertions(+) create mode 100644 docs/dev/model/Deposit.md create mode 100644 docs/dev/model/File.md create mode 100644 docs/dev/model/Funder.md create mode 100644 docs/dev/model/Grant.md create mode 100644 docs/dev/model/Journal.md create mode 100644 docs/dev/model/Policy.md create mode 100644 docs/dev/model/Publication.md create mode 100644 docs/dev/model/README.md create mode 100644 docs/dev/model/README.md~ create mode 100644 docs/dev/model/Repository.md create mode 100644 docs/dev/model/RepositoryCopy.md create mode 100644 docs/dev/model/Submission.md create mode 100644 docs/dev/model/SubmissionEvent.md create mode 100644 docs/dev/model/SystemProperties.md create mode 100644 docs/dev/model/User.md create mode 100644 docs/dev/model/pass_data_model.jpg diff --git a/docs/dev/README.md b/docs/dev/README.md index fe22859f..6049d884 100644 --- a/docs/dev/README.md +++ b/docs/dev/README.md @@ -34,3 +34,4 @@ Only Committers on the PASS Eclipse project are able to make changes to the code * [Docker Dependencies](integration-test-docker-dependencies.md) - Integration Testing and Docker Dependencies * [Components](components.md) - PASS project components * [Releasing PASS](release.md) - Releasing the PASS project +* [Data model](model/README.md) - Data model of the PASS project diff --git a/docs/dev/model/Deposit.md b/docs/dev/model/Deposit.md new file mode 100644 index 00000000..12dfae29 --- /dev/null +++ b/docs/dev/model/Deposit.md @@ -0,0 +1,38 @@ +# Deposit + +A [Submission](Submission.md) can have multiple Deposits, each to a different [Repository](Repository.md). This entity describes the interaction of PASS with a target [Repository](Repository.md) for an individual [Submission](Submission.md) with the purpose of satisfying one or more [Policies](Policy.md). + +| Field | Type | Description +| ---------------- | ------ | ------------- +| __id*__ | URI | Unique Deposit URI (autogenerated) +| depositStatusRef | String | A URL or some kind of reference that can be dereferenced, entity body parsed, and used to determine the status of Deposit +| depositStatus* | Enum | Status of deposit ([_see list below_](#deposit-status-options)) +| submission* | URI | URI of [Submission](Submission.md) this Deposit is a part of +| repository* | URI | URI of the [Repository](Repository.md) being deposited to +| repositoryCopy | URI | URI of the [Repository Copy](RepositoryCopy.md) representing the copy that is reltaed to this Deposit. The value is null if there is no copy + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Deposit status options + +These are the possible statuses for a Deposit in the order they could occur. Note that not all repositories will go through every status. + +
+
Intermediate status
+
A Deposit with an intermediate status indicates that the processing of the Deposit is not yet + complete. At some indeterminate point in the future, the status may be updated to a terminal + state. +
+
Terminal status
+
A Deposit with a terminal status indicates that the processing of the Deposit is complete. +
+
+ +| Value | State | Description +| --------- | ----- | --- +| submitted | Intermediate | PASS has sent a package to the target [Repository](Repository.md) and is waiting for an update on the status +| rejected | Terminal | The target [Repository](Repository.md) has rejected the Deposit +| failed | Intermediate | A failure occurred while performing the deposit, it may be re-tried later. +| accepted | Terminal | The target [Repository](Repository.md) has accepted the [Files](File.md) into the repository and they are pending publication if not published already diff --git a/docs/dev/model/File.md b/docs/dev/model/File.md new file mode 100644 index 00000000..cc14f36b --- /dev/null +++ b/docs/dev/model/File.md @@ -0,0 +1,28 @@ +# Files + +Files are associated with a [Submissions](Submission.md) to be used to form [Deposits](Deposit.md) into [Repositories](Repository.md) + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique File URI (autogenerated) | +| name* | String | File name, defaults to filesystem.name | +| uri* | URI | URI to the bytestream that [Deposit](Deposit.md) services will use to retrieve the bytestream for Deposit| +| description | String | Description of file provided by [User](User.md) | +| fileRole | Enum ([_see list below_](#file-role-options)) | Role of the file | +| mimeType | String | Mime-type of file | +| submission* | URI | URI of the [Submission](Submission.md) the File is a part of | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## File role options + +Status options for grant + +| Value | Description | +| ------------- | ------------- | +| manuscript | Author accepted manuscript | +| supplemental | Supplemental material for the [Publication](Publication.md) | +| figure | An image, data plot, map, or schematic | +| table | Tabular data | diff --git a/docs/dev/model/Funder.md b/docs/dev/model/Funder.md new file mode 100644 index 00000000..50185bf5 --- /dev/null +++ b/docs/dev/model/Funder.md @@ -0,0 +1,15 @@ +# Funder + +Funder / sponsor of a [Grant](Grant.md). + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Funder URI (autogenerated) | +| name* | String | Funder name | +| url | URI | Funder URL | +| localKey | String | Local key assigned to the funder within the researcher's institution to support matching between PASS and a local system. The value is in the form of : `domain:type:value`. For a funder at JHU, an example would be`"johnshopkins.edu:funder:8675309"` | +| policy | URI | URI of the [Policy](Policy.md) associated with the Funder | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* diff --git a/docs/dev/model/Grant.md b/docs/dev/model/Grant.md new file mode 100644 index 00000000..bd7d03bc --- /dev/null +++ b/docs/dev/model/Grant.md @@ -0,0 +1,32 @@ +# Grant + +Grants are imported from the institutional Grant system (COEUS in the case of JHU). They are associated with the Grant's PIs via their [User](User.md) records. Users of PASS can assign the Grants associated with them to [Submissions](Submission.md). + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Grant URI (autogenerated) | +| awardNumber* | String | Award number from funder | +| awardStatus | Enum ([_see list below_](#status-options)) | Status of award | +| localKey | String | A local key assigned to the Grant within the researcher's institution to support matching between PASS and a local system. The value is in the form of : `domain:type:value`. For a grant at JHU, an example would be`"johnshopkins.edu:grant:8675309"` | +| projectName* | String | Title of the research project | +| awardDate* | DateTime | Date the grant was awarded | +| startDate | DateTime | Date the grant started | +| endDate | DateTime | Date the grant ended | +| primaryFunder* | URI | URI of the [Funder](Funder.md) that is the original source of the funds. This will often be the same as directFunder. | +| directFunder* | URI | URI of the [funding](Funder.md) organization from which funds are directly received. This will often be the same as primaryFunder. | +| pi* | URI | URI of the [User](User.md) who is the Principal investigator | +| coPis | List[URI] | List of URIs of the [[User](User.md)] who are the co-principal investigators | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Status options + +Status options for grant + +| Value | Description | +| ------------- | ------------- | +| active | Grant currently active | +| pre_award | Award not yet received | +| terminated | Grant period is complete | diff --git a/docs/dev/model/Journal.md b/docs/dev/model/Journal.md new file mode 100644 index 00000000..66ccd395 --- /dev/null +++ b/docs/dev/model/Journal.md @@ -0,0 +1,27 @@ +# Journal + +A Journal is associated with a [Publication](Publication.md). In some cases, the Journal may be important for determining whether the [User](User.md) needs to manually create a [Submission](Submission.md) through PASS or whether the [Publisher](Publisher.md) has a pre-existing arrangement with the target [Repository](Repository.md). Specifically, in the case of the National Institutes of Health Public Access Policy, many Journals already make arrangements to submit the author's accepted manuscript to PubMed Central directly. + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Journal URI (autogenerated) | +| journalName* | String | Name of the journal | +| issns | List[String] | Journal ISSNs - Elements are of the form type:value, where type is one of Online or Print, and value is the usual ISSN value xxxx-xxxx. Examples would be Online:1234-5678 and Print:9876-5432. When a type for an ISSN is not known, it should be stored with an empty type (for example :2468-1357).| +| nlmta | String | National Library of Medicine Title Abbreviation | +| pmcParticipation | Enum ([see list below](#pmc-participation-options)) | This field indicates whether a journal participates in the NIH Public Access Program by sending final published article to PMC. If so, whether it requires additional processing fee. | +| publisher | URI | URI for the [Publisher](Publisher.md) of Journal | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## PMC Participation options + +These are the possible submission methods relating to PMC deposits. A full description of these methods can be found on the [NIH public access website](https://publicaccess.nih.gov/submit_process.htm) + +| Value | Description | +| ------------- | ------------- | +| A | PMC deposit route A. Journals automatically post the paper to PMC | +| B | PMC deposit route B. Authors must make special arrangements for some journals and publishers to post the paper directly to PMC | +| C | PMC deposit route C. Authors or their designee must submit manuscripts to NIHMS | +| D | PMC deposit route D. Some publishers will submit manuscripts to NIHMS | diff --git a/docs/dev/model/Policy.md b/docs/dev/model/Policy.md new file mode 100644 index 00000000..91158565 --- /dev/null +++ b/docs/dev/model/Policy.md @@ -0,0 +1,18 @@ +# Policy + +A Policy describes the access compliance requirements for a specific [Funder](Funder.md) or Institution. These Policies are used to determine which [Repositories](Repository.md) a [Publication](Publication.md) should be [submitted](Submission.md) to in order to be in compliance with its associated [Grants](Grant.md) and the User's institutional policies. + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Policy URI (autogenerated) | +| title* | String | Title of policy e.g. "NIH Public Access Policy" | +| description | String | Several sentence description of policy | +| policyUrl | URI | A link to the actual policy on the policy-owner's page | +| repositories* | List[URI] | List of URIs for [Repositories](Repository.md) that can satisfying this Policy | +| institution | URI | URI of the Institution whose Policy this is. For the first version of PASS, there will be no actual Institution model, this will be added at a later date, so if there is an institution assigned, it will always be JHU | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +_Note: this is basic at the moment. Eventually additional fields to help with application of policy logic could be added e.g. materialType to support data policies, some sense of whether the policy is required or can be overridden by complying with another policy etc._ diff --git a/docs/dev/model/Publication.md b/docs/dev/model/Publication.md new file mode 100644 index 00000000..ce0608e4 --- /dev/null +++ b/docs/dev/model/Publication.md @@ -0,0 +1,17 @@ +# Publication +Publication metadata to be associated with one or more [Submission](Submission.md) + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Submission URI (autogenerated) | +| title* | String | Title of work represented by Submission e.g. the title of the article | +| publicationAbstract | String | Abstract for work represented by Submission | +| doi | String | DOI of item being submitted, if available | +| pmid | String | PMID of item being submitted, if available | +| journal | URI | URI of [Journal](Journal.md) the Submission is part of (if article) | +| volume | String | Volume of journal that contains item (if article) | +| issue | String | Issue of journal that contains item (if article) | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* diff --git a/docs/dev/model/README.md b/docs/dev/model/README.md new file mode 100644 index 00000000..a27b366f --- /dev/null +++ b/docs/dev/model/README.md @@ -0,0 +1,26 @@ +# PASS Data Model + +In this project you will find +* [Model Objects](#model-objects) - a description of the fields for each object in the model +* [Model Diagram](#model-diagram) - a diagram showing the relationships between each object + +## Model Objects +The data model consists of the following components. Each is documented in full on its own page, you can see all of these pages in the [documentation](documentation/) folder + +* [Deposit](Deposit.md) +* [File](File.md) +* [Funder](Funder.md) +* [Grant](Grant.md) +* [Journal](Journal.md) +* [Policy](Policy.md) +* [Publication](Publication.md) +* [Repository](Repository.md) +* [RepositoryCopy](RepositoryCopy.md) +* [Submission](Submission.md) +* [SubmissionEvent](SubmissionEvent.md) +* [User](User.md) + +## Model Diagram + +![data model](pass_data_model.jpg) + diff --git a/docs/dev/model/README.md~ b/docs/dev/model/README.md~ new file mode 100644 index 00000000..00a81ac3 --- /dev/null +++ b/docs/dev/model/README.md~ @@ -0,0 +1,32 @@ +# PASS Data Model + +PASS provides a unified user interface that allow its users to deposit their manuscripts into multiple repositories as required by the associated funding agency's public access policies. + +In this project you will find +* [Model Objects](#model-objects) - a description of the fields for each object in the model +* [Model Diagram](#model-diagram) - a diagram showing the relationships between each object + +## Model Objects +The data model consists of the following components. Each is documented in full on its own page, you can see all of these pages in the [documentation](documentation/) folder + +* [Contributor](documentation/Contributor.md) +* [Deposit](documentation/Deposit.md) +* [File](documentation/File.md) +* [Funder](documentation/Funder.md) +* [Grant](documentation/Grant.md) +* [Journal](documentation/Journal.md) +* [Policy](documentation/Policy.md) +* [Publication](documentation/Publication.md) +* [Publisher](documentation/Publisher.md) +* [Repository](documentation/Repository.md) +* [RepositoryCopy](documentation/RepositoryCopy.md) +* [Submission](documentation/Submission.md) +* [SubmissionEvent](documentation/SubmissionEvent.md) +* [User](documentation/User.md) + +The system also automatically creates additional properties for each entity. These are documented in [System Properties](SystemProperties.md). + +## Model Diagram + +![data model](pass_data_model.jpg) + diff --git a/docs/dev/model/Repository.md b/docs/dev/model/Repository.md new file mode 100644 index 00000000..efd5522f --- /dev/null +++ b/docs/dev/model/Repository.md @@ -0,0 +1,42 @@ +# Repository + +A Repository is the target of a [Deposit](Deposit.md). It is a platform where [copies](RepositoryCopy.md) of [publications](Publication.md) can be [deposited](Deposit.md) in order to comply with [Funder](Funder.md) and institutional access [policies](Policy.md). + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Repository URI (autogenerated) | +| name* | String | Name of repository e.g. "PubMed Central" | +| description | String | Several sentence description of repository | +| url | URI | URL to the homepage of the repository so that PASS users can view the platform before deciding whether to participate in it | +| agreementText | String | The legal text that a `submitter` must agree to in order to submit a publication to this Repository | +| formSchema | String | _(deprecated- do not use this. Use `schema` instead)_ Stringified JSON representing a form template to be loaded by the front-end when this Repository is selected | +| integrationType | Enum ([_see list below_](#integration-type-options)) | Type of integration that PASS has with the Repository | +|repositoryKey | String | Key that is unique to this Repository instance within PASS. Used to look up the Repository when its URI is not available (e.g. prior to the creation of this Repository resource in Fedora). See below for a [_list of currently used keys_](#repository-key-values). | +| schemas | List[URI] | Contains a list of URLs that link to JSON schema documents describing the repository's metadata requirements | + + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Integration type options + +These are the possible types of integration a Repository can have with PASS. + +| Value | Description | +| --------------- | ------------- | +| full | PASS can make [Deposits](Deposit.md) to this Repository, and will received updates about its status | +| one-way | PASS can make [Deposits](Deposit.md) to this Repository but will not automatically receive updates about its status | +| web-link | A deposit cannot automatically be made to this Repository from PASS, only a web link can be created. | + +## Repository key values + +These are the repository keys currently used in PASS. This list will grow as more repositories are supported. + +| Value | Repository name | +| --------------- | ------------- | +| pmc | [PubMed Central](https://www.ncbi.nlm.nih.gov/pmc/) | +| jscholarship | [Johns Hopkins JScholarship](https://jscholarship.library.jhu.edu/) | +| eric | [Education Resources Information Center](https://eric.ed.gov/) (ERIC) | +| dec | [Development Experience Clearinghouse](https://dec.usaid.gov/dec/) (DEC) | +| dash | [Harvard DASH](https://dash.harvard.edu/) | diff --git a/docs/dev/model/RepositoryCopy.md b/docs/dev/model/RepositoryCopy.md new file mode 100644 index 00000000..33e7d326 --- /dev/null +++ b/docs/dev/model/RepositoryCopy.md @@ -0,0 +1,28 @@ +# Repository Copy + +A Repository Copy represents a copy of a [Publication](Publication.md) that exists in a target [Repository](Repository.md). The Repository Copy either (1) was the result of an accepted [Deposit](Deposit.md) from PASS, in which case there would be a link to the Copy from the related Deposit record, or (2) was created outside of PASS by some other process. In this second instance, the PASS system stores the information to help determine whether a Publication is already compliance. + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Repository Copy URI (autogenerated) | +| externalIds | List[String] | IDs assigned to this entity by the target repository | +| copyStatus* | Enum ([_see list below_](#copy-status-options)) | Status of the copy in the external repository's workflow | +| accessUrl | URI | URL to access the item in the repository, could allow Users to see the final result | +| publication* | URI | URI of the [Publication](Publication.md) that this is a copy of | +| repository* | URI | URI of the [Repository](Repository.md) being deposited to | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Copy status options + +These are the possible statuses for a Deposit in the order they could occur. Note that not all repositories will go through every status. + +| Value | Description | +| --------------- | ------------- | +| accepted | The target [Repository](Repository.md) has indicated that the Deposit has been accepted| +| in-progress | The target [Repository](Repository.md) is processing the files | +| stalled | The target [Repository](Repository.md) has detected a problem that has caused the progress to stall. This will likely require some direct interaction with the repository to re-initiate the process. Examples include, when there are incorrect files, or when a user did not respond to a validation request in a resonable time. | +| complete | The target [Repository](Repository.md) has accepted the files, and publication is pending if not already complete | +| rejected | The target [Repository](Repository.md) has rejected the files. | diff --git a/docs/dev/model/Submission.md b/docs/dev/model/Submission.md new file mode 100644 index 00000000..25792abb --- /dev/null +++ b/docs/dev/model/Submission.md @@ -0,0 +1,61 @@ +# Submission +In order to comply with [funder](Funder.md) and institutional access [policies](Policy.md), [Users](User.md) may be required to submit their [Publications](Publication.md) to one or more [Repositories](Repository.md). A Submission is associated with one `submitter` and one Publication. It encapsulates a User satisfying one or more Policies relevant to their Publication by either (1) [Deposits](Deposit.md) initiated in PASS or (2) [Copies](RepositoryCopy.md) of the publication that already exist in the target repositories. The User can start a Submission by describing their Publication and attaching relevant [Grants](Grant.md) to it. The PASS system will use this information to determine which policies apply, and will help the User send the Publication out to the Repositories that will fulfill them. + +Note that the source of a Submission record is not always a PASS User. In some instance, Submissions are created as a result of an import process designed to ensure that the User can see data relevant to their compliance with Policies in a uniform way. + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique Submission URI (autogenerated) | +| metadata | String | Stringified JSON representation of metadata captured by the relevant repository forms. This will hold extended metadata relevant to the repositories selected in the Submission workflow. It may include fields such as embargoEndDate, embargoText, pmid, and anything else required by specific repositories etc. | +| source* | Enum ([_see list below_](#source-options)) | Indicates whether the record came from outside of PASS as an import, or was created through the system | +| submitted* | boolean | When true, this value signals that the Submission will no longer be edited by the User. It indicates to Deposit services that it can generate Deposits for any Repositories that need one. This becomes "true" when the User clicks "submit" in the UI. For Submissions generated by loader processes this value will be false when the User must complete the Submission, or true if it is merely pointing to an existing copy of the Publication in a Repository. | +| submittedDate | DateTime | Date the record was submitted by the [User](User.md) through PASS | +| submissionStatus* | Enum ([_see list below_](#submission-status-options)) | The current status of the Submission, derived from the [Deposit](Deposit.md) status(es), [RepositoryCopy](RepositoryCopy.md) status(es) and the `eventType` of the most recent [SubmissionEvent](SubmissionEvent.md) | +| aggregatedDepositStatus | Enum ([_see list below_](#aggregated-deposit-status-options)) | Current combined status of Deposits, utilized by Deposit Services. The initial status of a new Submission will be "not-started". | +| publication* | URI | URI of Publication represented in this Submission | +| repositories* | List[URI] | A list of URIs for the Repositories that this Publication will exist in when the Submission is completed | +| submitter | URI | URI of the [User](User.md) responsible for submitting the Submission. The User will be the individual who either (a) created this Submission through PASS, thus claiming responsibility; (b) was designated as `submitter` by a `preparer`; or, (c) has been assigned the role based on their being PI of an associated [Grant](Grant.md). When this value is null, it indicates there is not yet a User record for the designated submitter. In this instance there should be a value in `submitterName` and `submitterEmail`. | +| submitterName | String | Name of submitter. This field is used when a preparer nominates a submitter that is not yet a PASS [User](User.md). The name is temporarily stored for use in communications with the submitter until a `User.id` is available. Once there is a URI for `submitter`, the `submitterName` should be null. | +| submitterEmail | URI | Email of submitter, formatted as a URI e.g. `mailto:first.last@example.com`. This field is used when a preparer nominates a submitter that is not yet a PASS [User](User.md). The email value is temporarily stored for use in communications with the submitter until a `User.id` is available. Once there is a URI for `submitter`, the `submitterEmail` should be null. | +| preparers | List[URI] | A list of URIs for the User(s) who prepared, or who could contribute to the preparation of, the Submission. Preparers can edit the content of the Submission (describe the [Publication](Publication.md), add [Grants](Grant.md), select [Repositories](Repository.md)) but cannot approve Repository agreements, or submit the publication - these tasks must be performed by the `submitter`. | +| grants | List[URI] | List of URIs [Grants](Grant.md) that are associated with the User and are relevant to the Publication being submitted | +| effectivePolicies | List[URI] | List URIs for [Policies](Policy.md) that will be satisfied via deposit through PASS | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Submission status options + +Below are the possible values for the `Submission.submissionStatus` field. They are listed in the order they would typically occur, and with an indication of the arrangement of the data that will result in this status. Note that not all Submissions will go through every status. + +| Value | Description | Data determining status | +| ------------------------ | ------------- |----------------------| +|draft|Newly created Submissions _by the UI_ will have this status by default. Only unsubmitted Submissions should have this status. Submissions created by other processes may use a different status.|Default status for Submissions newly created by a user interacting with the UI. +| manuscript-required | When the PASS system identifies a need for a User to submit a Publication to a particular Repository, it will create a new Submission record with this status in order to prompt the User to provide the document and complete the Submission. For example, PASS imports information from the NIH Public Access Compliance system, which contains information about out of compliance publications - these will appear in the PASS system for PI of the corresponding Grant with the label `manuscript-required`. | New Submissions of this type are created with this status already set | +| approval-requested | A Submission was prepared by a `preparer` but now needs the `submitter` to approve and submit it or provide feedback. | `Submission.submitted=false` and the most recent [SubmissionEvent](SubmissionEvent.md) has `eventType=approval-requested`. | +| changes-requested | A Submission was prepared by a `preparer`, but on review by the `submitter`, a change was requested. The Submission has been handed back to the `preparer` for editing. | `Submission.submitted=false` and the most recent [SubmissionEvent](SubmissionEvent.md) has `eventType=changes-requested`. | intermediate | +| cancelled | A Submission was prepared and then cancelled by the `submitter` or `preparer` without being submitted. No further edits can be made to the Submission. | `Submission.submitted=false` and the most recent [SubmissionEvent](SubmissionEvent.md) has `eventType=cancelled`. | +| submitted | The submit button has been pressed through the UI. From this status forward, the Submission becomes read-only to both the `submitter` and `preparers`. This status indicates that either (a) the Submission is still being processed, or (b) PASS has finished the Deposit process, but there is not yet confirmation from the Repository that indicates the Submission was valid. Some Submissions may remain in a `submitted` state indefinitely depending on PASS's capacity to verify completion of the process in the target [Repository](Repository.md). | `Submission.submitted=true`, and the Publication associated with the Submission is in a positive status for each Repository i.e. it's `RepositoryCopy.copyStatus` is not `rejected` or `stalled`, and in the absence of a RepositoryCopy, the `Deposit.depositStatus` is not `rejected`. | +| needs-attention | Indicates that a [User](User.md) action may be required outside of PASS. The Submission is stalled or has been rejected by one or more [Repository](Repository.md) | The `copyStatus` of one or more [RepositoryCopy](RepositoryCopy.md) for the Submission is `rejected` or `stalled`. In the absence of a `RepositoryCopy`, the [Deposit](Deposit.md) for that Repository has a `depositStatus` of `rejected`. To be clear, a positive status on the RepositoryCopy can override a negative status on the Deposit. | +| complete | The target repositories have all received a copy of the Submission, and have indicated that the Submission was successful. | There is a RepositoryCopy with `repoCopyStatus=complete` for each of the target repositories. | + +## Aggregated Deposit status options +These are the possible statuses for a Submission's aggregatedDepositStatus field. They are listed in the order they would occur. Note that not all Submissions will go through every status. + +| Value | Description | +| -------------------------- | ------------- | +| not-started | No [Deposits](Deposit.md) have been initiated for the Submission | +| in-progress | One or more [Deposits](Deposit.md) for the Submission have been initiated, and at least one has not reached a status of "accepted" or "rejected" | +| failed | One or more [Deposits](Deposit.md) for the Submission has a status of "failed" | +| accepted | All related [Deposits](Deposit.md) for the Submission have a status of "accepted" | +| rejected | One or more [Deposits](Deposit.md) for the Submission has a status of "rejected" | + +## Source options + +These are the possible sources of a Submission + +| Value | Description | +| ------------- | ------------- | +| pass | Submission record was created or submitted via the PASS user interface | +| other | Submission record was automatically created by harvesting and ingesting from a 3rd party service e.g. NIHMS | diff --git a/docs/dev/model/SubmissionEvent.md b/docs/dev/model/SubmissionEvent.md new file mode 100644 index 00000000..63ff3539 --- /dev/null +++ b/docs/dev/model/SubmissionEvent.md @@ -0,0 +1,38 @@ +# SubmissionEvent +The SubmissionEvent model captures significant events that are performed by an agent and occur against a [Submission](Submission.md). In the current implementation, the agent will be a PASS [User](User.md). The definition of "significant" will evolve depending on which events are useful to capture in order to e.g. trigger notifications, or form an audit trail. The events that are currently deemed significant for capture are documented under [`eventType`](#event-type-options). + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique SubmissionEvent URI (autogenerated) | +| eventType* | Enum ([_see list below_](#event-type-options)) | The type of event. | +| performedDate* | DateTime | Date the event was performed by the [User](User.md) | +| performedBy* | URI | URI of the [User](User.md) responsible for performing the event | +| performerRole | Enum ([_see list below_](#performer-role-options)) | Role of the person performing the event. | +| submission* | URI | URI of the [Submission](Submission.md) that the event relates to | +| comment | String | A comment relevant to the SubmissionEvent. For example, when a `changes-requested` event occurs, this might be added by the User through the UI to communicate what changes should be made. | +| link | URI | A resource relevant to the SubmissionEvent. For example, when a `changes-requested` event occurs, this may contain an Ember application URL to the affected Submission. | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Event type options + +The following describes the types of events that might be recorded as SubmissionEvents. + +| Value | Description | +| ------------------------ | ------------- | +| approval-requested-newuser | A Submission was prepared by a `preparer` on behalf of a person who does not yet have a [User](User.md) record in PASS. The `preparer` is requesting that the `submitter` join PASS and then approve and submit it or provide feedback. | +| approval-requested | A Submission was prepared by a `preparer` who is now requesting that the `submitter` approve and submit it or provide feedback. | +| changes-requested | A Submission was prepared by a `preparer`, but on review by the `submitter`, a change was requested. The Submission has been handed back to the `preparer` for editing. | +| cancelled | A Submission was prepared and then cancelled by the `submitter` or `preparer` without being submitted. No further edits can be made to the Submission. | +| submitted | The submit button has been pressed through the UI. | + +## Performer role options + +The following describe the roles of people who might perform a SubmissionEvent. + +| Value | Description | +| ------------------------ | ------------- | +| preparer | An individual who can prepare a Submission on behalf of another User - select the Publication, Repositories, Files, and Grants - but cannot approve the Repository agreements or submit the record for Deposit. | +| submitter | An individual responsible for a Submission. A person with this role can do all of the tasks that a `preparer` can do, but also approve any Repository agreements and submit the record for Deposit. | \ No newline at end of file diff --git a/docs/dev/model/SystemProperties.md b/docs/dev/model/SystemProperties.md new file mode 100644 index 00000000..21c09344 --- /dev/null +++ b/docs/dev/model/SystemProperties.md @@ -0,0 +1,10 @@ +# System Properties + +These properties are captured automatically for all entity types, but are not visible by default to client applications. They may be used for filtering and searching as needed. + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __createdBy__ | URI | URI of the [User](User.md) that created the record | +| __created__ | DateTime | Date the record was created | +| __lastModifiedBy__ | URI | URI of the [User](User.md) that last modified the record | +| __lastModified__ | DateTime | Date the record was last modified | diff --git a/docs/dev/model/User.md b/docs/dev/model/User.md new file mode 100644 index 00000000..5f10b001 --- /dev/null +++ b/docs/dev/model/User.md @@ -0,0 +1,30 @@ +# User + +A User of the PASS system. This includes prefered person information that can be used to autopopulate [Contributor](Contributor.md) records + +| Field | Type | Description | +| ------------- | ------------- | ------------- | +| __id*__ | URI | Unique User URI (autogenerated) | +| username* | String | Unique login name used by User | +| firstName | String | First name(s) of User | +| middleName | String | Middle name(s) of User | +| lastName | String | Last name(s) of User | +| displayName | String | Name for display. Separate names may not be available, but a person should always at least have a display name. | +| email | String | Contact email for User | +| affiliation | List[String] | The affiliation(s) of the User with their institution, for example `STAFF@inst.edu`. An institution may have multiple organizational units, and a User may have a different affiliation with any given OU. A User having an affiliation with multiple OUs in an institution would have multiple values, for example `FACULTY@medicine.inst.edu` and `STUDENT@engineering.inst.edu`. | +| locatorIds* | List[String] | A list of ids associated with the user by various system that PASS interacts with. The value of each entry would be in the form of : `domain:type:value`. For example, `["johnshopkins.edu:hopkinsid:DRA2D", "johnshopkins.edu:employeeid:12345", "johnshopkins.edu:jhed:bostaur1"]`. The following values for `type` are considered deprecated: `jhed`, `hopkinsid`. The preferred types are `eppn` and `unique-id`, respectively. | +| orcidId | String | ORCID ID for the User | +| roles* | List[Enum] ([_see list below_](#role-options)) | User roles | + +*required + +*Properties automatically generated by the system are documented in [System Properties](SystemProperties.md). These are not available to client tools by default.* + +## Role options + +Role options for User + +| Value | Description | +| ------------- | ------------- | +| submitter | User who can view and manage Submissions for personal Publications or those associated with their own Grants | +| admin | User who can manage Submissions for personal Publications or those associated with their own Grants, as well as view Submissions for all Grants | diff --git a/docs/dev/model/pass_data_model.jpg b/docs/dev/model/pass_data_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c705e82a6a8e56fde0bfacafb3e8d6a4ba26e38a GIT binary patch literal 47855 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 literal 0 HcmV?d00001