mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	* 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
		
			
				
	
	
		
			190 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import { Request, Response } from 'express';
 | |
| import Controller from '../controller';
 | |
| import { IUnleashConfig, IUnleashServices } from '../../types';
 | |
| import { Logger } from '../../logger';
 | |
| import AddonService from '../../services/addon-service';
 | |
| 
 | |
| import { extractUsername } from '../../util/extract-user';
 | |
| import {
 | |
|     CREATE_ADDON,
 | |
|     DELETE_ADDON,
 | |
|     NONE,
 | |
|     UPDATE_ADDON,
 | |
| } from '../../types/permissions';
 | |
| import { IAuthRequest } from '../unleash-types';
 | |
| import { createRequestSchema } from '../../openapi/util/create-request-schema';
 | |
| import { createResponseSchema } from '../../openapi/util/create-response-schema';
 | |
| import { OpenApiService } from '../../services/openapi-service';
 | |
| import { AddonSchema, addonSchema } from '../../openapi/spec/addon-schema';
 | |
| import { serializeDates } from '../../types/serialize-dates';
 | |
| import { AddonsSchema, addonsSchema } from '../../openapi/spec/addons-schema';
 | |
| import { emptyResponse } from '../../openapi/util/standard-responses';
 | |
| 
 | |
| type AddonServices = Pick<IUnleashServices, 'addonService' | 'openApiService'>;
 | |
| 
 | |
| const PATH = '/';
 | |
| 
 | |
| class AddonController extends Controller {
 | |
|     private logger: Logger;
 | |
| 
 | |
|     private addonService: AddonService;
 | |
| 
 | |
|     private openApiService: OpenApiService;
 | |
| 
 | |
|     constructor(
 | |
|         config: IUnleashConfig,
 | |
|         { addonService, openApiService }: AddonServices,
 | |
|     ) {
 | |
|         super(config);
 | |
|         this.logger = config.getLogger('/admin-api/addon.ts');
 | |
|         this.addonService = addonService;
 | |
|         this.openApiService = openApiService;
 | |
| 
 | |
|         this.route({
 | |
|             method: 'get',
 | |
|             path: '',
 | |
|             permission: NONE,
 | |
|             handler: this.getAddons,
 | |
|             middleware: [
 | |
|                 openApiService.validPath({
 | |
|                     tags: ['admin'],
 | |
|                     operationId: 'getAddons',
 | |
|                     responses: {
 | |
|                         200: createResponseSchema('addonsSchema'),
 | |
|                     },
 | |
|                 }),
 | |
|             ],
 | |
|         });
 | |
| 
 | |
|         this.route({
 | |
|             method: 'post',
 | |
|             path: '',
 | |
|             handler: this.createAddon,
 | |
|             permission: CREATE_ADDON,
 | |
|             middleware: [
 | |
|                 openApiService.validPath({
 | |
|                     tags: ['admin'],
 | |
|                     operationId: 'createAddon',
 | |
|                     requestBody: createRequestSchema('addonSchema'),
 | |
|                     responses: { 200: createResponseSchema('addonSchema') },
 | |
|                 }),
 | |
|             ],
 | |
|         });
 | |
| 
 | |
|         this.route({
 | |
|             method: 'get',
 | |
|             path: `${PATH}:id`,
 | |
|             handler: this.getAddon,
 | |
|             permission: NONE,
 | |
|             middleware: [
 | |
|                 openApiService.validPath({
 | |
|                     tags: ['admin'],
 | |
|                     operationId: 'getAddon',
 | |
|                     responses: { 200: createResponseSchema('addonSchema') },
 | |
|                 }),
 | |
|             ],
 | |
|         });
 | |
| 
 | |
|         this.route({
 | |
|             method: 'put',
 | |
|             path: `${PATH}:id`,
 | |
|             handler: this.updateAddon,
 | |
|             permission: UPDATE_ADDON,
 | |
|             middleware: [
 | |
|                 openApiService.validPath({
 | |
|                     tags: ['admin'],
 | |
|                     operationId: 'updateAddon',
 | |
|                     requestBody: createRequestSchema('addonSchema'),
 | |
|                     responses: { 200: createResponseSchema('addonSchema') },
 | |
|                 }),
 | |
|             ],
 | |
|         });
 | |
| 
 | |
|         this.route({
 | |
|             method: 'delete',
 | |
|             path: `${PATH}:id`,
 | |
|             handler: this.deleteAddon,
 | |
|             acceptAnyContentType: true,
 | |
|             permission: DELETE_ADDON,
 | |
|             middleware: [
 | |
|                 openApiService.validPath({
 | |
|                     tags: ['admin'],
 | |
|                     operationId: 'deleteAddon',
 | |
|                     responses: { 200: emptyResponse },
 | |
|                 }),
 | |
|             ],
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     async getAddons(req: Request, res: Response<AddonsSchema>): Promise<void> {
 | |
|         const addons = await this.addonService.getAddons();
 | |
|         const providers = this.addonService.getProviderDefinitions();
 | |
| 
 | |
|         this.openApiService.respondWithValidation(200, res, addonsSchema.$id, {
 | |
|             addons: serializeDates(addons),
 | |
|             providers: serializeDates(providers),
 | |
|         });
 | |
|     }
 | |
| 
 | |
|     async getAddon(
 | |
|         req: Request<{ id: number }, any, any, any>,
 | |
|         res: Response<AddonSchema>,
 | |
|     ): Promise<void> {
 | |
|         const { id } = req.params;
 | |
|         const addon = await this.addonService.getAddon(id);
 | |
|         this.openApiService.respondWithValidation(
 | |
|             200,
 | |
|             res,
 | |
|             addonSchema.$id,
 | |
|             serializeDates(addon),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     async updateAddon(
 | |
|         req: IAuthRequest<{ id: number }, any, any, any>,
 | |
|         res: Response<AddonSchema>,
 | |
|     ): Promise<void> {
 | |
|         const { id } = req.params;
 | |
|         const createdBy = extractUsername(req);
 | |
|         const data = req.body;
 | |
| 
 | |
|         const addon = await this.addonService.updateAddon(id, data, createdBy);
 | |
| 
 | |
|         this.openApiService.respondWithValidation(
 | |
|             200,
 | |
|             res,
 | |
|             addonSchema.$id,
 | |
|             serializeDates(addon),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     async createAddon(
 | |
|         req: IAuthRequest<AddonSchema, any, any, any>,
 | |
|         res: Response<AddonSchema>,
 | |
|     ): Promise<void> {
 | |
|         const createdBy = extractUsername(req);
 | |
|         const data = req.body;
 | |
|         const addon = await this.addonService.createAddon(data, createdBy);
 | |
| 
 | |
|         this.openApiService.respondWithValidation(
 | |
|             201,
 | |
|             res,
 | |
|             addonSchema.$id,
 | |
|             serializeDates(addon),
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     async deleteAddon(
 | |
|         req: IAuthRequest<{ id: number }, any, any, any>,
 | |
|         res: Response<void>,
 | |
|     ): Promise<void> {
 | |
|         const { id } = req.params;
 | |
|         const username = extractUsername(req);
 | |
|         await this.addonService.removeAddon(id, username);
 | |
| 
 | |
|         res.status(200).end();
 | |
|     }
 | |
| }
 | |
| export default AddonController;
 | |
| module.exports = AddonController;
 |