import {Controller, Get, Req, Post, Options, Header, Delete, HttpCode, Put, UseInterceptors} from '@nestjs/common'; import {StoreService} from './store.service'; import {Store, StoreRequest} from './store.schema'; import {ApiResponse, ApiTags, ApiParam, ApiBody} from '@nestjs/swagger'; import {ALLOW_ORIGIN_ALL, ALLOW_METHOD, ALLOW_CREDENTIALS, CONTENT_LENGTH, ALLOW_HEADERS, COLLECTION_STORE} from 'src/consts'; import {Request} from 'express'; import {LoggingInterceptor} from 'src/logs/logging.interceptor'; const prepareStoreToStoreRequest = ({ key, value, description, service_name, author }: Store): StoreRequest => ({ key, value, description, service_name, author, }); const makeApiHeader = (request: Request): string => { const apiHeader = request.headers?.['api-name']; return typeof apiHeader === 'string' ? apiHeader : ''; }; @UseInterceptors(LoggingInterceptor) @Controller(COLLECTION_STORE) @ApiTags(COLLECTION_STORE) export class StoreController { constructor( private readonly storeService: StoreService ) {} @Get() @Header(...ALLOW_ORIGIN_ALL) @ApiResponse({ status: 200, description: 'Список всех пар ключ-значение', type: [StoreRequest], }) async findAll(@Req() request: Request): Promise { const api = makeApiHeader(request); const storeList = await this.storeService.findAll(api); return storeList.map(prepareStoreToStoreRequest); } @Get(':key') @Header(...ALLOW_ORIGIN_ALL) @ApiResponse({ status: 200, description: 'Возвращает пару ключ-значение по ключу', type: StoreRequest, }) @ApiParam({ name: 'key', description: 'Уникальный ключ для получения api', }) async findOne(@Req() request: Request<{key: string}>): Promise { const {key} = request.params; const api = makeApiHeader(request); const store = await this.storeService.findOne(api, key); return prepareStoreToStoreRequest(store); } @Post() @Header(...ALLOW_ORIGIN_ALL) @ApiResponse({ status: 201, description: 'Создает новую пару ключ-значение', type: StoreRequest, }) @ApiBody({ type: StoreRequest, description: 'Принимает объект для создания api' }) async create(@Req() request: Request): Promise { const api = makeApiHeader(request); const store = await this.storeService.create(api, request.body); return prepareStoreToStoreRequest(store); } @Put() @Header(...ALLOW_ORIGIN_ALL) @ApiResponse({ status: 200, description: 'Обновляет по ключу объект и мета-поля, кроме author', type: StoreRequest, }) @ApiBody({ type: StoreRequest, description: 'Принимает объект для обновления api' }) async update(@Req() request: Request): Promise { const api = makeApiHeader(request); const store = await this.storeService.update(api, request.body); return prepareStoreToStoreRequest(store); } @Delete(':key') @Header(...ALLOW_ORIGIN_ALL) @ApiResponse({ status: 200, description: 'Удаляет пару ключ-значение по ключу', type: StoreRequest, }) @ApiParam({ name: 'key', description: 'Уникальный ключ для удаления api', }) async removeOne(@Req() request: Request<{key: string}>): Promise { const {key} = request.params; const api = makeApiHeader(request); const store = await this.storeService.removeOne(api, key); return prepareStoreToStoreRequest(store); } @Options('') @Header(...ALLOW_ORIGIN_ALL) @Header(...ALLOW_METHOD) @Header(...ALLOW_CREDENTIALS) @Header(...CONTENT_LENGTH) @Header(...ALLOW_HEADERS) @HttpCode(204) async options(): Promise { return ''; } @Options(':key') @Header(...ALLOW_ORIGIN_ALL) @Header(...ALLOW_METHOD) @Header(...ALLOW_CREDENTIALS) @Header(...CONTENT_LENGTH) @Header(...ALLOW_HEADERS) @HttpCode(204) async optionsByParam(): Promise { return ''; } }