From d4e0f530231a8301d052c96c1e64bf97acf4d833 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Wed, 12 Feb 2025 19:26:58 +0200 Subject: [PATCH 01/16] fix: exclude parameters column --- openapi3.yaml | 6 ++++++ src/DAL/repositories/jobRepository.ts | 14 +++++++++----- src/DAL/repositories/taskRepository.ts | 17 +++++++++++------ src/common/utils.ts | 6 ++++++ src/jobs/controllers/taskController.ts | 2 +- src/jobs/models/taskManager.ts | 4 ++-- tests/integration/jobs/jobs.spec.ts | 11 +++++++---- tests/integration/jobs/tasks.spec.ts | 8 ++++---- 8 files changed, 46 insertions(+), 22 deletions(-) diff --git a/openapi3.yaml b/openapi3.yaml index ebe92ed..32321aa 100644 --- a/openapi3.yaml +++ b/openapi3.yaml @@ -245,6 +245,12 @@ paths: /jobs/{jobId}/tasks: parameters: - $ref: '#/components/parameters/jobId' + - in: query + name: excludeParameters + description: Whether to exclude the 'parameters' column from the response + required: false + schema: + type: boolean get: operationId: getTasks tags: diff --git a/src/DAL/repositories/jobRepository.ts b/src/DAL/repositories/jobRepository.ts index a22df31..5e6bb2c 100644 --- a/src/DAL/repositories/jobRepository.ts +++ b/src/DAL/repositories/jobRepository.ts @@ -5,8 +5,7 @@ import { ConflictError, NotFoundError } from '@map-colonies/error-types'; import { OperationStatus } from '@map-colonies/mc-priority-queue'; import { DBConstraintError } from '../../common/errors'; import { SERVICES } from '../../common/constants'; -import { JobEntity } from '../entity/job'; -import { paramsQueryBuilder } from '../../common/utils'; +import { excludeColumns, paramsQueryBuilder } from '../../common/utils'; import { FindJobsResponse, ICreateJobBody, @@ -18,6 +17,7 @@ import { IFindJobsByCriteriaBody, } from '../../common/dataModels/jobs'; import { JobModelConvertor } from '../convertors/jobModelConverter'; +import { JobEntity } from '../entity/job'; import { GeneralRepository } from './generalRepository'; export type JobParameters = Record; @@ -45,7 +45,7 @@ export class JobRepository extends GeneralRepository { internalId: req.internalId, domain: req.domain, }; - + if (req.fromDate != undefined && req.tillDate != undefined) { filter.updateTime = Between(req.fromDate, req.tillDate); } else if (req.tillDate != undefined) { @@ -60,11 +60,15 @@ export class JobRepository extends GeneralRepository { } } - const options: FindManyOptions = { where: filter }; + const options: FindManyOptions = { + where: filter, + select: excludeColumns(JobEntity, ['parameters']), + }; + if (req.shouldReturnTasks !== false) { options.relations = ['tasks']; } - + const entities = await this.find(options); const models = entities.map((entity) => this.jobConvertor.entityToModel(entity)); return models; diff --git a/src/DAL/repositories/taskRepository.ts b/src/DAL/repositories/taskRepository.ts index 9450410..a63a026 100644 --- a/src/DAL/repositories/taskRepository.ts +++ b/src/DAL/repositories/taskRepository.ts @@ -1,11 +1,9 @@ -import { EntityRepository, LessThan, Brackets, UpdateResult, In } from 'typeorm'; +import { EntityRepository, LessThan, Brackets, UpdateResult, In, FindManyOptions } from 'typeorm'; import { container } from 'tsyringe'; import { Logger } from '@map-colonies/js-logger'; import { ConflictError, NotFoundError } from '@map-colonies/error-types'; import { OperationStatus } from '@map-colonies/mc-priority-queue'; import { SERVICES } from '../../common/constants'; -import { TaskEntity } from '../entity/task'; -import { TaskModelConvertor } from '../convertors/taskModelConvertor'; import { CreateTasksRequest, CreateTasksResponse, @@ -20,8 +18,11 @@ import { ITaskType, IUpdateTaskRequest, } from '../../common/dataModels/tasks'; -import { JobEntity } from '../entity/job'; import { IJobAndTaskStatus } from '../../common/interfaces'; +import { excludeColumns } from '../../common/utils'; +import { TaskModelConvertor } from '../convertors/taskModelConvertor'; +import { JobEntity } from '../entity/job'; +import { TaskEntity } from '../entity/task'; import { GeneralRepository } from './generalRepository'; declare type SqlRawResponse = [unknown[], number]; @@ -38,8 +39,12 @@ export class TaskRepository extends GeneralRepository { this.taskConvertor = container.resolve(TaskModelConvertor); } - public async getTasks(req: IAllTasksParams): Promise { - const entities = await this.find(req); + public async getTasks(req: IAllTasksParams, excludeParameters: boolean = false): Promise { + const options: FindManyOptions = { + where: req, + select: excludeParameters ? excludeColumns(TaskEntity, ['parameters']) : undefined, + }; + const entities = await this.find(options); const models = entities.map((entity) => this.taskConvertor.entityToModel(entity)); return models; } diff --git a/src/common/utils.ts b/src/common/utils.ts index 8cf3fbf..2d2c25a 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -14,3 +14,9 @@ export const paramsQueryBuilder = (params: Record): string => { } return fullQuery; }; + +export const excludeColumns = (EntityClass: new () => T, exclude: string[]): (keyof T)[] => { + const entityInstance = new EntityClass(); + const allColumns = Object.keys(entityInstance) as (keyof T)[]; + return allColumns.filter(column => !exclude.includes(column as string)); +}; \ No newline at end of file diff --git a/src/jobs/controllers/taskController.ts b/src/jobs/controllers/taskController.ts index ca5dc8e..97700fb 100644 --- a/src/jobs/controllers/taskController.ts +++ b/src/jobs/controllers/taskController.ts @@ -63,7 +63,7 @@ export class TaskController { }; public getResources: GetResourcesHandler = async (req, res, next) => { try { - const tasksRes = await this.manager.getAllTasks(req.params); + const tasksRes = await this.manager.getAllTasks(req.params, !!req.query.excludeParameters); return res.status(httpStatus.OK).json(tasksRes); } catch (err) { return next(err); diff --git a/src/jobs/models/taskManager.ts b/src/jobs/models/taskManager.ts index f816e4d..7f7c684 100644 --- a/src/jobs/models/taskManager.ts +++ b/src/jobs/models/taskManager.ts @@ -32,9 +32,9 @@ export class TaskManager { ) {} @withSpanAsyncV4 - public async getAllTasks(req: IAllTasksParams): Promise { + public async getAllTasks(req: IAllTasksParams, excludeParameters: boolean = false): Promise { const repo = await this.getRepository(); - const res = await repo.getTasks(req); + const res = await repo.getTasks(req, excludeParameters); return res; } diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index 2d36502..cbba883 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -15,9 +15,9 @@ import { } from '../../mocks/DBMock'; import { getApp } from '../../../src/app'; import { FindJobsResponse, IAvailableActions, IGetJobResponse } from '../../../src/common/dataModels/jobs'; +import { ResponseCodes } from '../../../src/common/constants'; import { TaskRepository } from '../../../src/DAL/repositories/taskRepository'; import { TaskEntity } from '../../../src/DAL/entity/task'; -import { ResponseCodes } from '../../../src/common/constants'; import { JobManager } from '../../../src/jobs/models/jobManager'; import { JobsRequestSender, SearchJobsParams } from './helpers/jobsRequestSender'; @@ -418,7 +418,7 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {} }); + expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {}, select: expect.any(Array) }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -487,7 +487,7 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' } }); + expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, select: expect.any(Array) }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -508,6 +508,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'moreThanOrEqualMock' }, + select: expect.any(Array) }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(1); expect(moreThanOrEqualMock).toHaveBeenCalledWith('2000-01-01T00:00:00Z'); @@ -533,6 +534,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'lessThanOrEqualMock' }, + select: expect.any(Array) }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(1); @@ -557,6 +559,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'betweenMock' }, + select: expect.any(Array) }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(0); @@ -584,7 +587,7 @@ describe('job', function () { expect(response.body).toEqual([]); expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ where: filter }); + expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.any(Array) }); expect(response).toSatisfyApiSpec(); }); }); diff --git a/tests/integration/jobs/tasks.spec.ts b/tests/integration/jobs/tasks.spec.ts index d13c870..97b4590 100644 --- a/tests/integration/jobs/tasks.spec.ts +++ b/tests/integration/jobs/tasks.spec.ts @@ -171,7 +171,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(taskFindMock).toHaveBeenCalledTimes(1); expect(taskFindMock).toHaveBeenCalledWith({ - jobId: jobId, + where: { jobId: jobId } }); const tasks = response.body as IGetTaskResponse[]; const entityFromResponse = convertTaskResponseToEntity(tasks[0]); @@ -191,7 +191,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ - jobId: jobId, + where: { jobId: jobId } }); }); @@ -351,7 +351,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(taskfindMock).toHaveBeenCalledTimes(1); expect(taskfindMock).toHaveBeenCalledWith({ - where: findTasksBody, + where: findTasksBody }); const taskResponses = response.body as IGetTaskResponse[]; @@ -410,7 +410,7 @@ describe('tasks', function () { expect(taskfindMock).toHaveBeenCalledTimes(1); expect(taskfindMock).toHaveBeenCalledWith({ - where: findTasksBody, + where: findTasksBody }); expect(response.status).toBe(httpStatusCodes.NOT_FOUND); expect(response).toSatisfyApiSpec(); From a280a2e80758629539a6b688ba2c0e25e915b5fe Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Wed, 12 Feb 2025 19:32:47 +0200 Subject: [PATCH 02/16] fix: exclude parameters column --- src/DAL/repositories/jobRepository.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/DAL/repositories/jobRepository.ts b/src/DAL/repositories/jobRepository.ts index 5e6bb2c..00c9fbe 100644 --- a/src/DAL/repositories/jobRepository.ts +++ b/src/DAL/repositories/jobRepository.ts @@ -45,7 +45,7 @@ export class JobRepository extends GeneralRepository { internalId: req.internalId, domain: req.domain, }; - + if (req.fromDate != undefined && req.tillDate != undefined) { filter.updateTime = Between(req.fromDate, req.tillDate); } else if (req.tillDate != undefined) { @@ -68,7 +68,7 @@ export class JobRepository extends GeneralRepository { if (req.shouldReturnTasks !== false) { options.relations = ['tasks']; } - + const entities = await this.find(options); const models = entities.map((entity) => this.jobConvertor.entityToModel(entity)); return models; From 007a86acd1bda26551efba3cbc1d268bb84ce334 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Wed, 12 Feb 2025 19:47:46 +0200 Subject: [PATCH 03/16] chore: fix: eslint --- src/DAL/repositories/taskRepository.ts | 2 +- src/common/utils.ts | 4 +++- src/jobs/models/taskManager.ts | 2 +- tests/integration/jobs/jobs.spec.ts | 12 ++++++------ 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/src/DAL/repositories/taskRepository.ts b/src/DAL/repositories/taskRepository.ts index a63a026..724a05f 100644 --- a/src/DAL/repositories/taskRepository.ts +++ b/src/DAL/repositories/taskRepository.ts @@ -39,7 +39,7 @@ export class TaskRepository extends GeneralRepository { this.taskConvertor = container.resolve(TaskModelConvertor); } - public async getTasks(req: IAllTasksParams, excludeParameters: boolean = false): Promise { + public async getTasks(req: IAllTasksParams, excludeParameters = false): Promise { const options: FindManyOptions = { where: req, select: excludeParameters ? excludeColumns(TaskEntity, ['parameters']) : undefined, diff --git a/src/common/utils.ts b/src/common/utils.ts index 2d2c25a..ee13d8e 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -15,8 +15,10 @@ export const paramsQueryBuilder = (params: Record): string => { return fullQuery; }; +/* eslint-disable @typescript-eslint/naming-convention */ export const excludeColumns = (EntityClass: new () => T, exclude: string[]): (keyof T)[] => { const entityInstance = new EntityClass(); const allColumns = Object.keys(entityInstance) as (keyof T)[]; return allColumns.filter(column => !exclude.includes(column as string)); -}; \ No newline at end of file +}; +/* eslint-enable @typescript-eslint/naming-convention */ \ No newline at end of file diff --git a/src/jobs/models/taskManager.ts b/src/jobs/models/taskManager.ts index 7f7c684..0a155ec 100644 --- a/src/jobs/models/taskManager.ts +++ b/src/jobs/models/taskManager.ts @@ -32,7 +32,7 @@ export class TaskManager { ) {} @withSpanAsyncV4 - public async getAllTasks(req: IAllTasksParams, excludeParameters: boolean = false): Promise { + public async getAllTasks(req: IAllTasksParams, excludeParameters = false): Promise { const repo = await this.getRepository(); const res = await repo.getTasks(req, excludeParameters); return res; diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index cbba883..a8eea8f 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -418,7 +418,7 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {}, select: expect.any(Array) }); + expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {}, select: expect.arrayContaining([expect.any(String)]) }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -487,7 +487,7 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, select: expect.any(Array) }); + expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, select: expect.arrayContaining([expect.any(String)]) }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -508,7 +508,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'moreThanOrEqualMock' }, - select: expect.any(Array) + select: expect.arrayContaining([expect.any(String)]) }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(1); expect(moreThanOrEqualMock).toHaveBeenCalledWith('2000-01-01T00:00:00Z'); @@ -534,7 +534,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'lessThanOrEqualMock' }, - select: expect.any(Array) + select: expect.arrayContaining([expect.any(String)]) }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(1); @@ -559,7 +559,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'betweenMock' }, - select: expect.any(Array) + select: expect.arrayContaining([expect.any(String)]) }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(0); @@ -587,7 +587,7 @@ describe('job', function () { expect(response.body).toEqual([]); expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.any(Array) }); + expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.arrayContaining([expect.any(String)]) }); expect(response).toSatisfyApiSpec(); }); }); From a60338d6b7acc787f73c2ea8af6f8584d1e8b584 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Wed, 12 Feb 2025 20:05:32 +0200 Subject: [PATCH 04/16] chore: fix: eslint --- tests/integration/jobs/jobs.spec.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index a8eea8f..0276eb5 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import httpStatusCodes from 'http-status-codes'; import { OperationStatus } from '@map-colonies/mc-priority-queue'; import { getContainerConfig, resetContainer } from '../testContainerConfig'; From b28485012dcd38c821fadc90fc5444a09b0e20cf Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Wed, 12 Feb 2025 20:15:29 +0200 Subject: [PATCH 05/16] chore: fix Open API lint error --- openapi3.yaml | 2 +- src/DAL/repositories/taskRepository.ts | 4 ++-- src/jobs/controllers/taskController.ts | 2 +- src/jobs/models/taskManager.ts | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/openapi3.yaml b/openapi3.yaml index 32321aa..8764bde 100644 --- a/openapi3.yaml +++ b/openapi3.yaml @@ -246,7 +246,7 @@ paths: parameters: - $ref: '#/components/parameters/jobId' - in: query - name: excludeParameters + name: shouldExcludeParameters description: Whether to exclude the 'parameters' column from the response required: false schema: diff --git a/src/DAL/repositories/taskRepository.ts b/src/DAL/repositories/taskRepository.ts index 724a05f..434ff89 100644 --- a/src/DAL/repositories/taskRepository.ts +++ b/src/DAL/repositories/taskRepository.ts @@ -39,10 +39,10 @@ export class TaskRepository extends GeneralRepository { this.taskConvertor = container.resolve(TaskModelConvertor); } - public async getTasks(req: IAllTasksParams, excludeParameters = false): Promise { + public async getTasks(req: IAllTasksParams, shouldExcludeParameters = false): Promise { const options: FindManyOptions = { where: req, - select: excludeParameters ? excludeColumns(TaskEntity, ['parameters']) : undefined, + select: shouldExcludeParameters ? excludeColumns(TaskEntity, ['parameters']) : undefined, }; const entities = await this.find(options); const models = entities.map((entity) => this.taskConvertor.entityToModel(entity)); diff --git a/src/jobs/controllers/taskController.ts b/src/jobs/controllers/taskController.ts index 97700fb..120da14 100644 --- a/src/jobs/controllers/taskController.ts +++ b/src/jobs/controllers/taskController.ts @@ -63,7 +63,7 @@ export class TaskController { }; public getResources: GetResourcesHandler = async (req, res, next) => { try { - const tasksRes = await this.manager.getAllTasks(req.params, !!req.query.excludeParameters); + const tasksRes = await this.manager.getAllTasks(req.params, !!req.query.shouldExcludeParameters); return res.status(httpStatus.OK).json(tasksRes); } catch (err) { return next(err); diff --git a/src/jobs/models/taskManager.ts b/src/jobs/models/taskManager.ts index 0a155ec..08772a4 100644 --- a/src/jobs/models/taskManager.ts +++ b/src/jobs/models/taskManager.ts @@ -32,9 +32,9 @@ export class TaskManager { ) {} @withSpanAsyncV4 - public async getAllTasks(req: IAllTasksParams, excludeParameters = false): Promise { + public async getAllTasks(req: IAllTasksParams, shouldExcludeParameters = false): Promise { const repo = await this.getRepository(); - const res = await repo.getTasks(req, excludeParameters); + const res = await repo.getTasks(req, shouldExcludeParameters); return res; } From 2880652960fdef8bb9c65f5c39d48798257e1038 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Wed, 12 Feb 2025 20:18:09 +0200 Subject: [PATCH 06/16] chore: fix prettier errors --- src/DAL/repositories/jobRepository.ts | 2 +- src/common/utils.ts | 4 ++-- tests/integration/jobs/jobs.spec.ts | 12 ++++++++---- tests/integration/jobs/tasks.spec.ts | 8 ++++---- 4 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/DAL/repositories/jobRepository.ts b/src/DAL/repositories/jobRepository.ts index 00c9fbe..4c5032a 100644 --- a/src/DAL/repositories/jobRepository.ts +++ b/src/DAL/repositories/jobRepository.ts @@ -64,7 +64,7 @@ export class JobRepository extends GeneralRepository { where: filter, select: excludeColumns(JobEntity, ['parameters']), }; - + if (req.shouldReturnTasks !== false) { options.relations = ['tasks']; } diff --git a/src/common/utils.ts b/src/common/utils.ts index ee13d8e..65c72dd 100644 --- a/src/common/utils.ts +++ b/src/common/utils.ts @@ -19,6 +19,6 @@ export const paramsQueryBuilder = (params: Record): string => { export const excludeColumns = (EntityClass: new () => T, exclude: string[]): (keyof T)[] => { const entityInstance = new EntityClass(); const allColumns = Object.keys(entityInstance) as (keyof T)[]; - return allColumns.filter(column => !exclude.includes(column as string)); + return allColumns.filter((column) => !exclude.includes(column as string)); }; -/* eslint-enable @typescript-eslint/naming-convention */ \ No newline at end of file +/* eslint-enable @typescript-eslint/naming-convention */ diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index 0276eb5..18bcdbb 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -488,7 +488,11 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, select: expect.arrayContaining([expect.any(String)]) }); + expect(jobsFindMock).toHaveBeenCalledWith({ + relations: ['tasks'], + where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, + select: expect.arrayContaining([expect.any(String)]), + }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -509,7 +513,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'moreThanOrEqualMock' }, - select: expect.arrayContaining([expect.any(String)]) + select: expect.arrayContaining([expect.any(String)]), }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(1); expect(moreThanOrEqualMock).toHaveBeenCalledWith('2000-01-01T00:00:00Z'); @@ -535,7 +539,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'lessThanOrEqualMock' }, - select: expect.arrayContaining([expect.any(String)]) + select: expect.arrayContaining([expect.any(String)]), }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(1); @@ -560,7 +564,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'betweenMock' }, - select: expect.arrayContaining([expect.any(String)]) + select: expect.arrayContaining([expect.any(String)]), }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(0); diff --git a/tests/integration/jobs/tasks.spec.ts b/tests/integration/jobs/tasks.spec.ts index 97b4590..d5416b0 100644 --- a/tests/integration/jobs/tasks.spec.ts +++ b/tests/integration/jobs/tasks.spec.ts @@ -171,7 +171,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(taskFindMock).toHaveBeenCalledTimes(1); expect(taskFindMock).toHaveBeenCalledWith({ - where: { jobId: jobId } + where: { jobId: jobId }, }); const tasks = response.body as IGetTaskResponse[]; const entityFromResponse = convertTaskResponseToEntity(tasks[0]); @@ -191,7 +191,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ - where: { jobId: jobId } + where: { jobId: jobId }, }); }); @@ -351,7 +351,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(taskfindMock).toHaveBeenCalledTimes(1); expect(taskfindMock).toHaveBeenCalledWith({ - where: findTasksBody + where: findTasksBody, }); const taskResponses = response.body as IGetTaskResponse[]; @@ -410,7 +410,7 @@ describe('tasks', function () { expect(taskfindMock).toHaveBeenCalledTimes(1); expect(taskfindMock).toHaveBeenCalledWith({ - where: findTasksBody + where: findTasksBody, }); expect(response.status).toBe(httpStatusCodes.NOT_FOUND); expect(response).toSatisfyApiSpec(); From b36062b46fe0d374025c78df7c8c69ae7fb21fb7 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 09:40:01 +0200 Subject: [PATCH 07/16] chore: fix integration tests --- tests/integration/jobs/jobs.spec.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index 18bcdbb..4e192e9 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -419,7 +419,7 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {}, select: expect.arrayContaining([expect.any(String)]) }); + expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {}, select: expect.not.arrayContaining(['parameters']) }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -491,7 +491,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, - select: expect.arrayContaining([expect.any(String)]), + select: expect.not.arrayContaining(['parameters']), }); const jobs = response.body as unknown; @@ -513,7 +513,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'moreThanOrEqualMock' }, - select: expect.arrayContaining([expect.any(String)]), + select: expect.not.arrayContaining(['parameters']), }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(1); expect(moreThanOrEqualMock).toHaveBeenCalledWith('2000-01-01T00:00:00Z'); @@ -539,7 +539,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'lessThanOrEqualMock' }, - select: expect.arrayContaining([expect.any(String)]), + select: expect.not.arrayContaining(['parameters']), }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(1); @@ -564,7 +564,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'betweenMock' }, - select: expect.arrayContaining([expect.any(String)]), + select: expect.not.arrayContaining(['parameters']), }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(0); @@ -592,7 +592,7 @@ describe('job', function () { expect(response.body).toEqual([]); expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.arrayContaining([expect.any(String)]) }); + expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.not.arrayContaining(['parameters']) }); expect(response).toSatisfyApiSpec(); }); }); From 9d4a4799f680b17218d1e73e172b13af13c33079 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 10:37:23 +0200 Subject: [PATCH 08/16] feat: fix tasks query param --- src/common/dataModels/tasks.ts | 2 ++ src/jobs/controllers/taskController.ts | 5 +++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/common/dataModels/tasks.ts b/src/common/dataModels/tasks.ts index b3829d8..ffae1f0 100644 --- a/src/common/dataModels/tasks.ts +++ b/src/common/dataModels/tasks.ts @@ -98,3 +98,5 @@ export interface IFindTasksRequest extends Partial { creationTime?: Date; updateTime?: Date; } + +export type GetTasksQueryParams = { shouldExcludeParameters?: boolean }; diff --git a/src/jobs/controllers/taskController.ts b/src/jobs/controllers/taskController.ts index 120da14..ec41681 100644 --- a/src/jobs/controllers/taskController.ts +++ b/src/jobs/controllers/taskController.ts @@ -17,12 +17,13 @@ import { CreateTasksRequest, IFindTasksRequest, IGetTasksStatus, + GetTasksQueryParams, } from '../../common/dataModels/tasks'; import { DefaultResponse } from '../../common/interfaces'; import { TaskManager } from '../models/taskManager'; type CreateResourceHandler = RequestHandler; -type GetResourcesHandler = RequestHandler; +type GetResourcesHandler = RequestHandler; type GetResourceHandler = RequestHandler; type DeleteResourceHandler = RequestHandler; type UpdateResourceHandler = RequestHandler; @@ -63,7 +64,7 @@ export class TaskController { }; public getResources: GetResourcesHandler = async (req, res, next) => { try { - const tasksRes = await this.manager.getAllTasks(req.params, !!req.query.shouldExcludeParameters); + const tasksRes = await this.manager.getAllTasks(req.params, req.query.shouldExcludeParameters); return res.status(httpStatus.OK).json(tasksRes); } catch (err) { return next(err); From 63e8b6dc0f7e6654936b26ce88e1ce0d82dfc65f Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 10:59:40 +0200 Subject: [PATCH 09/16] chore: fix eslint error --- src/common/dataModels/tasks.ts | 4 +++- src/jobs/controllers/taskController.ts | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/common/dataModels/tasks.ts b/src/common/dataModels/tasks.ts index ffae1f0..95745c8 100644 --- a/src/common/dataModels/tasks.ts +++ b/src/common/dataModels/tasks.ts @@ -99,4 +99,6 @@ export interface IFindTasksRequest extends Partial { updateTime?: Date; } -export type GetTasksQueryParams = { shouldExcludeParameters?: boolean }; +export interface IGetTasksQueryParams { + shouldExcludeParameters?: boolean +} diff --git a/src/jobs/controllers/taskController.ts b/src/jobs/controllers/taskController.ts index ec41681..b0ef378 100644 --- a/src/jobs/controllers/taskController.ts +++ b/src/jobs/controllers/taskController.ts @@ -17,13 +17,13 @@ import { CreateTasksRequest, IFindTasksRequest, IGetTasksStatus, - GetTasksQueryParams, + IGetTasksQueryParams, } from '../../common/dataModels/tasks'; import { DefaultResponse } from '../../common/interfaces'; import { TaskManager } from '../models/taskManager'; type CreateResourceHandler = RequestHandler; -type GetResourcesHandler = RequestHandler; +type GetResourcesHandler = RequestHandler; type GetResourceHandler = RequestHandler; type DeleteResourceHandler = RequestHandler; type UpdateResourceHandler = RequestHandler; From 74670dc9df842056efb649305014eb83b86f6024 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 11:24:36 +0200 Subject: [PATCH 10/16] chore: default value was added for tasks new query param --- openapi3.yaml | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/openapi3.yaml b/openapi3.yaml index 8764bde..e46aaec 100644 --- a/openapi3.yaml +++ b/openapi3.yaml @@ -245,12 +245,7 @@ paths: /jobs/{jobId}/tasks: parameters: - $ref: '#/components/parameters/jobId' - - in: query - name: shouldExcludeParameters - description: Whether to exclude the 'parameters' column from the response - required: false - schema: - type: boolean + - $ref: '#/components/parameters/shouldExcludeParameters' get: operationId: getTasks tags: @@ -566,6 +561,13 @@ components: required: true schema: $ref: '#/components/schemas/jobId' + shouldExcludeParameters: + in: query + name: shouldExcludeParameters + description: Whether to exclude the 'parameters' column from the response + required: false + schema: + $ref: '#/components/schemas/shouldExcludeParameters' taskId: in: path name: taskId @@ -791,6 +793,9 @@ components: jobId: type: string format: uuid + shouldExcludeParameters: + type: boolean + default: false taskId: type: string format: uuid From dac61ac5bb55072bcb6146340065720df1a60fc0 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 11:30:27 +0200 Subject: [PATCH 11/16] chore: fix prettier --- src/common/dataModels/tasks.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/dataModels/tasks.ts b/src/common/dataModels/tasks.ts index 95745c8..88ba118 100644 --- a/src/common/dataModels/tasks.ts +++ b/src/common/dataModels/tasks.ts @@ -99,6 +99,6 @@ export interface IFindTasksRequest extends Partial { updateTime?: Date; } -export interface IGetTasksQueryParams { - shouldExcludeParameters?: boolean +export interface IGetTasksQueryParams { + shouldExcludeParameters?: boolean; } From 8dfc88b7059024ae303217b49f8a1f7e382ce3cb Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 15:43:43 +0200 Subject: [PATCH 12/16] chore: add missing integration test --- src/jobs/controllers/taskController.ts | 1 + .../jobs/helpers/tasksRequestSender.ts | 4 +-- tests/integration/jobs/tasks.spec.ts | 36 ++++++++++++++++++- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/jobs/controllers/taskController.ts b/src/jobs/controllers/taskController.ts index b0ef378..6c1cd83 100644 --- a/src/jobs/controllers/taskController.ts +++ b/src/jobs/controllers/taskController.ts @@ -62,6 +62,7 @@ export class TaskController { return next(err); } }; + public getResources: GetResourcesHandler = async (req, res, next) => { try { const tasksRes = await this.manager.getAllTasks(req.params, req.query.shouldExcludeParameters); diff --git a/tests/integration/jobs/helpers/tasksRequestSender.ts b/tests/integration/jobs/helpers/tasksRequestSender.ts index cb4532b..93c9dc4 100644 --- a/tests/integration/jobs/helpers/tasksRequestSender.ts +++ b/tests/integration/jobs/helpers/tasksRequestSender.ts @@ -4,8 +4,8 @@ import { IFindTasksRequest } from '../../../../src/common/dataModels/tasks'; export class TasksRequestSender { public constructor(private readonly app: Express.Application) {} - public async getAllResources(jobId: string): Promise { - return supertest.agent(this.app).get(`/jobs/${jobId}/tasks`).set('Content-Type', 'application/json'); + public async getAllResources(jobId: string, shouldExcludeParameters = false): Promise { + return supertest.agent(this.app).get(`/jobs/${jobId}/tasks`).query({ shouldExcludeParameters }).set('Content-Type', 'application/json'); } public async getResource(jobId: string, taskId: string): Promise { diff --git a/tests/integration/jobs/tasks.spec.ts b/tests/integration/jobs/tasks.spec.ts index d5416b0..158f07e 100644 --- a/tests/integration/jobs/tasks.spec.ts +++ b/tests/integration/jobs/tasks.spec.ts @@ -9,7 +9,6 @@ import { JobRepository } from '../../../src/DAL/repositories/jobRepository'; import { ICreateTaskBody, IGetTaskResponse, IGetTasksStatus } from '../../../src/common/dataModels/tasks'; import { IFindTasksRequest } from '../../../src/common/dataModels/tasks'; import { JobEntity } from '../../../src/DAL/entity/job'; - import { getApp } from '../../../src/app'; import { ResponseCodes } from '../../../src/common/constants'; import { TasksRequestSender } from './helpers/tasksRequestSender'; @@ -180,6 +179,40 @@ describe('tasks', function () { expect(response).toSatisfyApiSpec(); }); + it('should get all tasks without parameters and return 200', async function () { + const taskEntity = { + jobId: jobId, + id: taskId, + creationTime: new Date(Date.UTC(2000, 1, 2)), + updateTime: new Date(Date.UTC(2000, 1, 2)), + attempts: 0, + description: '1', + reason: '3', + percentage: 4, + type: '5', + status: OperationStatus.IN_PROGRESS, + resettable: false, + } as unknown as TaskEntity; + + const taskFindMock = taskRepositoryMocks.findMock; + taskFindMock.mockResolvedValue([taskEntity]); + + const response = await requestSender.getAllResources(jobId, true); + + expect(response.status).toBe(httpStatusCodes.OK); + expect(taskFindMock).toHaveBeenCalledTimes(1); + expect(taskFindMock).toHaveBeenCalledWith({ + where: { jobId: jobId }, + select: expect.not.arrayContaining(['parameters']), + }); + const tasks = response.body as IGetTaskResponse[]; + const entityFromResponse = convertTaskResponseToEntity(tasks[0]); + expect(entityFromResponse).not.toHaveProperty('parameters'); + expect(entityFromResponse).toEqual(entityFromResponse); + + expect(response).toSatisfyApiSpec(); + }); + it('should return 200 for job without tasks', async function () { const jobsFindMock = taskRepositoryMocks.findMock; jobsFindMock.mockResolvedValue([] as TaskEntity[]); @@ -361,6 +394,7 @@ describe('tasks', function () { expect(response).toSatisfyApiSpec(); }); }); + describe('Bad Path', function () { it('should return status code 400 on PUT request with invalid body', async function () { const taskCountMock = taskRepositoryMocks.countMock; From c785fe343e3bebc31f7999a42bc7d75a250ffbbe Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 15:51:36 +0200 Subject: [PATCH 13/16] chore: fix prettier error --- src/jobs/controllers/taskController.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/jobs/controllers/taskController.ts b/src/jobs/controllers/taskController.ts index 6c1cd83..7fd704b 100644 --- a/src/jobs/controllers/taskController.ts +++ b/src/jobs/controllers/taskController.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import { ErrorResponse } from '@map-colonies/error-express-handler'; import { Logger } from '@map-colonies/js-logger'; import { NotFoundError } from '@map-colonies/error-types'; @@ -62,7 +63,7 @@ export class TaskController { return next(err); } }; - + public getResources: GetResourcesHandler = async (req, res, next) => { try { const tasksRes = await this.manager.getAllTasks(req.params, req.query.shouldExcludeParameters); From d103183333266052b8fb624ed129e0bd6de8a323 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 15:58:18 +0200 Subject: [PATCH 14/16] chore: fix lint error --- tests/integration/jobs/jobs.spec.ts | 1 - tests/integration/jobs/tasks.spec.ts | 10 ++++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index 4e192e9..0bc8a6c 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable @typescript-eslint/no-unsafe-assignment */ import httpStatusCodes from 'http-status-codes'; import { OperationStatus } from '@map-colonies/mc-priority-queue'; import { getContainerConfig, resetContainer } from '../testContainerConfig'; diff --git a/tests/integration/jobs/tasks.spec.ts b/tests/integration/jobs/tasks.spec.ts index 158f07e..ad4b08c 100644 --- a/tests/integration/jobs/tasks.spec.ts +++ b/tests/integration/jobs/tasks.spec.ts @@ -194,6 +194,11 @@ describe('tasks', function () { resettable: false, } as unknown as TaskEntity; + const args: { where: { jobId: string }; select?: string[] } = { + where: { jobId: jobId }, + select: expect.not.arrayContaining(['parameters']), + }; + const taskFindMock = taskRepositoryMocks.findMock; taskFindMock.mockResolvedValue([taskEntity]); @@ -201,10 +206,7 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(taskFindMock).toHaveBeenCalledTimes(1); - expect(taskFindMock).toHaveBeenCalledWith({ - where: { jobId: jobId }, - select: expect.not.arrayContaining(['parameters']), - }); + expect(taskFindMock).toHaveBeenCalledWith(args); const tasks = response.body as IGetTaskResponse[]; const entityFromResponse = convertTaskResponseToEntity(tasks[0]); expect(entityFromResponse).not.toHaveProperty('parameters'); From e85b8d3deeeb18397da1f742f97a6e1cb001a455 Mon Sep 17 00:00:00 2001 From: ellamartirosyan Date: Thu, 13 Feb 2025 16:24:00 +0200 Subject: [PATCH 15/16] chore: fix lint errors --- tests/integration/jobs/jobs.spec.ts | 16 ++++++++++------ tests/integration/jobs/tasks.spec.ts | 10 ++++------ 2 files changed, 14 insertions(+), 12 deletions(-) diff --git a/tests/integration/jobs/jobs.spec.ts b/tests/integration/jobs/jobs.spec.ts index 0bc8a6c..da6f829 100644 --- a/tests/integration/jobs/jobs.spec.ts +++ b/tests/integration/jobs/jobs.spec.ts @@ -418,7 +418,11 @@ describe('job', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: {}, select: expect.not.arrayContaining(['parameters']) }); + expect(jobsFindMock).toHaveBeenCalledWith({ + relations: ['tasks'], + where: {}, + select: expect.not.arrayContaining(['parameters']) as string[], + }); const jobs = response.body as unknown; expect(jobs).toEqual([jobModel]); @@ -490,7 +494,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledWith({ relations: ['tasks'], where: { internalId: '9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d' }, - select: expect.not.arrayContaining(['parameters']), + select: expect.not.arrayContaining(['parameters']) as string[], }); const jobs = response.body as unknown; @@ -512,7 +516,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'moreThanOrEqualMock' }, - select: expect.not.arrayContaining(['parameters']), + select: expect.not.arrayContaining(['parameters']) as string[], }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(1); expect(moreThanOrEqualMock).toHaveBeenCalledWith('2000-01-01T00:00:00Z'); @@ -538,7 +542,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'lessThanOrEqualMock' }, - select: expect.not.arrayContaining(['parameters']), + select: expect.not.arrayContaining(['parameters']) as string[], }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(1); @@ -563,7 +567,7 @@ describe('job', function () { expect(jobsFindMock).toHaveBeenCalledTimes(1); expect(jobsFindMock).toHaveBeenCalledWith({ where: { updateTime: 'betweenMock' }, - select: expect.not.arrayContaining(['parameters']), + select: expect.not.arrayContaining(['parameters']) as string[], }); expect(moreThanOrEqualMock).toHaveBeenCalledTimes(0); expect(lessThanOrEqualMock).toHaveBeenCalledTimes(0); @@ -591,7 +595,7 @@ describe('job', function () { expect(response.body).toEqual([]); expect(response.status).toBe(httpStatusCodes.OK); expect(jobsFindMock).toHaveBeenCalledTimes(1); - expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.not.arrayContaining(['parameters']) }); + expect(jobsFindMock).toHaveBeenCalledWith({ where: filter, select: expect.not.arrayContaining(['parameters']) as string[] }); expect(response).toSatisfyApiSpec(); }); }); diff --git a/tests/integration/jobs/tasks.spec.ts b/tests/integration/jobs/tasks.spec.ts index ad4b08c..f6fef3c 100644 --- a/tests/integration/jobs/tasks.spec.ts +++ b/tests/integration/jobs/tasks.spec.ts @@ -194,11 +194,6 @@ describe('tasks', function () { resettable: false, } as unknown as TaskEntity; - const args: { where: { jobId: string }; select?: string[] } = { - where: { jobId: jobId }, - select: expect.not.arrayContaining(['parameters']), - }; - const taskFindMock = taskRepositoryMocks.findMock; taskFindMock.mockResolvedValue([taskEntity]); @@ -206,7 +201,10 @@ describe('tasks', function () { expect(response.status).toBe(httpStatusCodes.OK); expect(taskFindMock).toHaveBeenCalledTimes(1); - expect(taskFindMock).toHaveBeenCalledWith(args); + expect(taskFindMock).toHaveBeenCalledWith({ + where: { jobId: jobId }, + select: expect.not.arrayContaining(['parameters']) as string[], + }); const tasks = response.body as IGetTaskResponse[]; const entityFromResponse = convertTaskResponseToEntity(tasks[0]); expect(entityFromResponse).not.toHaveProperty('parameters'); From b73266d74e7a10d19dc1952abd408e6845998ac1 Mon Sep 17 00:00:00 2001 From: Ella Martirosyan <34953077+EllaMartirosyan@users.noreply.github.com> Date: Sat, 15 Feb 2025 21:36:35 +0200 Subject: [PATCH 16/16] chore: fix build and push --- .github/workflows/build_and_push.yaml | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/.github/workflows/build_and_push.yaml b/.github/workflows/build_and_push.yaml index 1a290f0..5925aef 100644 --- a/.github/workflows/build_and_push.yaml +++ b/.github/workflows/build_and_push.yaml @@ -19,9 +19,13 @@ permissions: jobs: build_and_push_docker: - uses: MapColonies/shared-workflows/.github/workflows/build-and-push-docker.yaml@v2 + uses: MapColonies/shared-workflows/.github/workflows/build-and-push-docker.yaml@v4 secrets: inherit - + with: + scope: common + build_and_push_helm: - uses: MapColonies/shared-workflows/.github/workflows/build-and-push-helm.yaml@v2 + uses: MapColonies/shared-workflows/.github/workflows/build-and-push-helm.yaml@v4 secrets: inherit + with: + scope: common