Files
storage-service/src/store/store.controller.ts
2020-07-26 13:03:37 +03:00

133 lines
4.4 KiB
TypeScript

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<StoreRequest[]> {
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<StoreRequest> {
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<null, StoreRequest>): Promise<StoreRequest> {
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<null, StoreRequest>): Promise<StoreRequest> {
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<StoreRequest> {
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<string> {
return '';
}
@Options(':key')
@Header(...ALLOW_ORIGIN_ALL)
@Header(...ALLOW_METHOD)
@Header(...ALLOW_CREDENTIALS)
@Header(...CONTENT_LENGTH)
@Header(...ALLOW_HEADERS)
@HttpCode(204)
async optionsByParam(): Promise<string> {
return '';
}
}