From c8ad5fb7009e34ec1d13dacabe99f34c55eee8c7 Mon Sep 17 00:00:00 2001 From: shadrach Date: Tue, 7 Jan 2025 15:22:00 +0100 Subject: [PATCH] optional attestation publish during update --- .../controllers/admin/communities/index.ts | 29 ++++++++++-------- .../src/routes/v1/admin/communities/schema.ts | 1 + desci-server/src/services/Attestation.ts | 30 ++++++++++++++----- docker-compose.test.yml | 4 +-- 4 files changed, 42 insertions(+), 22 deletions(-) diff --git a/desci-server/src/controllers/admin/communities/index.ts b/desci-server/src/controllers/admin/communities/index.ts index d00fd460a..38e8c376c 100644 --- a/desci-server/src/controllers/admin/communities/index.ts +++ b/desci-server/src/controllers/admin/communities/index.ts @@ -272,7 +272,8 @@ export const createAttestation = async (req: Request, res: Response, _next: Next export const updateAttestation = async (req: Request, res: Response, _next: NextFunction) => { const body = req.body as Required['body']>; const { attestationId } = req.params as z.infer['params']; - logger.info({ attestationId, body }, 'Payload'); + const { publishNew } = req.body as z.infer['body']; + logger.info({ attestationId, publishNew, body }, 'Payload'); const exists = await attestationService.findAttestationById(Number(attestationId)); if (!exists) throw new NotFoundError(`Attestation ${attestationId} not found`); @@ -311,22 +312,26 @@ export const updateAttestation = async (req: Request, res: Response, _next: Next delete body.imageUrl; delete body.verifiedImageUrl; - // logger.info({ image_url, verified_image_url }, 'Assets'); - if (!image_url) throw new BadRequestError('No attestation image uploaded'); const isProtected = body.protected.toString() === 'true' ? true : false; const doiPrivilege = body.canMintDoi.toString() === 'true' ? true : false; const orcidPrivilege = body.canUpdateOrcid.toString() === 'true' ? true : false; - const attestation = await attestationService.updateAttestation(exists.id, { - ...body, - image_url, - verified_image_url, - communityId: exists.communityId, - protected: isProtected, - canMintDoi: doiPrivilege, - canUpdateOrcid: orcidPrivilege, - }); + logger.trace({ publishNew }, 'PUBLISH NEW'); + const publishNewVersion = publishNew?.toString() == 'false' ? false : true; + const attestation = await attestationService.updateAttestation( + exists.id, + { + ...body, + image_url, + verified_image_url, + communityId: exists.communityId, + protected: isProtected, + canMintDoi: doiPrivilege, + canUpdateOrcid: orcidPrivilege, + }, + publishNewVersion, + ); new SuccessResponse(attestation).send(res); }; diff --git a/desci-server/src/routes/v1/admin/communities/schema.ts b/desci-server/src/routes/v1/admin/communities/schema.ts index 0494645a8..7b41da239 100644 --- a/desci-server/src/routes/v1/admin/communities/schema.ts +++ b/desci-server/src/routes/v1/admin/communities/schema.ts @@ -67,6 +67,7 @@ export const addAttestationSchema = z.object({ export const updateAttestationSchema = addAttestationSchema.extend({ params: z.object({ attestationId: z.coerce.number(), communityId: z.coerce.number() }), + body: z.object({ publishNew: z.coerce.boolean().optional() }), }); export const addMemberSchema = z.object({ diff --git a/desci-server/src/services/Attestation.ts b/desci-server/src/services/Attestation.ts index 7d77d7d9c..8045f16bb 100644 --- a/desci-server/src/services/Attestation.ts +++ b/desci-server/src/services/Attestation.ts @@ -1,7 +1,7 @@ import assert from 'assert'; import { HighlightBlock } from '@desci-labs/desci-models'; -import { AnnotationType, Attestation, Node, Prisma, User } from '@prisma/client'; +import { AnnotationType, Attestation, AttestationVersion, Node, Prisma, User } from '@prisma/client'; import sgMail from '@sendgrid/mail'; import _ from 'lodash'; @@ -181,7 +181,7 @@ export class AttestationService { return prisma.attestationTemplate.create({ data: template }); } - async updateAttestation(attestationId: number, data: Prisma.AttestationUncheckedCreateInput) { + async updateAttestation(attestationId: number, data: Prisma.AttestationUncheckedCreateInput, publishNew = true) { const attestation = await this.findAttestationById(attestationId); if (!attestation) throw new AttestationNotFoundError(); @@ -194,12 +194,26 @@ export class AttestationService { canUpdateOrcid: data.canUpdateOrcid, }, }); - const attestationVersion = await this.#publishVersion({ - name: data.name as string, - description: data.description, - image_url: data.image_url, - attestationId: attestation.id, - }); + + let attestationVersion: AttestationVersion; + + if (publishNew) { + attestationVersion = await this.#publishVersion({ + name: data.name as string, + description: data.description, + image_url: data.image_url, + attestationId: attestation.id, + }); + } else { + const latestVersion = await prisma.attestationVersion.findFirst({ + where: { attestationId: attestation.id }, + orderBy: { createdAt: 'desc' }, + }); + attestationVersion = await prisma.attestationVersion.update({ + where: { id: latestVersion.id }, + data: { name: data.name as string, description: data.description, image_url: data.image_url }, + }); + } const communityEntryAttestation = await prisma.communityEntryAttestation.findFirst({ where: { attestationId: attestation.id }, diff --git a/docker-compose.test.yml b/docker-compose.test.yml index 6a271e3f6..589a4286c 100755 --- a/docker-compose.test.yml +++ b/docker-compose.test.yml @@ -34,8 +34,8 @@ services: condition: service_healthy nodes_test_ipfs: condition: service_started - nodes_test_repo_service: - condition: service_healthy + # nodes_test_repo_service: + # condition: service_healthy links: - nodes_test_db container_name: "nodes_backend_test"