From 657afc2b2c225c0c6ae0822401d83806bc96893d Mon Sep 17 00:00:00 2001 From: alexeh Date: Sat, 2 Nov 2024 05:56:53 +0100 Subject: [PATCH] refactor to use contract --- .../custom-projects.controller.ts | 50 +++++++++++++++---- shared/contracts/custom-projects.contract.ts | 10 ++++ 2 files changed, 49 insertions(+), 11 deletions(-) diff --git a/api/src/modules/custom-projects/custom-projects.controller.ts b/api/src/modules/custom-projects/custom-projects.controller.ts index 40564e23..7200f207 100644 --- a/api/src/modules/custom-projects/custom-projects.controller.ts +++ b/api/src/modules/custom-projects/custom-projects.controller.ts @@ -1,26 +1,54 @@ -import { Controller, Get } from '@nestjs/common'; +import { Controller, HttpStatus } from '@nestjs/common'; import { CountriesService } from '@api/modules/countries/countries.service'; import { DataSource } from 'typeorm'; import { ModelAssumptions } from '@shared/entities/model-assumptions.entity'; +import { tsRestHandler, TsRestHandler } from '@ts-rest/nest'; +import { ControllerResponse } from '@api/types/controller-response.type'; +import { customProjectContract } from '@shared/contracts/custom-projects.contract'; -@Controller('custom-projects') +@Controller() export class CustomProjectsController { constructor( private readonly countries: CountriesService, private readonly dataSource: DataSource, ) {} - @Get('available-countries') - async getAvailableCountriesToCreateACustomProject() { - const data = - await this.countries.getAvailableCountriesToCreateACustomProject(); - return { data }; + @TsRestHandler(customProjectContract.getAvailableCountries) + async getAvailableCountriesToCreateACustomProject(): Promise { + return tsRestHandler( + customProjectContract.getAvailableCountries, + async () => { + const data = + await this.countries.getAvailableCountriesToCreateACustomProject(); + return { body: { data }, status: HttpStatus.OK }; + }, + ); } // TODO: This should go in another controller, probably methodology controller. according to the design - @Get('/assumptions') - async getAssumptions() { - const data = await this.dataSource.getRepository(ModelAssumptions).find(); - return { data }; + @TsRestHandler(customProjectContract.getDefaultAssumptions) + async getAssumptions(): Promise { + return tsRestHandler( + customProjectContract.getDefaultAssumptions, + async () => { + const data = await this.dataSource + .getRepository(ModelAssumptions) + .find(); + return { body: { data }, status: HttpStatus.OK }; + }, + ); } + + // @TsRestHandler(customProjectContract.createCustomProject) + // async create(): Promise { + // return tsRestHandler( + // customProjectContract.createCustomProject, + // async ({ body }) => { + // // return { + // // status: 201, + // // body: null, + // // }; + // }, + // ); + // } } diff --git a/shared/contracts/custom-projects.contract.ts b/shared/contracts/custom-projects.contract.ts index 4c63e819..5325c02e 100644 --- a/shared/contracts/custom-projects.contract.ts +++ b/shared/contracts/custom-projects.contract.ts @@ -2,6 +2,8 @@ import { initContract } from "@ts-rest/core"; import { ApiResponse } from "@shared/dtos/global/api-response.dto"; import { Country } from "@shared/entities/country.entity"; import { ModelAssumptions } from "@shared/entities/model-assumptions.entity"; +import { CustomProject } from "@shared/entities/custom-project.entity"; +import { CreateCustomProjectSchema } from "@shared/schemas/custom-projects/create-custom-project.schema"; // TODO: This is a scaffold. We need to define types for responses, zod schemas for body and query param validation etc. @@ -24,4 +26,12 @@ export const customProjectContract = contract.router({ }, summary: "Get default model assumptions", }, + createCustomProject: { + method: "POST", + path: "/custom-projects", + responses: { + 201: contract.type>(), + }, + body: CreateCustomProjectSchema, + }, });