Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 2 additions & 47 deletions src/common/handlebars-helpers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
*
* Helpers should be registered in app.module.ts
*/
import { JobClass } from "src/jobs/schemas/job.schema";
import { JobParams } from "src/jobs/types/job-types.enum";
import { mapJobClassV4toV3 } from "src/jobs/job-v3-mappings";

/**
* Convert json objects to HTML
Expand Down Expand Up @@ -70,50 +69,6 @@ export const jsonify = (context: unknown): string => {
return JSON.stringify(context, null, 3);
};

type DatasetIdV3 = {
pid: string;
files: string[];
};
interface JobV3 {
id: string;
emailJobInitiator?: string;
type: string;
creationTime: Date;
executionTime?: Date;
jobParams: Record<string, unknown>;
jobStatusMessage?: string;
datasetList: DatasetIdV3[];
jobResultObject?: unknown;
}

/**
* Convert a current job to follow the old v3 schema.
*
* Useful as a shim for backwards compatibility with old archive systems.
*
* Example: '{{{ jsonify (job_v3 this) }}}'
* @param context
*/
export const job_v3 = (job: JobClass): JobV3 => {
let datasetList: DatasetIdV3[] = [];
if (JobParams.DatasetList in job.jobParams) {
datasetList = job.jobParams[JobParams.DatasetList] as DatasetIdV3[];
}
return {
id: job.id || job._id,
emailJobInitiator: job.contactEmail,
type: job.type,
creationTime: job.createdAt,
jobParams: {
...job.jobParams,
username: job.createdBy,
},
// v3 statusMessages were generally concise, so use the statusCode
jobStatusMessage: job.statusCode,
datasetList: datasetList,
};
};

/**
* URL encode input
* @param context Handlebars variable
Expand All @@ -137,7 +92,7 @@ export const handlebarsHelpers = {
keyToWord: formatCamelCase,
eq: (a: unknown, b: unknown) => a === b,
jsonify: jsonify,
job_v3: job_v3,
job_v3: mapJobClassV4toV3,
urlencode: urlencode,
base64enc: base64enc,
};
20 changes: 2 additions & 18 deletions src/jobs/interceptors/update-job-v3-mapping.interceptor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
import { Observable } from "rxjs";
import { UpdateJobDtoV3 } from "../dto/update-job.v3.dto";
import { UpdateJobDto } from "../dto/update-job.dto";
import { mapUpdateJobDtoV3ToV4 } from "../job-v3-mappings";

/**
* PATCH/api/v3/jobs requires an UpdateJobDtoV3 object as request body.
Expand All @@ -19,24 +20,7 @@ export class UpdateJobV3MappingInterceptor implements NestInterceptor {
const request = context.switchToHttp().getRequest();
const dtoV3 = request.body as UpdateJobDtoV3;

let newBody: UpdateJobDto = {
statusCode: dtoV3.jobStatusMessage,
statusMessage: dtoV3.jobStatusMessage,
};

let newjobResultObject = dtoV3.jobResultObject;
// if executionTime is provided, add it to jobResultObject, to maintain compatibility
// after the job update is completed, it will be then moved to jobParams
if (dtoV3.executionTime) {
newjobResultObject = {
...newjobResultObject,
executionTime: dtoV3.executionTime,
};
}
newBody = {
...newBody,
jobResultObject: newjobResultObject,
};
const newBody: UpdateJobDto = mapUpdateJobDtoV3ToV4(dtoV3);
request.body = newBody;
return next.handle();
}
Expand Down
60 changes: 60 additions & 0 deletions src/jobs/job-v3-mappings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/**
* Functions for mapping between v3 and v4 job models
*/

import { DatasetListDto } from "./dto/dataset-list.dto";
import { OutputJobV3Dto } from "./dto/output-job-v3.dto";
import { UpdateJobDto } from "./dto/update-job.dto";
import { UpdateJobDtoV3 } from "./dto/update-job.v3.dto";
import { JobClass } from "./schemas/job.schema";

/**
* Transform a v4 job instance so that is compatible with v3
* @param job: a JobClass instance (v4)
* @returns a OutputJobV3Dto instance
*/
export function mapJobClassV4toV3(job: JobClass): OutputJobV3Dto {
const jobV3 = new OutputJobV3Dto();
// Map fields from v4 to v3
jobV3._id = job._id;
jobV3.id = job.id;
jobV3.emailJobInitiator = job.contactEmail;
jobV3.type = job.type;
jobV3.creationTime = job.createdAt;
jobV3.jobStatusMessage = job.statusCode;
jobV3.jobResultObject = job.jobResultObject;
// Extract datasetList from jobParams
const { datasetList, ...jobParams } = job.jobParams;
jobV3.datasetList = datasetList as DatasetListDto[];
jobV3.jobParams = jobParams;
// Extract executionTime from jobParams
if (job.jobParams.executionTime) {
const { datasetList, executionTime, ...jobParams } = job.jobParams;
jobV3.datasetList = datasetList as DatasetListDto[];
jobV3.executionTime = executionTime as Date;
jobV3.jobParams = jobParams;
}
return jobV3;
}

export function mapUpdateJobDtoV3ToV4(dtoV3: UpdateJobDtoV3) {
let newBody: UpdateJobDto = {
statusCode: dtoV3.jobStatusMessage,
statusMessage: dtoV3.jobStatusMessage,
};

let newjobResultObject = dtoV3.jobResultObject;
// if executionTime is provided, add it to jobResultObject, to maintain compatibility
// after the job update is completed, it will be then moved to jobParams
if (dtoV3.executionTime) {
newjobResultObject = {
...newjobResultObject,
executionTime: dtoV3.executionTime,
};
}
newBody = {
...newBody,
jobResultObject: newjobResultObject,
};
return newBody;
}
40 changes: 6 additions & 34 deletions src/jobs/jobs.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ import { ConfigService } from "@nestjs/config";
import { JobConfigService } from "../config/job-config/jobconfig.service";
import { CreateJobV3MappingInterceptor } from "./interceptors/create-job-v3-mapping.interceptor";
import { UpdateJobV3MappingInterceptor } from "./interceptors/update-job-v3-mapping.interceptor";
import { mapJobClassV4toV3 } from "./job-v3-mappings";

@ApiBearerAuth()
@ApiTags("jobs")
Expand Down Expand Up @@ -646,35 +647,6 @@ export class JobsController {
}
}

/**
* Transform a v4 job instance so that is compatible with v3
* @param job: a JobClass instance (v4)
* @returns a OutputJobV3Dto instance
*/
private mapJobClassV4toV3(job: JobClass): OutputJobV3Dto {
const jobV3 = new OutputJobV3Dto();
// Map fields from v4 to v3
jobV3._id = job._id;
jobV3.id = job.id;
jobV3.emailJobInitiator = job.contactEmail;
jobV3.type = job.type;
jobV3.creationTime = job.createdAt;
jobV3.jobStatusMessage = job.statusCode;
jobV3.jobResultObject = job.jobResultObject;
// Extract datasetList from jobParams
const { datasetList, ...jobParams } = job.jobParams;
jobV3.datasetList = datasetList as DatasetListDto[];
jobV3.jobParams = jobParams;
// Extract executionTime from jobParams
if (job.jobParams.executionTime) {
const { datasetList, executionTime, ...jobParams } = job.jobParams;
jobV3.datasetList = datasetList as DatasetListDto[];
jobV3.executionTime = executionTime as Date;
jobV3.jobParams = jobParams;
}
return jobV3;
}

/**
* Create job implementation
*/
Expand Down Expand Up @@ -730,7 +702,7 @@ export class JobsController {
@Body() createJobDto: CreateJobDto,
): Promise<OutputJobV3Dto | null> {
const job = await this.createJob(request, createJobDto);
return job ? this.mapJobClassV4toV3(job) : null;
return job ? mapJobClassV4toV3(job) : null;
}

/**
Expand Down Expand Up @@ -859,7 +831,7 @@ export class JobsController {
): Promise<OutputJobV3Dto | null> {
Logger.log("Updating job v3 ", id);
const updatedJob = await this.updateJob(request, id, updateJobDto);
return updatedJob ? this.mapJobClassV4toV3(updatedJob) : null;
return updatedJob ? mapJobClassV4toV3(updatedJob) : null;
}

/**
Expand Down Expand Up @@ -995,7 +967,7 @@ export class JobsController {
@Query() filters: { fields?: string; limits?: string },
): Promise<OutputJobV3Dto[] | null> {
const jobs = await this.fullQueryJobs(request, filters);
return jobs?.map(this.mapJobClassV4toV3) ?? null;
return jobs?.map(mapJobClassV4toV3) ?? null;
}

/**
Expand Down Expand Up @@ -1224,7 +1196,7 @@ export class JobsController {
@Param("id") id: string,
): Promise<OutputJobV3Dto | null> {
const job = await this.getJobById(request, id);
return job ? this.mapJobClassV4toV3(job) : null;
return job ? mapJobClassV4toV3(job) : null;
}

/**
Expand Down Expand Up @@ -1348,7 +1320,7 @@ export class JobsController {
@Query("filter") filter?: string,
): Promise<OutputJobV3Dto[]> {
const jobs = await this.getJobs(request, filter);
return jobs?.map(this.mapJobClassV4toV3) ?? ([] as OutputJobV3Dto[]);
return jobs?.map(mapJobClassV4toV3) ?? ([] as OutputJobV3Dto[]);
}

/**
Expand Down
Loading