From 6251aecdaad1366ce62243db6e3ca4c41d1a880b Mon Sep 17 00:00:00 2001 From: Philip Korsholm <88927411+pKorsholm@users.noreply.github.com> Date: Tue, 2 Aug 2022 18:40:11 +0700 Subject: [PATCH] Feat/convert return reason service to typescript (#1961) **What** - Convert return reason service to typescript Fixes CORE-355 --- .../api/__tests__/admin/return-reason.js | 4 +- .../admin/return-reasons/create-reason.ts | 2 +- .../api/routes/admin/return-reasons/index.ts | 4 +- .../admin/return-reasons/list-reasons.ts | 4 +- .../admin/return-reasons/update-reason.ts | 2 +- .../api/routes/store/return-reasons/index.ts | 4 +- packages/medusa/src/models/return-reason.ts | 4 +- .../{return-reason.js => return-reason.ts} | 92 +++++++++---------- packages/medusa/src/types/return-reason.ts | 14 +++ 9 files changed, 70 insertions(+), 60 deletions(-) rename packages/medusa/src/services/{return-reason.js => return-reason.ts} (54%) create mode 100644 packages/medusa/src/types/return-reason.ts diff --git a/integration-tests/api/__tests__/admin/return-reason.js b/integration-tests/api/__tests__/admin/return-reason.js index 94e77e0745..4e180e23b6 100644 --- a/integration-tests/api/__tests__/admin/return-reason.js +++ b/integration-tests/api/__tests__/admin/return-reason.js @@ -1,6 +1,4 @@ -const { match } = require("assert") const path = require("path") -const { RepositoryNotTreeError } = require("typeorm") const setupServer = require("../../../helpers/setup-server") const { useApi } = require("../../../helpers/use-api") @@ -17,7 +15,7 @@ describe("/admin/return-reasons", () => { beforeAll(async () => { const cwd = path.resolve(path.join(__dirname, "..", "..")) dbConnection = await initDb({ cwd }) - medusaProcess = await setupServer({ cwd }) + medusaProcess = await setupServer({ cwd, verbose: false }) }) afterAll(async () => { diff --git a/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts b/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts index 4d733519f0..fbb9301f7f 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/create-reason.ts @@ -85,5 +85,5 @@ export class AdminPostReturnReasonsReq { description?: string @IsOptional() - metadata?: object + metadata?: Record } diff --git a/packages/medusa/src/api/routes/admin/return-reasons/index.ts b/packages/medusa/src/api/routes/admin/return-reasons/index.ts index 2f4494f5f2..45acd5904d 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/index.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/index.ts @@ -36,7 +36,7 @@ export default (app) => { return app } -export const defaultAdminReturnReasonsFields = [ +export const defaultAdminReturnReasonsFields: (keyof ReturnReason)[] = [ "id", "value", "label", @@ -47,7 +47,7 @@ export const defaultAdminReturnReasonsFields = [ "deleted_at", ] -export const defaultAdminReturnReasonsRelations = [ +export const defaultAdminReturnReasonsRelations: (keyof ReturnReason)[] = [ "parent_return_reason", "return_reason_children", ] diff --git a/packages/medusa/src/api/routes/admin/return-reasons/list-reasons.ts b/packages/medusa/src/api/routes/admin/return-reasons/list-reasons.ts index b1705b290f..861e387370 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/list-reasons.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/list-reasons.ts @@ -2,7 +2,9 @@ import { defaultAdminReturnReasonsFields, defaultAdminReturnReasonsRelations, } from "." +import { ReturnReason } from "../../../../models" import { ReturnReasonService } from "../../../../services" +import { FindConfig, Selector } from "../../../../types/common" /** * @oas [get] /return-reasons @@ -29,7 +31,7 @@ export default async (req, res) => { "returnReasonService" ) - const query = { parent_return_reason_id: null } + const query: Selector = { parent_return_reason_id: null } const data = await returnReasonService.list(query, { select: defaultAdminReturnReasonsFields, relations: defaultAdminReturnReasonsRelations, diff --git a/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts b/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts index f906594e5a..cc194323f3 100644 --- a/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts +++ b/packages/medusa/src/api/routes/admin/return-reasons/update-reason.ts @@ -79,5 +79,5 @@ export class AdminPostReturnReasonsReasonReq { description?: string @IsOptional() - metadata?: object + metadata?: Record } diff --git a/packages/medusa/src/api/routes/store/return-reasons/index.ts b/packages/medusa/src/api/routes/store/return-reasons/index.ts index 03bcc2a7bf..bd2ef8e560 100644 --- a/packages/medusa/src/api/routes/store/return-reasons/index.ts +++ b/packages/medusa/src/api/routes/store/return-reasons/index.ts @@ -20,7 +20,7 @@ export default (app) => { return app } -export const defaultStoreReturnReasonFields = [ +export const defaultStoreReturnReasonFields: (keyof ReturnReason)[] = [ "id", "value", "label", @@ -31,7 +31,7 @@ export const defaultStoreReturnReasonFields = [ "deleted_at", ] -export const defaultStoreReturnReasonRelations = [ +export const defaultStoreReturnReasonRelations: (keyof ReturnReason)[] = [ "parent_return_reason", "return_reason_children", ] diff --git a/packages/medusa/src/models/return-reason.ts b/packages/medusa/src/models/return-reason.ts index 8e63d071b6..9668ddd28b 100644 --- a/packages/medusa/src/models/return-reason.ts +++ b/packages/medusa/src/models/return-reason.ts @@ -24,11 +24,11 @@ export class ReturnReason extends SoftDeletableEntity { description: string @Column({ nullable: true }) - parent_return_reason_id: string + parent_return_reason_id: string | null @ManyToOne(() => ReturnReason, { cascade: ["soft-remove"] }) @JoinColumn({ name: "parent_return_reason_id" }) - parent_return_reason: ReturnReason + parent_return_reason: ReturnReason | null @OneToMany( () => ReturnReason, diff --git a/packages/medusa/src/services/return-reason.js b/packages/medusa/src/services/return-reason.ts similarity index 54% rename from packages/medusa/src/services/return-reason.js rename to packages/medusa/src/services/return-reason.ts index 155b9ae77f..d59e460598 100644 --- a/packages/medusa/src/services/return-reason.js +++ b/packages/medusa/src/services/return-reason.ts @@ -1,34 +1,33 @@ import { MedusaError } from "medusa-core-utils" -import { BaseService } from "medusa-interfaces" +import { EntityManager } from "typeorm" +import { TransactionBaseService } from "../interfaces" +import { Return, ReturnReason } from "../models" +import { ReturnReasonRepository } from "../repositories/return-reason" +import { FindConfig, Selector } from "../types/common" +import { CreateReturnReason, UpdateReturnReason } from "../types/return-reason" +import { buildQuery } from "../utils" -class ReturnReasonService extends BaseService { - constructor({ manager, returnReasonRepository }) { - super() +type InjectedDependencies = { + manager: EntityManager + returnReasonRepository: typeof ReturnReasonRepository +} + +class ReturnReasonService extends TransactionBaseService { + protected readonly retReasonRepo_: typeof ReturnReasonRepository + + protected manager_: EntityManager + protected transactionManager_: EntityManager | undefined + + constructor({ manager, returnReasonRepository }: InjectedDependencies) { + // eslint-disable-next-line prefer-rest-params + super(arguments[0]) - /** @private @constant {EntityManager} */ this.manager_ = manager - - /** @private @constant {ReturnReasonRepository} */ this.retReasonRepo_ = returnReasonRepository } - withTransaction(manager) { - if (!manager) { - return this - } - - const cloned = new ReturnReasonService({ - manager, - returnReasonRepository: this.retReasonRepo_, - }) - - cloned.transactionManager_ = manager - - return cloned - } - - create(data) { - return this.atomicPhase_(async (manager) => { + async create(data: CreateReturnReason): Promise { + return await this.atomicPhase_(async (manager) => { const rrRepo = manager.getCustomRepository(this.retReasonRepo_) if (data.parent_return_reason_id && data.parent_return_reason_id !== "") { @@ -44,28 +43,19 @@ class ReturnReasonService extends BaseService { const created = rrRepo.create(data) - const result = await rrRepo.save(created) - return result + return await rrRepo.save(created) }) } - update(id, data) { - return this.atomicPhase_(async (manager) => { + async update(id: string, data: UpdateReturnReason): Promise { + return await this.atomicPhase_(async (manager) => { const rrRepo = manager.getCustomRepository(this.retReasonRepo_) const reason = await this.retrieve(id) - const { description, label, parent_return_reason_id } = data - - if (description) { - reason.description = data.description - } - - if (label) { - reason.label = data.label - } - - if (parent_return_reason_id) { - reason.parent_return_reason_id = parent_return_reason_id + for (const key of Object.keys(data).filter( + (k) => typeof data[k] !== `undefined` + )) { + reason[key] = data[key] } await rrRepo.save(reason) @@ -80,11 +70,15 @@ class ReturnReasonService extends BaseService { * @return {Promise} the result of the find operation */ async list( - selector, - config = { skip: 0, take: 50, order: { created_at: "DESC" } } - ) { + selector: Selector, + config: FindConfig = { + skip: 0, + take: 50, + order: { created_at: "DESC" }, + } + ): Promise { const rrRepo = this.manager_.getCustomRepository(this.retReasonRepo_) - const query = this.buildQuery_(selector, config) + const query = buildQuery(selector, config) return rrRepo.find(query) } @@ -94,11 +88,13 @@ class ReturnReasonService extends BaseService { * @param {Object} config - config object * @return {Promise} the order document */ - async retrieve(id, config = {}) { + async retrieve( + id: string, + config: FindConfig = {} + ): Promise { const rrRepo = this.manager_.getCustomRepository(this.retReasonRepo_) - const validatedId = this.validateId_(id) - const query = this.buildQuery_({ id: validatedId }, config) + const query = buildQuery({ id }, config) const item = await rrRepo.findOne(query) if (!item) { @@ -111,7 +107,7 @@ class ReturnReasonService extends BaseService { return item } - async delete(returnReasonId) { + async delete(returnReasonId: string): Promise { return this.atomicPhase_(async (manager) => { const rrRepo = manager.getCustomRepository(this.retReasonRepo_) diff --git a/packages/medusa/src/types/return-reason.ts b/packages/medusa/src/types/return-reason.ts new file mode 100644 index 0000000000..16fd17363d --- /dev/null +++ b/packages/medusa/src/types/return-reason.ts @@ -0,0 +1,14 @@ +export type CreateReturnReason = { + value: string + label: string + parent_return_reason_id?: string + description?: string + metadata?: Record +} + +export type UpdateReturnReason = { + description?: string + label?: string + parent_return_reason_id?: string + metadata?: Record +}