From fc6c9000193920fcd3c97a68e72d93e50e6e25ca Mon Sep 17 00:00:00 2001 From: Electromorphous Date: Wed, 17 Jan 2024 18:28:51 +0530 Subject: [PATCH 01/15] add subtype to ResearchObjectV1Component --- desci-models/src/ResearchObject.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index b8c80c2dd..c832b80d7 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -50,6 +50,7 @@ export interface ResearchObjectV1Component { id: string; name: string; type: ResearchObjectComponentType | ResearchObjectComponentTypeMap; + subtype?: string; icon?: any; payload: any; primary?: boolean; From bcc8f3fad5504b2a34f8795ace450ae89b8b7565 Mon Sep 17 00:00:00 2001 From: m0ar Date: Sun, 7 Jan 2024 10:45:24 +0100 Subject: [PATCH 02/15] Fix seed.sh --- desci-contracts/scripts/seed.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desci-contracts/scripts/seed.sh b/desci-contracts/scripts/seed.sh index 6d0e0cf46..e7b5503d8 100755 --- a/desci-contracts/scripts/seed.sh +++ b/desci-contracts/scripts/seed.sh @@ -28,7 +28,7 @@ check() { done echo "[seed:$CONTRACT_NAME] deployment found, killing ganache..." - ps aux | grep ganache-cli | grep -v grep | awk '{print $2}' | xargs -r -t kill || echo "[seed:$CONTRACT_NAME] ganache not running" + pkill -f "npm exec ganache" || echo "[seed:$CONTRACT_NAME] ganache not running" echo "[seed:$CONTRACT_NAME] ganache killed" } From b7ff9f6711b00155d5c47733f81086afd56ee0c5 Mon Sep 17 00:00:00 2001 From: m0ar Date: Mon, 8 Jan 2024 10:47:08 +0100 Subject: [PATCH 03/15] Add ceramic service to compose, bump kubo version for dag-jose --- .ceramicDev.config.json | 35 +++++++++++++++++++++++++++++++++++ docker-compose.dev.yml | 30 +++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 .ceramicDev.config.json diff --git a/.ceramicDev.config.json b/.ceramicDev.config.json new file mode 100644 index 000000000..3f5d12749 --- /dev/null +++ b/.ceramicDev.config.json @@ -0,0 +1,35 @@ +{ + "anchor": { }, + "http-api": { + "cors-allowed-origins": [ + ".*" + ], + "admin-dids": [ + "did:key:z6MktbKJrMnhVJ37QFTo12911ycm2juKDUzWHDVETu9s5a9T" + ] + }, + "ipfs": { + "mode": "remote", + "host": "http://host.docker.internal:5001" + }, + "logger": { + "log-level": 2 + }, + "metrics": { + "metrics-exporter-enabled": false, + "metrics-port": 9090 + }, + "network": { + "name": "inmemory" + }, + "node": {}, + "state-store": { + "mode": "fs", + "local-directory": "/root/.ceramic/statestore" + }, + "indexing": { + "db": "postgres://walter:white@db_postgres:5432/postgres", + "allow-queries-before-historical-sync": true, + "models": [] + } +} diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 773a52bc9..c8957b6a2 100755 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -132,13 +132,22 @@ services: # EXPERIMENTAL_SUBGRAPH_VERSION_SWITCHING_MODE: synced ipfs: - image: ipfs/go-ipfs:v0.13.0 + image: ipfs/kubo:v0.24.0 container_name: "ipfs" environment: IPFS_SWARM_KEY: "/key/swarm/psk/1.0.0/\n/base16/\n9d002c50635a479d29dcc0ccb49d862952a0dcc52baddd253167adcd496c8d04" ports: - "5001:5001" - "8089:8080" + command: + # These are defaults from the go-ipfs dockerfile CMD + - "daemon" + - "--migrate=true" + - "--agent-version-suffix=docker" + # This is necessary before ceramic ships Recon, the new tip gossip protocol + - "--enable-pubsub-experiment" + extra_hosts: + - host.docker.internal:host-gateway volumes: - ./local-data/ipfs:/data/ipfs healthcheck: @@ -156,6 +165,25 @@ services: volumes: - ./local-data/redis:/data + ceramic: + image: ceramicnetwork/js-ceramic:3.2.0 + container_name: ceramic + ports: + - "7007:7007" + environment: + NODE_ENV: production + extra_hosts: + - host.docker.internal:host-gateway + volumes: + - ./local-data/ceramic/statestore:/root/.ceramic/statestore + - ./.ceramicDev.config.json:/root/.ceramic/daemon.config.json + depends_on: + ipfs: + condition: + service_healthy + db_postgres: + condition: + service_healthy # desci_nodes_backend_test: # container_name: 'be_test_boilerplate' From 4a1f7bead89aa289481e8da80e58b414cd267661 Mon Sep 17 00:00:00 2001 From: m0ar Date: Tue, 9 Jan 2024 10:51:04 +0100 Subject: [PATCH 04/15] Start keeping track of ceramic streamID's for published nodes --- .env.example | 5 +++- .../migration.sql | 2 ++ desci-server/prisma/schema.prisma | 1 + .../src/controllers/nodes/prepublish.ts | 3 ++ desci-server/src/controllers/nodes/publish.ts | 29 ++++++++++--------- desci-server/src/services/nodeManager.ts | 14 +++++++++ 6 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql diff --git a/.env.example b/.env.example index e42fb7261..a9764fab8 100755 --- a/.env.example +++ b/.env.example @@ -88,4 +88,7 @@ MEDIA_SECRET_KEY=supersecret ORCID_API_DOMAIN=https://api.sandbox.orcid.org ORCID_CLIENT_ID= -ORCID_CLIENT_SECRET= \ No newline at end of file +ORCID_CLIENT_SECRET= + +# Ceramic publish feature toggle +TOGGLE_CERAMIC= #1 diff --git a/desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql b/desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql new file mode 100644 index 000000000..aec2c14fe --- /dev/null +++ b/desci-server/prisma/migrations/20240110092031_add_ceramic_streamid_to_node/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "Node" ADD COLUMN "ceramicStream" TEXT; diff --git a/desci-server/prisma/schema.prisma b/desci-server/prisma/schema.prisma index 1d27a5e0c..dca84b18e 100755 --- a/desci-server/prisma/schema.prisma +++ b/desci-server/prisma/schema.prisma @@ -37,6 +37,7 @@ model Node { deletedAt DateTime? UploadJobs UploadJobs[] DraftNodeTree DraftNodeTree[] + ceramicStream String? @@index([ownerId]) @@index([uuid]) diff --git a/desci-server/src/controllers/nodes/prepublish.ts b/desci-server/src/controllers/nodes/prepublish.ts index 57fec0872..ba33cebc8 100644 --- a/desci-server/src/controllers/nodes/prepublish.ts +++ b/desci-server/src/controllers/nodes/prepublish.ts @@ -17,6 +17,7 @@ export interface PrepublishSuccessResponse { updatedManifestCid: string; updatedManifest: ResearchObjectV1; version?: NodeVersion; + ceramicStream?: string; } export interface PrepublishErrorResponse { @@ -38,6 +39,7 @@ export const prepublish = async (req: RequestWithNode, res: Response { - const { uuid, cid, manifest, transactionId, nodeVersionId } = req.body; +export const publish = async (req: Request, res: Response, _next: NextFunction) => { + const { uuid, cid, manifest, transactionId, nodeVersionId, ceramicStream } = req.body; // debugger; const email = (req as any).user.email; const logger = parentLogger.child({ @@ -93,6 +93,16 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = }, }); + if (process.env.TOGGLE_CERAMIC === "1") { + if (ceramicStream) { + logger.trace(`[ceramic] setting streamID on node`); + await setCeramicStream(uuid, ceramicStream); + } else { + // Likely feature toggle is active in backend, but not in frontend + logger.warn(`[ceramic] wanted to set streamID for ${node.uuid} but request did not contain one`) + } + }; + logger.trace(`[publish::publish] nodeUuid=${node.uuid}, manifestCid=${cid}, transaction=${transactionId}`); const cidsPayload = { @@ -187,16 +197,9 @@ export const publish = async (req: Request, res: Response, next: NextFunction) = ); // trigger ipfs storage upload, but don't wait for it to finish, will happen async - publishResearchObject(publicDataReferences).then(handleMirrorSuccess).catch(handleMirrorFail); - // Disabled bandaid fix, shouldn't be necessary if publish step handled correctly on frontend. - // .finally(async () => { - // await validateAndHealDataRefs({ - // nodeUuid: node.uuid!, - // manifestCid: cid, - // publicRefs: true, - // markExternals: true, - // }); - // }); + publishResearchObject(publicDataReferences) + .then(handleMirrorSuccess) + .catch(handleMirrorFail); /** * Save the cover art for this Node for later sharing: PDF -> JPG for this version diff --git a/desci-server/src/services/nodeManager.ts b/desci-server/src/services/nodeManager.ts index b1ae2c21d..e140db41a 100644 --- a/desci-server/src/services/nodeManager.ts +++ b/desci-server/src/services/nodeManager.ts @@ -54,6 +54,20 @@ export const createNodeDraftBlank = async ( return nodeCopy; }; +export const setCeramicStream = async (uuid: string, ceramicStream: string) => { + logger.debug({ fn: 'setCeramicStream', uuid, ceramicStream}, 'node::setCeramicStream'); + uuid = uuid.endsWith(".") ? uuid : uuid + "."; + return await prisma.node.update({ + + data: { + ceramicStream, + }, + where: { + uuid, + } + }); +}; + export const createPublicDataRefs = async ( data: Prisma.PublicDataReferenceCreateManyInput[], userId: number | undefined, From da011c6144f4310682f44ab2589af824282fd707 Mon Sep 17 00:00:00 2001 From: m0ar Date: Wed, 17 Jan 2024 16:15:28 +0100 Subject: [PATCH 05/15] Add ceramic notes to readme --- .env.example | 6 ++++-- README.md | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.env.example b/.env.example index a9764fab8..0ef66e1e3 100755 --- a/.env.example +++ b/.env.example @@ -90,5 +90,7 @@ ORCID_API_DOMAIN=https://api.sandbox.orcid.org ORCID_CLIENT_ID= ORCID_CLIENT_SECRET= -# Ceramic publish feature toggle -TOGGLE_CERAMIC= #1 +# Ceramic publish feature toggle, set to 1 for active +TOGGLE_CERAMIC= +# If above is set, clone `@desci-labs/desci-codex` and put the path to it here +CODEX_REPO_PATH= diff --git a/README.md b/README.md index c4ce87d14..ee3c683f2 100644 --- a/README.md +++ b/README.md @@ -112,6 +112,9 @@ This starts: 4. expedition explorer for local dev (http://localhost:3001) 5. graph index pointing to latest deployed contract (http://localhost:8080) 6. Local IPFS node (private, swarm key enabled) (http://localhost:5001 or http://localhost:8089) +7. Local Ceramic node, run `bootstrapCeramic.sh` to initialize (http://localhost:7007) + +**Note:** The Ceramic publish functionality needs to be activated by setting the corresponding environment variable, see `.env.example` for instructions. **Note:** nodes-media (http://localhost:5454, responsible for DOI / PDF downloads, and for media transcoding) is disabled in the dev cluster by default, but can be uncommented in `docker-compose.dev.yml` for local development
From 0bf26c4204b58150392eab8de95367e83d62af3a Mon Sep 17 00:00:00 2001 From: m0ar Date: Wed, 17 Jan 2024 16:34:52 +0100 Subject: [PATCH 06/15] Add bootstrapCeramic script --- bootstrapCeramic.sh | 60 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100755 bootstrapCeramic.sh diff --git a/bootstrapCeramic.sh b/bootstrapCeramic.sh new file mode 100755 index 000000000..1e37365e2 --- /dev/null +++ b/bootstrapCeramic.sh @@ -0,0 +1,60 @@ +#! /usr/bin/env bash + +# This script will try to find the `desci-codex` repo and run the +# model deployments. This yields a runtime definition file, which is +# necessary to instantiate the composeDB client used for publishing. +# +# This needs to be re-run when local-data is cleaned, as the models will +# get new streamIDs, and hence the runtime definition file is changed. +# +# There is no damage trying to run this multiple times in a row; it's +# idempotent. + +CTX="[bootstrapCeramic.sh]" + +set -euo pipefail +trap catch ERR +catch() { + echo "$CTX script failed" + exit 1 +} + +# Assert running from repo root +if [[ ! -f .env ]]; then + echo "$CTX Must run from repo root, aborting!" + exit 1 +fi + +# Assert desci-codex repo available +CODEX_REPO_PATH=$(grep "CODEX_REPO_PATH" .env | cut -d"=" -f2) +if [[ -z "$CODEX_REPO_PATH" ]]; then + echo "$CTX CODEX_REPO_PATH not set in .env, aborting!" + exit 1 +else + echo "$CTX Found codex repo path: $CODEX_REPO_PATH" +fi + +# Assert ceramic service is running +RUNNING_SERVICES=$(docker compose --project-name desci ps --services) +if ! grep -q ceramic <<<"$RUNNING_SERVICES"; then + echo "$CTX the ceramic compose service doesn't seem to be running, aborting!" + exit 1 +fi + +# Setup desci-codex and deploy composites +pushd "$CODEX_REPO_PATH" +if [[ ! -d "node_modules" ]]; then + echo "$CTX installing deps desci-codex..." + npm ci +fi + +echo "$CTX deploying composites..." +npm run --workspace packages/composedb deployComposites +popd + +echo "$CTX composites deployed! Copying composite runtime definition to local-data/ceramic..." +cp \ + "$CODEX_REPO_PATH/packages/composedb/src/__generated__/definition.js" \ + local-data/ceramic/definition.js + +echo "$CTX Done! Re-run this script if local state is cleaned." From 844c734a2d4d0a48f94d37a08c178e0ee6edb63f Mon Sep 17 00:00:00 2001 From: Electromorphous Date: Fri, 19 Jan 2024 00:56:51 +0530 Subject: [PATCH 07/15] remove subtype from researchobjectv1component and create subtypes for pdf, data, code, links types. --- desci-models/src/ResearchObject.ts | 33 ++++++++++++++++++++++++++---- 1 file changed, 29 insertions(+), 4 deletions(-) diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index c832b80d7..9decf4b9a 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -50,7 +50,6 @@ export interface ResearchObjectV1Component { id: string; name: string; type: ResearchObjectComponentType | ResearchObjectComponentTypeMap; - subtype?: string; icon?: any; payload: any; primary?: boolean; @@ -131,7 +130,7 @@ export enum ResearchObjectComponentType { LINK = "link", // external link } -export enum ResearchObjectComponentDocumentSubtype { +export enum ResearchObjectComponentDocumentSubtypeV1 { RESEARCH_ARTICLE = "research-article", PREREGISTERED_REPORT = "preregistered-report", PREREGISTERED_ANALYSIS_PLAN = "preregistered-analysis-plan", @@ -140,6 +139,25 @@ export enum ResearchObjectComponentDocumentSubtype { OTHER = "other", } +export enum ResearchObjectComponentDocumentSubtypeV2 { + AUTHOR_ACCEPTED = "author-accepted", + PREPRINT = "preprint", + REVIEW_REPORT = "review-report", +} + +export enum ResearchObjectComponentDataSubtype { + PROCESSED_DATA = "processed-data", + RAW_DATA = "raw-data", + IMAGE = "image", + OTHER = "other", +} + +export enum ResearchObjectComponentCodeSubtype { + CODE_SCRIPTS = "code-scripts", + SOFTWARE_PACKAGE = "software-package", + OTHER = "other", +} + export enum ResearchObjectComponentLinkSubtype { COMMUNITY_DISCUSSION = "community-discussion", VIDEO_RESOURCE = "video-resource", @@ -150,7 +168,10 @@ export enum ResearchObjectComponentLinkSubtype { } export type ResearchObjectComponentSubtypes = - | ResearchObjectComponentDocumentSubtype + | ResearchObjectComponentDocumentSubtypeV1 + | ResearchObjectComponentDocumentSubtypeV2 + | ResearchObjectComponentDataSubtype + | ResearchObjectComponentCodeSubtype | ResearchObjectComponentLinkSubtype; export interface CommonComponentPayload { @@ -200,7 +221,9 @@ export interface DataBucketComponentPayload { export interface PdfComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.PDF; - subtype?: ResearchObjectComponentDocumentSubtype; + subtype?: + | ResearchObjectComponentDocumentSubtypeV1 + | ResearchObjectComponentDocumentSubtypeV2; payload: PdfComponentPayload & CommonComponentPayload; } @@ -212,11 +235,13 @@ export interface ExternalLinkComponent extends ResearchObjectV1Component { export interface DataComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA; + subtype?: ResearchObjectComponentDataSubtype; payload: DataComponentPayload & DataComponentMetadata; } export interface CodeComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.CODE; + subtype?: ResearchObjectComponentCodeSubtype; payload: { language?: string; code?: string; From 7082987332a62585e257ca54d8c04ab6309c41c5 Mon Sep 17 00:00:00 2001 From: Sina Iman Date: Fri, 19 Jan 2024 06:20:05 -0800 Subject: [PATCH 08/15] change v1 -> '' --- desci-models/package.json | 2 +- desci-models/src/ResearchObject.ts | 115 ++++++++++++++--------------- 2 files changed, 55 insertions(+), 62 deletions(-) diff --git a/desci-models/package.json b/desci-models/package.json index 6df411409..98803eefd 100644 --- a/desci-models/package.json +++ b/desci-models/package.json @@ -1,6 +1,6 @@ { "name": "@desci-labs/desci-models", - "version": "0.1.22", + "version": "0.2.0", "description": "Data models for DeSci Nodes", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index 9decf4b9a..27248cf58 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -12,11 +12,11 @@ export interface ResearchObjectPreviewResult { } export interface IpldUrl { - ["/"]: string; + ['/']: string; } export interface ResearchObjectV1 extends ResearchObject { - version: "desci-nodes-0.1.0" | "desci-nodes-0.2.0" | 1; + version: 'desci-nodes-0.1.0' | 'desci-nodes-0.2.0' | 1; title?: string; description?: string; defaultLicense?: string; @@ -80,12 +80,12 @@ export interface ResearchObjectTransaction { } export enum ResearchObjectValidationType { - GRANT = "grant", - REVIEW = "review", - CONFERENCE = "conference", - AUDIT = "audit", - CERTIFICATION = "certification", - CERTIFICATION_ARC = "certification-arc", + GRANT = 'grant', + REVIEW = 'review', + CONFERENCE = 'conference', + AUDIT = 'audit', + CERTIFICATION = 'certification', + CERTIFICATION_ARC = 'certification-arc', } export interface ResearchObjectValidationDeposit { token: string; @@ -105,13 +105,13 @@ export interface ResearchObjectV1Validation { } export enum ResearchObjectAttributeKey { - ACM_AVAILABLE = "available", - ACM_FUNCTIONAL = "functional", - ACM_REUSABLE = "reusable", - ACM_REPRODUCED = "reproduced", - ACM_REPLICATED = "replicated", - AUTHORSHIP_VERIFIED = "authorship-verified", - COMPUTATIONAL_REPRODUCIBILITY = "computational-reproducibility", + ACM_AVAILABLE = 'available', + ACM_FUNCTIONAL = 'functional', + ACM_REUSABLE = 'reusable', + ACM_REPRODUCED = 'reproduced', + ACM_REPLICATED = 'replicated', + AUTHORSHIP_VERIFIED = 'authorship-verified', + COMPUTATIONAL_REPRODUCIBILITY = 'computational-reproducibility', } export interface ResearchObjectV1Attributes { @@ -120,55 +120,55 @@ export interface ResearchObjectV1Attributes { } export enum ResearchObjectComponentType { - DATA_BUCKET = "data-bucket", - UNKNOWN = "unknown", - PDF = "pdf", - CODE = "code", - VIDEO = "video", - TERMINAL = "terminal", // not used, TODO: remove - DATA = "data", - LINK = "link", // external link + DATA_BUCKET = 'data-bucket', + UNKNOWN = 'unknown', + PDF = 'pdf', + CODE = 'code', + VIDEO = 'video', + TERMINAL = 'terminal', // not used, TODO: remove + DATA = 'data', + LINK = 'link', // external link } -export enum ResearchObjectComponentDocumentSubtypeV1 { - RESEARCH_ARTICLE = "research-article", - PREREGISTERED_REPORT = "preregistered-report", - PREREGISTERED_ANALYSIS_PLAN = "preregistered-analysis-plan", - SUPPLEMENTARY_INFORMATION = "supplementary-information", - PRESENTATION_DECK = "presentation-deck", - OTHER = "other", +export enum ResearchObjectComponentDocumentSubtype { + RESEARCH_ARTICLE = 'research-article', + PREREGISTERED_REPORT = 'preregistered-report', + PREREGISTERED_ANALYSIS_PLAN = 'preregistered-analysis-plan', + SUPPLEMENTARY_INFORMATION = 'supplementary-information', + PRESENTATION_DECK = 'presentation-deck', + OTHER = 'other', } export enum ResearchObjectComponentDocumentSubtypeV2 { - AUTHOR_ACCEPTED = "author-accepted", - PREPRINT = "preprint", - REVIEW_REPORT = "review-report", + AUTHOR_ACCEPTED = 'author-accepted', + PREPRINT = 'preprint', + REVIEW_REPORT = 'review-report', } export enum ResearchObjectComponentDataSubtype { - PROCESSED_DATA = "processed-data", - RAW_DATA = "raw-data", - IMAGE = "image", - OTHER = "other", + PROCESSED_DATA = 'processed-data', + RAW_DATA = 'raw-data', + IMAGE = 'image', + OTHER = 'other', } export enum ResearchObjectComponentCodeSubtype { - CODE_SCRIPTS = "code-scripts", - SOFTWARE_PACKAGE = "software-package", - OTHER = "other", + CODE_SCRIPTS = 'code-scripts', + SOFTWARE_PACKAGE = 'software-package', + OTHER = 'other', } export enum ResearchObjectComponentLinkSubtype { - COMMUNITY_DISCUSSION = "community-discussion", - VIDEO_RESOURCE = "video-resource", - EXTERNAL_API = "external-api", - RESTRICTED_DATA = "restricted", - PRESENTATION_DECK = "presentation-deck", - OTHER = "other", + COMMUNITY_DISCUSSION = 'community-discussion', + VIDEO_RESOURCE = 'video-resource', + EXTERNAL_API = 'external-api', + RESTRICTED_DATA = 'restricted', + PRESENTATION_DECK = 'presentation-deck', + OTHER = 'other', } export type ResearchObjectComponentSubtypes = - | ResearchObjectComponentDocumentSubtypeV1 + | ResearchObjectComponentDocumentSubtype | ResearchObjectComponentDocumentSubtypeV2 | ResearchObjectComponentDataSubtype | ResearchObjectComponentCodeSubtype @@ -211,8 +211,8 @@ export interface DataComponentPayload { export interface DataBucketComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA_BUCKET; - id: "root"; - name: "root"; + id: 'root'; + name: 'root'; payload: DataBucketComponentPayload; } export interface DataBucketComponentPayload { @@ -221,9 +221,7 @@ export interface DataBucketComponentPayload { export interface PdfComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.PDF; - subtype?: - | ResearchObjectComponentDocumentSubtypeV1 - | ResearchObjectComponentDocumentSubtypeV2; + subtype?: ResearchObjectComponentDocumentSubtype | ResearchObjectComponentDocumentSubtypeV2; payload: PdfComponentPayload & CommonComponentPayload; } @@ -273,9 +271,7 @@ export interface Scaled { pageIndex?: number; } -export interface PdfAnnotation - extends ResearchObjectComponentAnnotation, - Scaled { +export interface PdfAnnotation extends ResearchObjectComponentAnnotation, Scaled { move?: boolean; text?: string; title?: string; @@ -290,8 +286,8 @@ export interface ResearchObjectComponentAnnotation { } export enum ResearchObjectV1AuthorRole { - AUTHOR = "Author", - NODE_STEWARD = "Node Steward", + AUTHOR = 'Author', + NODE_STEWARD = 'Node Steward', } /** @@ -303,8 +299,5 @@ export enum ResearchObjectV1AuthorRole { * '.pdf': ResearchObjectComponentType.PDF * } */ -export type ResearchObjectComponentTypeMap = Record< - FileExtension, - ResearchObjectComponentType ->; +export type ResearchObjectComponentTypeMap = Record; export type FileExtension = string; From f0c5924da9b803c35313b51ae7c9545b040686f0 Mon Sep 17 00:00:00 2001 From: Sina Iman Date: Fri, 19 Jan 2024 06:29:40 -0800 Subject: [PATCH 09/15] session affinity /id --- desci-server/src/server.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/desci-server/src/server.ts b/desci-server/src/server.ts index b6b0a2174..67630079b 100644 --- a/desci-server/src/server.ts +++ b/desci-server/src/server.ts @@ -169,8 +169,8 @@ class AppServer { this.app.get('/readyz', (_, res) => { res.status(200).json({ status: 'ok' }); }); - this.app.get('/id', (_, res) => { - res.status(200).json({ id: serverUuid }); + this.app.get('/id', (req, res) => { + res.status(200).json({ id: serverUuid, affinity: req.headers['stickie-dev-ingress61'] }); }); this.app.get('/orcid', orcidConnect); this.app.post('/orcid/next', [ensureUserIfPresent], orcidCheck()); From 0b711b557f6fadcca1508242180da71432f523be Mon Sep 17 00:00:00 2001 From: Sina Iman Date: Fri, 19 Jan 2024 06:30:44 -0800 Subject: [PATCH 10/15] use cookies --- desci-server/src/server.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desci-server/src/server.ts b/desci-server/src/server.ts index 67630079b..5fda85bda 100644 --- a/desci-server/src/server.ts +++ b/desci-server/src/server.ts @@ -170,7 +170,7 @@ class AppServer { res.status(200).json({ status: 'ok' }); }); this.app.get('/id', (req, res) => { - res.status(200).json({ id: serverUuid, affinity: req.headers['stickie-dev-ingress61'] }); + res.status(200).json({ id: serverUuid, affinity: req.cookies['stickie-dev-ingress61'] }); }); this.app.get('/orcid', orcidConnect); this.app.post('/orcid/next', [ensureUserIfPresent], orcidCheck()); From a6bab05b16741c17d54d150beff374e888f33076 Mon Sep 17 00:00:00 2001 From: Electromorphous Date: Mon, 22 Jan 2024 18:46:45 +0530 Subject: [PATCH 11/15] remove ResearchObjectComponentDocumentSubtypeV2 and update subtypes --- desci-models/src/ResearchObject.ts | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index 9decf4b9a..550b605ab 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -130,19 +130,17 @@ export enum ResearchObjectComponentType { LINK = "link", // external link } -export enum ResearchObjectComponentDocumentSubtypeV1 { +export enum ResearchObjectComponentDocumentSubtype { RESEARCH_ARTICLE = "research-article", PREREGISTERED_REPORT = "preregistered-report", PREREGISTERED_ANALYSIS_PLAN = "preregistered-analysis-plan", SUPPLEMENTARY_INFORMATION = "supplementary-information", PRESENTATION_DECK = "presentation-deck", - OTHER = "other", -} - -export enum ResearchObjectComponentDocumentSubtypeV2 { AUTHOR_ACCEPTED = "author-accepted", PREPRINT = "preprint", REVIEW_REPORT = "review-report", + MANUSCRIPT = "manuscript", + OTHER = "other", } export enum ResearchObjectComponentDataSubtype { @@ -168,8 +166,7 @@ export enum ResearchObjectComponentLinkSubtype { } export type ResearchObjectComponentSubtypes = - | ResearchObjectComponentDocumentSubtypeV1 - | ResearchObjectComponentDocumentSubtypeV2 + | ResearchObjectComponentDocumentSubtype | ResearchObjectComponentDataSubtype | ResearchObjectComponentCodeSubtype | ResearchObjectComponentLinkSubtype; @@ -222,26 +219,32 @@ export interface DataBucketComponentPayload { export interface PdfComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.PDF; subtype?: - | ResearchObjectComponentDocumentSubtypeV1 - | ResearchObjectComponentDocumentSubtypeV2; + | ResearchObjectComponentDocumentSubtype + | ResearchObjectComponentType.PDF; payload: PdfComponentPayload & CommonComponentPayload; } export interface ExternalLinkComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.LINK; - subtype?: ResearchObjectComponentLinkSubtype; + subtype?: + | ResearchObjectComponentLinkSubtype + | ResearchObjectComponentType.LINK; payload: ExternalLinkComponentPayload & CommonComponentPayload; } export interface DataComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA; - subtype?: ResearchObjectComponentDataSubtype; + subtype?: + | ResearchObjectComponentDataSubtype + | ResearchObjectComponentType.DATA; payload: DataComponentPayload & DataComponentMetadata; } export interface CodeComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.CODE; - subtype?: ResearchObjectComponentCodeSubtype; + subtype?: + | ResearchObjectComponentCodeSubtype + | ResearchObjectComponentType.CODE; payload: { language?: string; code?: string; From a9bd92f4c5224227e034b9c80440cf329326ff55 Mon Sep 17 00:00:00 2001 From: Electromorphous Date: Mon, 22 Jan 2024 19:47:21 +0530 Subject: [PATCH 12/15] include types in ResearchObjectComponentSubtypes --- desci-models/src/ResearchObject.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index 550b605ab..f1e6096cb 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -169,7 +169,11 @@ export type ResearchObjectComponentSubtypes = | ResearchObjectComponentDocumentSubtype | ResearchObjectComponentDataSubtype | ResearchObjectComponentCodeSubtype - | ResearchObjectComponentLinkSubtype; + | ResearchObjectComponentLinkSubtype + | ResearchObjectComponentType.PDF + | ResearchObjectComponentType.DATA + | ResearchObjectComponentType.CODE + | ResearchObjectComponentType.LINK; export interface CommonComponentPayload { title?: string; From 930a4a5ea7bb832de480aa0b835dccf8cb16609b Mon Sep 17 00:00:00 2001 From: kadami Date: Mon, 22 Jan 2024 22:33:46 +0700 Subject: [PATCH 13/15] chore: move in formatter files from desci-server to desci-models --- desci-models/.prettierignore | 1 + desci-models/.prettierrc | 6 ++ desci-models/src/ResearchObject.ts | 125 +++++++++++++---------------- 3 files changed, 63 insertions(+), 69 deletions(-) create mode 100755 desci-models/.prettierignore create mode 100755 desci-models/.prettierrc diff --git a/desci-models/.prettierignore b/desci-models/.prettierignore new file mode 100755 index 000000000..53c37a166 --- /dev/null +++ b/desci-models/.prettierignore @@ -0,0 +1 @@ +dist \ No newline at end of file diff --git a/desci-models/.prettierrc b/desci-models/.prettierrc new file mode 100755 index 000000000..6599520f8 --- /dev/null +++ b/desci-models/.prettierrc @@ -0,0 +1,6 @@ +{ + "printWidth": 120, + "semi": true, + "singleQuote": true, + "trailingComma": "all" +} diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index f1e6096cb..5f62a0906 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -12,11 +12,11 @@ export interface ResearchObjectPreviewResult { } export interface IpldUrl { - ["/"]: string; + ['/']: string; } export interface ResearchObjectV1 extends ResearchObject { - version: "desci-nodes-0.1.0" | "desci-nodes-0.2.0" | 1; + version: 'desci-nodes-0.1.0' | 'desci-nodes-0.2.0' | 1; title?: string; description?: string; defaultLicense?: string; @@ -80,12 +80,12 @@ export interface ResearchObjectTransaction { } export enum ResearchObjectValidationType { - GRANT = "grant", - REVIEW = "review", - CONFERENCE = "conference", - AUDIT = "audit", - CERTIFICATION = "certification", - CERTIFICATION_ARC = "certification-arc", + GRANT = 'grant', + REVIEW = 'review', + CONFERENCE = 'conference', + AUDIT = 'audit', + CERTIFICATION = 'certification', + CERTIFICATION_ARC = 'certification-arc', } export interface ResearchObjectValidationDeposit { token: string; @@ -105,13 +105,13 @@ export interface ResearchObjectV1Validation { } export enum ResearchObjectAttributeKey { - ACM_AVAILABLE = "available", - ACM_FUNCTIONAL = "functional", - ACM_REUSABLE = "reusable", - ACM_REPRODUCED = "reproduced", - ACM_REPLICATED = "replicated", - AUTHORSHIP_VERIFIED = "authorship-verified", - COMPUTATIONAL_REPRODUCIBILITY = "computational-reproducibility", + ACM_AVAILABLE = 'available', + ACM_FUNCTIONAL = 'functional', + ACM_REUSABLE = 'reusable', + ACM_REPRODUCED = 'reproduced', + ACM_REPLICATED = 'replicated', + AUTHORSHIP_VERIFIED = 'authorship-verified', + COMPUTATIONAL_REPRODUCIBILITY = 'computational-reproducibility', } export interface ResearchObjectV1Attributes { @@ -120,49 +120,49 @@ export interface ResearchObjectV1Attributes { } export enum ResearchObjectComponentType { - DATA_BUCKET = "data-bucket", - UNKNOWN = "unknown", - PDF = "pdf", - CODE = "code", - VIDEO = "video", - TERMINAL = "terminal", // not used, TODO: remove - DATA = "data", - LINK = "link", // external link + DATA_BUCKET = 'data-bucket', + UNKNOWN = 'unknown', + PDF = 'pdf', + CODE = 'code', + VIDEO = 'video', + TERMINAL = 'terminal', // not used, TODO: remove + DATA = 'data', + LINK = 'link', // external link } export enum ResearchObjectComponentDocumentSubtype { - RESEARCH_ARTICLE = "research-article", - PREREGISTERED_REPORT = "preregistered-report", - PREREGISTERED_ANALYSIS_PLAN = "preregistered-analysis-plan", - SUPPLEMENTARY_INFORMATION = "supplementary-information", - PRESENTATION_DECK = "presentation-deck", - AUTHOR_ACCEPTED = "author-accepted", - PREPRINT = "preprint", - REVIEW_REPORT = "review-report", - MANUSCRIPT = "manuscript", - OTHER = "other", + RESEARCH_ARTICLE = 'research-article', + PREREGISTERED_REPORT = 'preregistered-report', + PREREGISTERED_ANALYSIS_PLAN = 'preregistered-analysis-plan', + SUPPLEMENTARY_INFORMATION = 'supplementary-information', + PRESENTATION_DECK = 'presentation-deck', + AUTHOR_ACCEPTED = 'author-accepted', + PREPRINT = 'preprint', + REVIEW_REPORT = 'review-report', + MANUSCRIPT = 'manuscript', + OTHER = 'other', } export enum ResearchObjectComponentDataSubtype { - PROCESSED_DATA = "processed-data", - RAW_DATA = "raw-data", - IMAGE = "image", - OTHER = "other", + PROCESSED_DATA = 'processed-data', + RAW_DATA = 'raw-data', + IMAGE = 'image', + OTHER = 'other', } export enum ResearchObjectComponentCodeSubtype { - CODE_SCRIPTS = "code-scripts", - SOFTWARE_PACKAGE = "software-package", - OTHER = "other", + CODE_SCRIPTS = 'code-scripts', + SOFTWARE_PACKAGE = 'software-package', + OTHER = 'other', } export enum ResearchObjectComponentLinkSubtype { - COMMUNITY_DISCUSSION = "community-discussion", - VIDEO_RESOURCE = "video-resource", - EXTERNAL_API = "external-api", - RESTRICTED_DATA = "restricted", - PRESENTATION_DECK = "presentation-deck", - OTHER = "other", + COMMUNITY_DISCUSSION = 'community-discussion', + VIDEO_RESOURCE = 'video-resource', + EXTERNAL_API = 'external-api', + RESTRICTED_DATA = 'restricted', + PRESENTATION_DECK = 'presentation-deck', + OTHER = 'other', } export type ResearchObjectComponentSubtypes = @@ -212,8 +212,8 @@ export interface DataComponentPayload { export interface DataBucketComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA_BUCKET; - id: "root"; - name: "root"; + id: 'root'; + name: 'root'; payload: DataBucketComponentPayload; } export interface DataBucketComponentPayload { @@ -222,33 +222,25 @@ export interface DataBucketComponentPayload { export interface PdfComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.PDF; - subtype?: - | ResearchObjectComponentDocumentSubtype - | ResearchObjectComponentType.PDF; + subtype?: ResearchObjectComponentDocumentSubtype | ResearchObjectComponentType.PDF; payload: PdfComponentPayload & CommonComponentPayload; } export interface ExternalLinkComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.LINK; - subtype?: - | ResearchObjectComponentLinkSubtype - | ResearchObjectComponentType.LINK; + subtype?: ResearchObjectComponentLinkSubtype | ResearchObjectComponentType.LINK; payload: ExternalLinkComponentPayload & CommonComponentPayload; } export interface DataComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA; - subtype?: - | ResearchObjectComponentDataSubtype - | ResearchObjectComponentType.DATA; + subtype?: ResearchObjectComponentDataSubtype | ResearchObjectComponentType.DATA; payload: DataComponentPayload & DataComponentMetadata; } export interface CodeComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.CODE; - subtype?: - | ResearchObjectComponentCodeSubtype - | ResearchObjectComponentType.CODE; + subtype?: ResearchObjectComponentCodeSubtype | ResearchObjectComponentType.CODE; payload: { language?: string; code?: string; @@ -280,9 +272,7 @@ export interface Scaled { pageIndex?: number; } -export interface PdfAnnotation - extends ResearchObjectComponentAnnotation, - Scaled { +export interface PdfAnnotation extends ResearchObjectComponentAnnotation, Scaled { move?: boolean; text?: string; title?: string; @@ -297,8 +287,8 @@ export interface ResearchObjectComponentAnnotation { } export enum ResearchObjectV1AuthorRole { - AUTHOR = "Author", - NODE_STEWARD = "Node Steward", + AUTHOR = 'Author', + NODE_STEWARD = 'Node Steward', } /** @@ -310,8 +300,5 @@ export enum ResearchObjectV1AuthorRole { * '.pdf': ResearchObjectComponentType.PDF * } */ -export type ResearchObjectComponentTypeMap = Record< - FileExtension, - ResearchObjectComponentType ->; +export type ResearchObjectComponentTypeMap = Record; export type FileExtension = string; From faae889d797bdf995a827be142f5182b1033c94e Mon Sep 17 00:00:00 2001 From: Electromorphous Date: Mon, 22 Jan 2024 21:09:10 +0530 Subject: [PATCH 14/15] remote types from subtypes --- desci-models/src/ResearchObject.ts | 22 +++++----------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/desci-models/src/ResearchObject.ts b/desci-models/src/ResearchObject.ts index f1e6096cb..cff57fd97 100644 --- a/desci-models/src/ResearchObject.ts +++ b/desci-models/src/ResearchObject.ts @@ -169,11 +169,7 @@ export type ResearchObjectComponentSubtypes = | ResearchObjectComponentDocumentSubtype | ResearchObjectComponentDataSubtype | ResearchObjectComponentCodeSubtype - | ResearchObjectComponentLinkSubtype - | ResearchObjectComponentType.PDF - | ResearchObjectComponentType.DATA - | ResearchObjectComponentType.CODE - | ResearchObjectComponentType.LINK; + | ResearchObjectComponentLinkSubtype; export interface CommonComponentPayload { title?: string; @@ -222,33 +218,25 @@ export interface DataBucketComponentPayload { export interface PdfComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.PDF; - subtype?: - | ResearchObjectComponentDocumentSubtype - | ResearchObjectComponentType.PDF; + subtype?: ResearchObjectComponentDocumentSubtype; payload: PdfComponentPayload & CommonComponentPayload; } export interface ExternalLinkComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.LINK; - subtype?: - | ResearchObjectComponentLinkSubtype - | ResearchObjectComponentType.LINK; + subtype?: ResearchObjectComponentLinkSubtype; payload: ExternalLinkComponentPayload & CommonComponentPayload; } export interface DataComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.DATA; - subtype?: - | ResearchObjectComponentDataSubtype - | ResearchObjectComponentType.DATA; + subtype?: ResearchObjectComponentDataSubtype; payload: DataComponentPayload & DataComponentMetadata; } export interface CodeComponent extends ResearchObjectV1Component { type: ResearchObjectComponentType.CODE; - subtype?: - | ResearchObjectComponentCodeSubtype - | ResearchObjectComponentType.CODE; + subtype?: ResearchObjectComponentCodeSubtype; payload: { language?: string; code?: string; From 2565b9bffb1313601ea0be365faca5317fefa789 Mon Sep 17 00:00:00 2001 From: Sina Iman Date: Mon, 22 Jan 2024 11:32:47 -0800 Subject: [PATCH 15/15] bump models --- desci-models/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/desci-models/package.json b/desci-models/package.json index 98803eefd..be668473e 100644 --- a/desci-models/package.json +++ b/desci-models/package.json @@ -1,6 +1,6 @@ { "name": "@desci-labs/desci-models", - "version": "0.2.0", + "version": "0.2.1", "description": "Data models for DeSci Nodes", "main": "dist/index.js", "types": "dist/index.d.ts",