diff --git a/src/published-data/published-data.v4.controller.ts b/src/published-data/published-data.v4.controller.ts index 6f25c91dc..e22aa54a6 100644 --- a/src/published-data/published-data.v4.controller.ts +++ b/src/published-data/published-data.v4.controller.ts @@ -6,6 +6,7 @@ import { Get, HttpException, HttpStatus, + Logger, NotFoundException, Param, Patch, @@ -26,6 +27,7 @@ import { } from "@nestjs/swagger"; import { Request } from "express"; import { Validator } from "jsonschema"; +import { cloneDeep, isArray } from "lodash"; import { FilterQuery, QueryOptions } from "mongoose"; import { firstValueFrom } from "rxjs"; import { AttachmentsService } from "src/attachments/attachments.service"; @@ -576,6 +578,7 @@ export class PublishedDataV4Controller { publishedData.status = data.status; await this.validateMetadata(publishedData.metadata); + await this.tryAddDateIssued(publishedData, publishedData.registeredTime); await Promise.all( publishedData.datasetPids.map(async (pid) => { @@ -633,7 +636,11 @@ export class PublishedDataV4Controller { const res = await this.publishedDataService.update( { doi: publishedData.doi }, - { status: PublishedDataStatus.REGISTERED, registeredTime: new Date() }, + { + status: PublishedDataStatus.REGISTERED, + registeredTime: publishedData.registeredTime, + metadata: publishedData.metadata, + }, ); return res; @@ -783,4 +790,30 @@ export class PublishedDataV4Controller { return registrationData; } + + private async tryAddDateIssued( + publishedData: PublishedData, + registeredTime: Date, + ) { + const originalMetadata = cloneDeep(publishedData.metadata); + try { + if (!publishedData.metadata) publishedData.metadata = {}; + publishedData.metadata.dates = publishedData.metadata.dates ?? []; + + if ( + isArray(publishedData.metadata.dates) && + !publishedData.metadata.dates.some((d) => d.dateType === "Issued") + ) { + publishedData.metadata.dates.push({ + date: registeredTime.toISOString(), + dateType: "Issued", + }); + } + await this.validateMetadata(publishedData.metadata); + } catch (validationError) { + // Restore original metadata if schema doesn't support DataCite dates + publishedData.metadata = originalMetadata; + Logger.warn(validationError, "failed to add data issued to metadata"); + } + } } diff --git a/test/jest-e2e-tests/publishedData.e2e-spec.ts b/test/jest-e2e-tests/publishedData.e2e-spec.ts index e4ab81a91..9e84119a8 100644 --- a/test/jest-e2e-tests/publishedData.e2e-spec.ts +++ b/test/jest-e2e-tests/publishedData.e2e-spec.ts @@ -86,6 +86,14 @@ describe.each([undefined, "", "https://api.test.datacite.org/dois"])( .then((res) => { expect(res.body.status).toEqual("registered"); expect(res.body.registeredTime).toBeDefined(); + expect(res.body.metadata.dates).toBeDefined(); + expect(Array.isArray(res.body.metadata.dates)).toBe(true); + expect(res.body.metadata.dates.length).toBe(1); + const issuedDate = res.body.metadata.dates.filter( + (d: { dateType: string }) => d.dateType === "Issued", + ); + expect(issuedDate.length).toBe(1); + expect(issuedDate[0].date).toEqual(res.body.registeredTime); }); });