Skip to content

Commit c2aa418

Browse files
authored
Merge pull request #1300 from microbiomedata/issue-field-notes-128-submission-source
Add ability to track which client created a submission
2 parents 5047827 + 2b7038c commit c2aa418

File tree

4 files changed

+67
-1
lines changed

4 files changed

+67
-1
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""Add source_client column to submission_metadata table
2+
3+
Revision ID: b6e2cb2f8f36
4+
Revises: 6cdad9ad6543
5+
Create Date: 2024-07-17 22:52:01.118381
6+
7+
"""
8+
9+
from typing import Optional
10+
11+
import sqlalchemy as sa
12+
from alembic import op
13+
14+
# revision identifiers, used by Alembic.
15+
revision: str = "b6e2cb2f8f36"
16+
down_revision: Optional[str] = "6cdad9ad6543"
17+
branch_labels: Optional[str] = None
18+
depends_on: Optional[str] = None
19+
20+
21+
def upgrade():
22+
# The enum type must be created manually first. For some reason add_column
23+
# doesn't do it automatically.
24+
submissionsourceclient_enum = sa.Enum(
25+
"submission_portal", "field_notes", name="submissionsourceclient"
26+
)
27+
submissionsourceclient_enum.create(op.get_bind())
28+
29+
op.add_column(
30+
"submission_metadata",
31+
sa.Column(
32+
"source_client",
33+
submissionsourceclient_enum,
34+
nullable=True,
35+
),
36+
)
37+
38+
# Assume that all existing submissions were created by the submission portal
39+
op.execute("UPDATE submission_metadata SET source_client = 'submission_portal'")
40+
41+
op.create_unique_constraint(
42+
op.f("uq_submission_role_submission_id"), "submission_role", ["submission_id", "user_orcid"]
43+
)
44+
45+
46+
def downgrade():
47+
op.drop_constraint(op.f("uq_submission_role_submission_id"), "submission_role", type_="unique")
48+
op.drop_column("submission_metadata", "source_client")
49+
op.execute("DROP TYPE submissionsourceclient")

nmdc_server/models.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -770,6 +770,11 @@ class SubmissionEditorRole(str, enum.Enum):
770770
reviewer = "reviewer"
771771

772772

773+
class SubmissionSourceClient(str, enum.Enum):
774+
submission_portal = "submission_portal"
775+
field_notes = "field_notes"
776+
777+
773778
class SubmissionMetadata(Base):
774779
__tablename__ = "submission_metadata"
775780

@@ -780,6 +785,10 @@ class SubmissionMetadata(Base):
780785
metadata_submission = Column(JSONB, nullable=False)
781786
author_id = Column(UUID(as_uuid=True), ForeignKey(User.id))
782787

788+
# The client which initially created the submission. A null value indicates it was created by
789+
# an "unregistered" client. This could be legitimate usage, but it should be monitored.
790+
source_client = Column(Enum(SubmissionSourceClient), nullable=True)
791+
783792
author = relationship(
784793
"User", foreign_keys=[author_id], primaryjoin="SubmissionMetadata.author_id == User.id"
785794
)

nmdc_server/schemas_submission.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ class PartialMetadataSubmissionRecord(BaseModel):
9494
class SubmissionMetadataSchemaCreate(BaseModel):
9595
metadata_submission: MetadataSubmissionRecord
9696
status: Optional[str]
97+
source_client: Optional[str]
9798

9899

99100
class SubmissionMetadataSchemaPatch(BaseModel):

web/src/views/SubmissionPortal/store/api.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { AxiosResponse } from 'axios';
12
import { client, SearchParams, User } from '@/data/api';
23
import { HARMONIZER_TEMPLATES } from '../harmonizerApi';
34

@@ -45,6 +46,7 @@ interface MetadataSubmissionRecord {
4546
locked_by: User;
4647
lock_updated: string;
4748
permission_level: string | null;
49+
source_client: 'submission_portal' | 'field_notes' | null;
4850
}
4951

5052
interface PaginatedResponse<T> {
@@ -53,8 +55,13 @@ interface PaginatedResponse<T> {
5355
}
5456

5557
async function createRecord(record: MetadataSubmission) {
56-
const resp = await client.post<MetadataSubmissionRecord>('metadata_submission', {
58+
const resp = await client.post<
59+
MetadataSubmissionRecord,
60+
AxiosResponse<MetadataSubmissionRecord>,
61+
Partial<MetadataSubmissionRecord>
62+
>('metadata_submission', {
5763
metadata_submission: record,
64+
source_client: 'submission_portal',
5865
});
5966
return resp.data;
6067
}

0 commit comments

Comments
 (0)