1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/src/lib/routes/admin-api/user-feedback.ts
Thomas Heartman 1a5749ca08
Refactor: move openapi utils into /util directory (#1777)
* Refactor: move openapi utils into /util directory

* Refactor: move utils test into `util` directory

* Refactor: don't expose standard responses tied to status codes

* Feat: update empty response description + make it const

* Chore: update snapshot with new response descriptions
2022-07-01 08:06:33 +02:00

115 lines
3.7 KiB
TypeScript

import { Response } from 'express';
import Controller from '../controller';
import { Logger } from '../../logger';
import { IUnleashConfig } from '../../types/option';
import { IUnleashServices } from '../../types/services';
import UserFeedbackService from '../../services/user-feedback-service';
import { IAuthRequest } from '../unleash-types';
import { NONE } from '../../types/permissions';
import { OpenApiService } from '../../services/openapi-service';
import {
feedbackSchema,
FeedbackSchema,
} from '../../openapi/spec/feedback-schema';
import { serializeDates } from '../../types/serialize-dates';
import { parseISO } from 'date-fns';
import { createRequestSchema } from '../../openapi/util/create-request-schema';
import { createResponseSchema } from '../../openapi/util/create-response-schema';
import BadDataError from '../../error/bad-data-error';
class UserFeedbackController extends Controller {
private logger: Logger;
private userFeedbackService: UserFeedbackService;
private openApiService: OpenApiService;
constructor(
config: IUnleashConfig,
{
userFeedbackService,
openApiService,
}: Pick<IUnleashServices, 'userFeedbackService' | 'openApiService'>,
) {
super(config);
this.logger = config.getLogger('feedback-controller.ts');
this.userFeedbackService = userFeedbackService;
this.openApiService = openApiService;
this.route({
method: 'post',
path: '',
handler: this.createFeedback,
permission: NONE,
middleware: [
openApiService.validPath({
tags: ['admin'],
operationId: 'createFeedback',
requestBody: createRequestSchema('feedbackSchema'),
responses: { 200: createResponseSchema('feedbackSchema') },
}),
],
});
this.route({
method: 'put',
path: '/:id',
handler: this.updateFeedback,
permission: NONE,
middleware: [
openApiService.validPath({
tags: ['admin'],
operationId: 'updateFeedback',
requestBody: createRequestSchema('feedbackSchema'),
responses: { 200: createResponseSchema('feedbackSchema') },
}),
],
});
}
private async createFeedback(
req: IAuthRequest<unknown, unknown, FeedbackSchema>,
res: Response<FeedbackSchema>,
): Promise<void> {
if (!req.body.feedbackId) {
throw new BadDataError('Missing feedbackId');
}
const updated = await this.userFeedbackService.updateFeedback({
feedbackId: req.body.feedbackId,
userId: req.user.id,
given: new Date(),
neverShow: req.body.neverShow || false,
});
this.openApiService.respondWithValidation(
200,
res,
feedbackSchema.$id,
serializeDates(updated),
);
}
private async updateFeedback(
req: IAuthRequest<{ id: string }, unknown, FeedbackSchema>,
res: Response<FeedbackSchema>,
): Promise<void> {
const updated = await this.userFeedbackService.updateFeedback({
feedbackId: req.params.id,
userId: req.user.id,
neverShow: req.body.neverShow || false,
given: req.body.given && parseISO(req.body.given),
});
this.openApiService.respondWithValidation(
200,
res,
feedbackSchema.$id,
serializeDates(updated),
);
}
}
module.exports = UserFeedbackController;
export default UserFeedbackController;