mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	refactor: add OpenAPI schema to api-token controller (#1716)
* refactor: add OpenAPI schema to api-token controller * refactor: address PR comments * fix: status codes on environment toggling * fix tests * refactor: address PR comments * refactor: expiresAtSchema -> update-api-token-schema
This commit is contained in:
		
							parent
							
								
									bb3c722f67
								
							
						
					
					
						commit
						2354656632
					
				@ -1,8 +1,11 @@
 | 
			
		||||
import { OpenAPIV3 } from 'openapi-types';
 | 
			
		||||
import { apiTokenSchema } from './spec/api-token-schema';
 | 
			
		||||
import { apiTokensSchema } from './spec/api-tokens-schema';
 | 
			
		||||
import { cloneFeatureSchema } from './spec/clone-feature-schema';
 | 
			
		||||
import { constraintSchema } from './spec/constraint-schema';
 | 
			
		||||
import { contextFieldSchema } from './spec/context-field-schema';
 | 
			
		||||
import { contextFieldsSchema } from './spec/context-fields-schema';
 | 
			
		||||
import { createApiTokenSchema } from './spec/create-api-token-schema';
 | 
			
		||||
import { createFeatureSchema } from './spec/create-feature-schema';
 | 
			
		||||
import { createStrategySchema } from './spec/create-strategy-schema';
 | 
			
		||||
import { environmentSchema } from './spec/environment-schema';
 | 
			
		||||
@ -33,24 +36,28 @@ import { splashSchema } from './spec/splash-schema';
 | 
			
		||||
import { strategySchema } from './spec/strategy-schema';
 | 
			
		||||
import { tagSchema } from './spec/tag-schema';
 | 
			
		||||
import { tagsSchema } from './spec/tags-schema';
 | 
			
		||||
import { tagTypeSchema } from './spec/tag-type-schema';
 | 
			
		||||
import { tagTypesSchema } from './spec/tag-types-schema';
 | 
			
		||||
import { uiConfigSchema } from './spec/ui-config-schema';
 | 
			
		||||
import { updateFeatureSchema } from './spec/update-feature-schema';
 | 
			
		||||
import { updateStrategySchema } from './spec/update-strategy-schema';
 | 
			
		||||
import { updateApiTokenSchema } from './spec/update-api-token-schema';
 | 
			
		||||
import { updateTagTypeSchema } from './spec/update-tag-type-schema';
 | 
			
		||||
import { upsertContextFieldSchema } from './spec/upsert-context-field-schema';
 | 
			
		||||
import { validateTagTypeSchema } from './spec/validate-tag-type-schema';
 | 
			
		||||
import { variantSchema } from './spec/variant-schema';
 | 
			
		||||
import { variantsSchema } from './spec/variants-schema';
 | 
			
		||||
import { versionSchema } from './spec/version-schema';
 | 
			
		||||
import { tagTypeSchema } from './spec/tag-type-schema';
 | 
			
		||||
import { tagTypesSchema } from './spec/tag-types-schema';
 | 
			
		||||
import { updateTagTypeSchema } from './spec/update-tag-type-schema';
 | 
			
		||||
import { validateTagTypeSchema } from './spec/validate-tag-type-schema';
 | 
			
		||||
 | 
			
		||||
// All schemas in `openapi/spec` should be listed here.
 | 
			
		||||
export const schemas = {
 | 
			
		||||
    apiTokenSchema,
 | 
			
		||||
    apiTokensSchema,
 | 
			
		||||
    cloneFeatureSchema,
 | 
			
		||||
    constraintSchema,
 | 
			
		||||
    contextFieldSchema,
 | 
			
		||||
    contextFieldsSchema,
 | 
			
		||||
    createApiTokenSchema,
 | 
			
		||||
    createFeatureSchema,
 | 
			
		||||
    createStrategySchema,
 | 
			
		||||
    environmentSchema,
 | 
			
		||||
@ -84,6 +91,7 @@ export const schemas = {
 | 
			
		||||
    uiConfigSchema,
 | 
			
		||||
    updateFeatureSchema,
 | 
			
		||||
    updateStrategySchema,
 | 
			
		||||
    updateApiTokenSchema,
 | 
			
		||||
    updateTagTypeSchema,
 | 
			
		||||
    upsertContextFieldSchema,
 | 
			
		||||
    validateTagTypeSchema,
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,19 @@
 | 
			
		||||
// Jest Snapshot v1, https://goo.gl/fbAQLP
 | 
			
		||||
 | 
			
		||||
exports[`apiTokenSchema empty 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "data": Object {},
 | 
			
		||||
  "errors": Array [
 | 
			
		||||
    Object {
 | 
			
		||||
      "instancePath": "",
 | 
			
		||||
      "keyword": "required",
 | 
			
		||||
      "message": "must have required property 'username'",
 | 
			
		||||
      "params": Object {
 | 
			
		||||
        "missingProperty": "username",
 | 
			
		||||
      },
 | 
			
		||||
      "schemaPath": "#/required",
 | 
			
		||||
    },
 | 
			
		||||
  ],
 | 
			
		||||
  "schema": "#/components/schemas/apiTokenSchema",
 | 
			
		||||
}
 | 
			
		||||
`;
 | 
			
		||||
							
								
								
									
										27
									
								
								src/lib/openapi/spec/api-token-schema.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								src/lib/openapi/spec/api-token-schema.test.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,27 @@
 | 
			
		||||
import { ApiTokenType } from '../../types/models/api-token';
 | 
			
		||||
import { validateSchema } from '../validate';
 | 
			
		||||
import { ApiTokenSchema } from './api-token-schema';
 | 
			
		||||
 | 
			
		||||
test('apiTokenSchema', () => {
 | 
			
		||||
    const data: ApiTokenSchema = {
 | 
			
		||||
        secret: '',
 | 
			
		||||
        username: '',
 | 
			
		||||
        type: ApiTokenType.CLIENT,
 | 
			
		||||
        environment: '',
 | 
			
		||||
        projects: [],
 | 
			
		||||
        expiresAt: '2022-01-01T00:00:00.000Z',
 | 
			
		||||
        createdAt: '2022-01-01T00:00:00.000Z',
 | 
			
		||||
        seenAt: '2022-01-01T00:00:00.000Z',
 | 
			
		||||
        project: '',
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    expect(
 | 
			
		||||
        validateSchema('#/components/schemas/apiTokenSchema', data),
 | 
			
		||||
    ).toBeUndefined();
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('apiTokenSchema empty', () => {
 | 
			
		||||
    expect(
 | 
			
		||||
        validateSchema('#/components/schemas/apiTokenSchema', {}),
 | 
			
		||||
    ).toMatchSnapshot();
 | 
			
		||||
});
 | 
			
		||||
							
								
								
									
										51
									
								
								src/lib/openapi/spec/api-token-schema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								src/lib/openapi/spec/api-token-schema.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,51 @@
 | 
			
		||||
import { FromSchema } from 'json-schema-to-ts';
 | 
			
		||||
import { ApiTokenType } from '../../types/models/api-token';
 | 
			
		||||
 | 
			
		||||
export const apiTokenSchema = {
 | 
			
		||||
    $id: '#/components/schemas/apiTokenSchema',
 | 
			
		||||
    type: 'object',
 | 
			
		||||
    additionalProperties: false,
 | 
			
		||||
    required: ['username', 'type'],
 | 
			
		||||
    properties: {
 | 
			
		||||
        secret: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        username: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        type: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            description: `${Object.values(ApiTokenType).join(', ')}.`,
 | 
			
		||||
        },
 | 
			
		||||
        environment: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        project: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        projects: {
 | 
			
		||||
            type: 'array',
 | 
			
		||||
            items: {
 | 
			
		||||
                type: 'string',
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
        expiresAt: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            format: 'date-time',
 | 
			
		||||
            nullable: true,
 | 
			
		||||
        },
 | 
			
		||||
        createdAt: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            format: 'date-time',
 | 
			
		||||
            nullable: true,
 | 
			
		||||
        },
 | 
			
		||||
        seenAt: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            format: 'date-time',
 | 
			
		||||
            nullable: true,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    components: {},
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
export type ApiTokenSchema = FromSchema<typeof apiTokenSchema>;
 | 
			
		||||
							
								
								
									
										24
									
								
								src/lib/openapi/spec/api-tokens-schema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/lib/openapi/spec/api-tokens-schema.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,24 @@
 | 
			
		||||
import { FromSchema } from 'json-schema-to-ts';
 | 
			
		||||
import { apiTokenSchema } from './api-token-schema';
 | 
			
		||||
 | 
			
		||||
export const apiTokensSchema = {
 | 
			
		||||
    $id: '#/components/schemas/apiTokensSchema',
 | 
			
		||||
    type: 'object',
 | 
			
		||||
    additionalProperties: false,
 | 
			
		||||
    required: ['tokens'],
 | 
			
		||||
    properties: {
 | 
			
		||||
        tokens: {
 | 
			
		||||
            type: 'array',
 | 
			
		||||
            items: {
 | 
			
		||||
                $ref: '#/components/schemas/apiTokenSchema',
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    components: {
 | 
			
		||||
        schemas: {
 | 
			
		||||
            apiTokenSchema,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
export type ApiTokensSchema = FromSchema<typeof apiTokensSchema>;
 | 
			
		||||
							
								
								
									
										41
									
								
								src/lib/openapi/spec/create-api-token-schema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/lib/openapi/spec/create-api-token-schema.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,41 @@
 | 
			
		||||
import { FromSchema } from 'json-schema-to-ts';
 | 
			
		||||
import { ApiTokenType } from '../../types/models/api-token';
 | 
			
		||||
 | 
			
		||||
export const createApiTokenSchema = {
 | 
			
		||||
    $id: '#/components/schemas/createApiTokenSchema',
 | 
			
		||||
    type: 'object',
 | 
			
		||||
    additionalProperties: false,
 | 
			
		||||
    required: ['username', 'type'],
 | 
			
		||||
    properties: {
 | 
			
		||||
        secret: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        username: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        type: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            description: `${Object.values(ApiTokenType).join(', ')}.`,
 | 
			
		||||
        },
 | 
			
		||||
        environment: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        project: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
        },
 | 
			
		||||
        projects: {
 | 
			
		||||
            type: 'array',
 | 
			
		||||
            items: {
 | 
			
		||||
                type: 'string',
 | 
			
		||||
            },
 | 
			
		||||
        },
 | 
			
		||||
        expiresAt: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            format: 'date-time',
 | 
			
		||||
            nullable: true,
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    components: {},
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
export type CreateApiTokenSchema = FromSchema<typeof createApiTokenSchema>;
 | 
			
		||||
							
								
								
									
										17
									
								
								src/lib/openapi/spec/update-api-token-schema.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/lib/openapi/spec/update-api-token-schema.ts
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
			
		||||
import { FromSchema } from 'json-schema-to-ts';
 | 
			
		||||
 | 
			
		||||
export const updateApiTokenSchema = {
 | 
			
		||||
    $id: '#/components/schemas/updateApiTokenSchema',
 | 
			
		||||
    type: 'object',
 | 
			
		||||
    additionalProperties: false,
 | 
			
		||||
    required: ['expiresAt'],
 | 
			
		||||
    properties: {
 | 
			
		||||
        expiresAt: {
 | 
			
		||||
            type: 'string',
 | 
			
		||||
            format: 'date-time',
 | 
			
		||||
        },
 | 
			
		||||
    },
 | 
			
		||||
    components: {},
 | 
			
		||||
} as const;
 | 
			
		||||
 | 
			
		||||
export type UpdateApiTokenSchema = FromSchema<typeof updateApiTokenSchema>;
 | 
			
		||||
@ -16,51 +16,150 @@ import User from '../../types/user';
 | 
			
		||||
import { IUnleashConfig } from '../../types/option';
 | 
			
		||||
import { ApiTokenType, IApiToken } from '../../types/models/api-token';
 | 
			
		||||
import { createApiToken } from '../../schema/api-token-schema';
 | 
			
		||||
import { OpenApiService } from '../../services/openapi-service';
 | 
			
		||||
import { IUnleashServices } from '../../types';
 | 
			
		||||
import { createRequestSchema, createResponseSchema } from '../../openapi';
 | 
			
		||||
import {
 | 
			
		||||
    apiTokensSchema,
 | 
			
		||||
    ApiTokensSchema,
 | 
			
		||||
} from '../../openapi/spec/api-tokens-schema';
 | 
			
		||||
import { serializeDates } from '../../types/serialize-dates';
 | 
			
		||||
import {
 | 
			
		||||
    apiTokenSchema,
 | 
			
		||||
    ApiTokenSchema,
 | 
			
		||||
} from '../../openapi/spec/api-token-schema';
 | 
			
		||||
import { emptyResponse } from '../../openapi/spec/empty-response';
 | 
			
		||||
import { UpdateApiTokenSchema } from '../../openapi/spec/update-api-token-schema';
 | 
			
		||||
 | 
			
		||||
interface IServices {
 | 
			
		||||
    apiTokenService: ApiTokenService;
 | 
			
		||||
    accessService: AccessService;
 | 
			
		||||
interface TokenParam {
 | 
			
		||||
    token: string;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
class ApiTokenController extends Controller {
 | 
			
		||||
export class ApiTokenController extends Controller {
 | 
			
		||||
    private apiTokenService: ApiTokenService;
 | 
			
		||||
 | 
			
		||||
    private accessService: AccessService;
 | 
			
		||||
 | 
			
		||||
    private openApiService: OpenApiService;
 | 
			
		||||
 | 
			
		||||
    private logger: Logger;
 | 
			
		||||
 | 
			
		||||
    constructor(config: IUnleashConfig, services: IServices) {
 | 
			
		||||
    constructor(
 | 
			
		||||
        config: IUnleashConfig,
 | 
			
		||||
        {
 | 
			
		||||
            apiTokenService,
 | 
			
		||||
            accessService,
 | 
			
		||||
            openApiService,
 | 
			
		||||
        }: Pick<
 | 
			
		||||
            IUnleashServices,
 | 
			
		||||
            'apiTokenService' | 'accessService' | 'openApiService'
 | 
			
		||||
        >,
 | 
			
		||||
    ) {
 | 
			
		||||
        super(config);
 | 
			
		||||
        this.apiTokenService = services.apiTokenService;
 | 
			
		||||
        this.accessService = services.accessService;
 | 
			
		||||
        this.apiTokenService = apiTokenService;
 | 
			
		||||
        this.accessService = accessService;
 | 
			
		||||
        this.openApiService = openApiService;
 | 
			
		||||
        this.logger = config.getLogger('api-token-controller.js');
 | 
			
		||||
 | 
			
		||||
        this.get('/', this.getAllApiTokens, READ_API_TOKEN);
 | 
			
		||||
        this.post('/', this.createApiToken, CREATE_API_TOKEN);
 | 
			
		||||
        this.put('/:token', this.updateApiToken, UPDATE_API_TOKEN);
 | 
			
		||||
        this.delete('/:token', this.deleteApiToken, DELETE_API_TOKEN);
 | 
			
		||||
        this.route({
 | 
			
		||||
            method: 'get',
 | 
			
		||||
            path: '',
 | 
			
		||||
            handler: this.getAllApiTokens,
 | 
			
		||||
            permission: READ_API_TOKEN,
 | 
			
		||||
            middleware: [
 | 
			
		||||
                openApiService.validPath({
 | 
			
		||||
                    tags: ['admin'],
 | 
			
		||||
                    operationId: 'getAllApiTokens',
 | 
			
		||||
                    responses: {
 | 
			
		||||
                        200: createResponseSchema('apiTokensSchema'),
 | 
			
		||||
                    },
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.route({
 | 
			
		||||
            method: 'post',
 | 
			
		||||
            path: '',
 | 
			
		||||
            handler: this.createApiToken,
 | 
			
		||||
            permission: CREATE_API_TOKEN,
 | 
			
		||||
            middleware: [
 | 
			
		||||
                openApiService.validPath({
 | 
			
		||||
                    tags: ['admin'],
 | 
			
		||||
                    operationId: 'createApiToken',
 | 
			
		||||
                    requestBody: createRequestSchema('createApiTokenSchema'),
 | 
			
		||||
                    responses: {
 | 
			
		||||
                        201: createResponseSchema('apiTokenSchema'),
 | 
			
		||||
                    },
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.route({
 | 
			
		||||
            method: 'put',
 | 
			
		||||
            path: '/:token',
 | 
			
		||||
            handler: this.updateApiToken,
 | 
			
		||||
            permission: UPDATE_API_TOKEN,
 | 
			
		||||
            middleware: [
 | 
			
		||||
                openApiService.validPath({
 | 
			
		||||
                    tags: ['admin'],
 | 
			
		||||
                    operationId: 'updateApiToken',
 | 
			
		||||
                    requestBody: createRequestSchema('updateApiTokenSchema'),
 | 
			
		||||
                    responses: {
 | 
			
		||||
                        200: emptyResponse,
 | 
			
		||||
                    },
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        this.route({
 | 
			
		||||
            method: 'delete',
 | 
			
		||||
            path: '/:token',
 | 
			
		||||
            handler: this.deleteApiToken,
 | 
			
		||||
            acceptAnyContentType: true,
 | 
			
		||||
            permission: DELETE_API_TOKEN,
 | 
			
		||||
            middleware: [
 | 
			
		||||
                openApiService.validPath({
 | 
			
		||||
                    tags: ['admin'],
 | 
			
		||||
                    operationId: 'deleteApiToken',
 | 
			
		||||
                    responses: {
 | 
			
		||||
                        200: emptyResponse,
 | 
			
		||||
                    },
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
        });
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async getAllApiTokens(req: IAuthRequest, res: Response): Promise<void> {
 | 
			
		||||
    async getAllApiTokens(
 | 
			
		||||
        req: IAuthRequest,
 | 
			
		||||
        res: Response<ApiTokensSchema>,
 | 
			
		||||
    ): Promise<void> {
 | 
			
		||||
        const { user } = req;
 | 
			
		||||
        const tokens = await this.accessibleTokens(user);
 | 
			
		||||
        res.json({ tokens });
 | 
			
		||||
        this.openApiService.respondWithValidation(
 | 
			
		||||
            200,
 | 
			
		||||
            res,
 | 
			
		||||
            apiTokensSchema.$id,
 | 
			
		||||
            { tokens: serializeDates(tokens) },
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async createApiToken(req: IAuthRequest, res: Response): Promise<any> {
 | 
			
		||||
    async createApiToken(
 | 
			
		||||
        req: IAuthRequest,
 | 
			
		||||
        res: Response<ApiTokenSchema>,
 | 
			
		||||
    ): Promise<any> {
 | 
			
		||||
        const createToken = await createApiToken.validateAsync(req.body);
 | 
			
		||||
        const token = await this.apiTokenService.createApiToken(createToken);
 | 
			
		||||
        return res.status(201).json(token);
 | 
			
		||||
        this.openApiService.respondWithValidation(
 | 
			
		||||
            201,
 | 
			
		||||
            res,
 | 
			
		||||
            apiTokenSchema.$id,
 | 
			
		||||
            serializeDates(token),
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async deleteApiToken(req: IAuthRequest, res: Response): Promise<void> {
 | 
			
		||||
        const { token } = req.params;
 | 
			
		||||
 | 
			
		||||
        await this.apiTokenService.delete(token);
 | 
			
		||||
        res.status(200).end();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async updateApiToken(req: IAuthRequest, res: Response): Promise<any> {
 | 
			
		||||
    async updateApiToken(
 | 
			
		||||
        req: IAuthRequest<TokenParam, void, UpdateApiTokenSchema>,
 | 
			
		||||
        res: Response,
 | 
			
		||||
    ): Promise<any> {
 | 
			
		||||
        const { token } = req.params;
 | 
			
		||||
        const { expiresAt } = req.body;
 | 
			
		||||
 | 
			
		||||
@ -69,10 +168,20 @@ class ApiTokenController extends Controller {
 | 
			
		||||
            return res.status(400).send();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        await this.apiTokenService.updateExpiry(token, expiresAt);
 | 
			
		||||
        await this.apiTokenService.updateExpiry(token, new Date(expiresAt));
 | 
			
		||||
        return res.status(200).end();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    async deleteApiToken(
 | 
			
		||||
        req: IAuthRequest<TokenParam>,
 | 
			
		||||
        res: Response,
 | 
			
		||||
    ): Promise<void> {
 | 
			
		||||
        const { token } = req.params;
 | 
			
		||||
 | 
			
		||||
        await this.apiTokenService.delete(token);
 | 
			
		||||
        res.status(200).end();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private async accessibleTokens(user: User): Promise<IApiToken[]> {
 | 
			
		||||
        const allTokens = await this.apiTokenService.getAllTokens();
 | 
			
		||||
 | 
			
		||||
@ -84,9 +193,6 @@ class ApiTokenController extends Controller {
 | 
			
		||||
            return allTokens;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return allTokens.filter((t) => t.type !== ApiTokenType.ADMIN);
 | 
			
		||||
        return allTokens.filter((token) => token.type !== ApiTokenType.ADMIN);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = ApiTokenController;
 | 
			
		||||
export default ApiTokenController;
 | 
			
		||||
 | 
			
		||||
@ -96,7 +96,7 @@ export class EnvironmentsController extends Controller {
 | 
			
		||||
                openApiService.validPath({
 | 
			
		||||
                    tags: ['admin'],
 | 
			
		||||
                    operationId: 'toggleEnvironmentOn',
 | 
			
		||||
                    responses: { 200: emptyResponse },
 | 
			
		||||
                    responses: { 204: emptyResponse },
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
        });
 | 
			
		||||
@ -111,7 +111,7 @@ export class EnvironmentsController extends Controller {
 | 
			
		||||
                openApiService.validPath({
 | 
			
		||||
                    tags: ['admin'],
 | 
			
		||||
                    operationId: 'toggleEnvironmentOff',
 | 
			
		||||
                    responses: { 200: emptyResponse },
 | 
			
		||||
                    responses: { 204: emptyResponse },
 | 
			
		||||
                }),
 | 
			
		||||
            ],
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
@ -17,7 +17,7 @@ import StateController from './state';
 | 
			
		||||
import TagController from './tag';
 | 
			
		||||
import TagTypeController from './tag-type';
 | 
			
		||||
import AddonController from './addon';
 | 
			
		||||
import ApiTokenController from './api-token';
 | 
			
		||||
import { ApiTokenController } from './api-token';
 | 
			
		||||
import UserAdminController from './user-admin';
 | 
			
		||||
import EmailController from './email';
 | 
			
		||||
import UserFeedbackController from './user-feedback';
 | 
			
		||||
 | 
			
		||||
@ -51,6 +51,68 @@ exports[`should serve the OpenAPI spec 1`] = `
 | 
			
		||||
Object {
 | 
			
		||||
  "components": Object {
 | 
			
		||||
    "schemas": Object {
 | 
			
		||||
      "apiTokenSchema": Object {
 | 
			
		||||
        "additionalProperties": false,
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "createdAt": Object {
 | 
			
		||||
            "format": "date-time",
 | 
			
		||||
            "nullable": true,
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "environment": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "expiresAt": Object {
 | 
			
		||||
            "format": "date-time",
 | 
			
		||||
            "nullable": true,
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "project": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "projects": Object {
 | 
			
		||||
            "items": Object {
 | 
			
		||||
              "type": "string",
 | 
			
		||||
            },
 | 
			
		||||
            "type": "array",
 | 
			
		||||
          },
 | 
			
		||||
          "secret": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "seenAt": Object {
 | 
			
		||||
            "format": "date-time",
 | 
			
		||||
            "nullable": true,
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "type": Object {
 | 
			
		||||
            "description": "client, admin.",
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "username": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "required": Array [
 | 
			
		||||
          "username",
 | 
			
		||||
          "type",
 | 
			
		||||
        ],
 | 
			
		||||
        "type": "object",
 | 
			
		||||
      },
 | 
			
		||||
      "apiTokensSchema": Object {
 | 
			
		||||
        "additionalProperties": false,
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "tokens": Object {
 | 
			
		||||
            "items": Object {
 | 
			
		||||
              "$ref": "#/components/schemas/apiTokenSchema",
 | 
			
		||||
            },
 | 
			
		||||
            "type": "array",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "required": Array [
 | 
			
		||||
          "tokens",
 | 
			
		||||
        ],
 | 
			
		||||
        "type": "object",
 | 
			
		||||
      },
 | 
			
		||||
      "cloneFeatureSchema": Object {
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "name": Object {
 | 
			
		||||
@ -151,6 +213,43 @@ Object {
 | 
			
		||||
        },
 | 
			
		||||
        "type": "array",
 | 
			
		||||
      },
 | 
			
		||||
      "createApiTokenSchema": Object {
 | 
			
		||||
        "additionalProperties": false,
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "environment": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "expiresAt": Object {
 | 
			
		||||
            "format": "date-time",
 | 
			
		||||
            "nullable": true,
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "project": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "projects": Object {
 | 
			
		||||
            "items": Object {
 | 
			
		||||
              "type": "string",
 | 
			
		||||
            },
 | 
			
		||||
            "type": "array",
 | 
			
		||||
          },
 | 
			
		||||
          "secret": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "type": Object {
 | 
			
		||||
            "description": "client, admin.",
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
          "username": Object {
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "required": Array [
 | 
			
		||||
          "username",
 | 
			
		||||
          "type",
 | 
			
		||||
        ],
 | 
			
		||||
        "type": "object",
 | 
			
		||||
      },
 | 
			
		||||
      "createFeatureSchema": Object {
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "description": Object {
 | 
			
		||||
@ -919,6 +1018,19 @@ Object {
 | 
			
		||||
        ],
 | 
			
		||||
        "type": "object",
 | 
			
		||||
      },
 | 
			
		||||
      "updateApiTokenSchema": Object {
 | 
			
		||||
        "additionalProperties": false,
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "expiresAt": Object {
 | 
			
		||||
            "format": "date-time",
 | 
			
		||||
            "type": "string",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "required": Array [
 | 
			
		||||
          "expiresAt",
 | 
			
		||||
        ],
 | 
			
		||||
        "type": "object",
 | 
			
		||||
      },
 | 
			
		||||
      "updateFeatureSchema": Object {
 | 
			
		||||
        "properties": Object {
 | 
			
		||||
          "archived": Object {
 | 
			
		||||
@ -1142,6 +1254,110 @@ Object {
 | 
			
		||||
  },
 | 
			
		||||
  "openapi": "3.0.3",
 | 
			
		||||
  "paths": Object {
 | 
			
		||||
    "/api/admin/api-tokens": Object {
 | 
			
		||||
      "get": Object {
 | 
			
		||||
        "operationId": "getAllApiTokens",
 | 
			
		||||
        "responses": Object {
 | 
			
		||||
          "200": Object {
 | 
			
		||||
            "content": Object {
 | 
			
		||||
              "application/json": Object {
 | 
			
		||||
                "schema": Object {
 | 
			
		||||
                  "$ref": "#/components/schemas/apiTokensSchema",
 | 
			
		||||
                },
 | 
			
		||||
              },
 | 
			
		||||
            },
 | 
			
		||||
            "description": "apiTokensSchema",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "tags": Array [
 | 
			
		||||
          "admin",
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      "post": Object {
 | 
			
		||||
        "operationId": "createApiToken",
 | 
			
		||||
        "requestBody": Object {
 | 
			
		||||
          "content": Object {
 | 
			
		||||
            "application/json": Object {
 | 
			
		||||
              "schema": Object {
 | 
			
		||||
                "$ref": "#/components/schemas/createApiTokenSchema",
 | 
			
		||||
              },
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
          "description": "createApiTokenSchema",
 | 
			
		||||
          "required": true,
 | 
			
		||||
        },
 | 
			
		||||
        "responses": Object {
 | 
			
		||||
          "201": Object {
 | 
			
		||||
            "content": Object {
 | 
			
		||||
              "application/json": Object {
 | 
			
		||||
                "schema": Object {
 | 
			
		||||
                  "$ref": "#/components/schemas/apiTokenSchema",
 | 
			
		||||
                },
 | 
			
		||||
              },
 | 
			
		||||
            },
 | 
			
		||||
            "description": "apiTokenSchema",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "tags": Array [
 | 
			
		||||
          "admin",
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    "/api/admin/api-tokens/{token}": Object {
 | 
			
		||||
      "delete": Object {
 | 
			
		||||
        "operationId": "deleteApiToken",
 | 
			
		||||
        "parameters": Array [
 | 
			
		||||
          Object {
 | 
			
		||||
            "in": "path",
 | 
			
		||||
            "name": "token",
 | 
			
		||||
            "required": true,
 | 
			
		||||
            "schema": Object {
 | 
			
		||||
              "type": "string",
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
        "responses": Object {
 | 
			
		||||
          "200": Object {
 | 
			
		||||
            "description": "emptyResponse",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "tags": Array [
 | 
			
		||||
          "admin",
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
      "put": Object {
 | 
			
		||||
        "operationId": "updateApiToken",
 | 
			
		||||
        "parameters": Array [
 | 
			
		||||
          Object {
 | 
			
		||||
            "in": "path",
 | 
			
		||||
            "name": "token",
 | 
			
		||||
            "required": true,
 | 
			
		||||
            "schema": Object {
 | 
			
		||||
              "type": "string",
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
        "requestBody": Object {
 | 
			
		||||
          "content": Object {
 | 
			
		||||
            "application/json": Object {
 | 
			
		||||
              "schema": Object {
 | 
			
		||||
                "$ref": "#/components/schemas/updateApiTokenSchema",
 | 
			
		||||
              },
 | 
			
		||||
            },
 | 
			
		||||
          },
 | 
			
		||||
          "description": "updateApiTokenSchema",
 | 
			
		||||
          "required": true,
 | 
			
		||||
        },
 | 
			
		||||
        "responses": Object {
 | 
			
		||||
          "200": Object {
 | 
			
		||||
            "description": "emptyResponse",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
        "tags": Array [
 | 
			
		||||
          "admin",
 | 
			
		||||
        ],
 | 
			
		||||
      },
 | 
			
		||||
    },
 | 
			
		||||
    "/api/admin/archive/features": Object {
 | 
			
		||||
      "get": Object {
 | 
			
		||||
        "deprecated": true,
 | 
			
		||||
@ -1497,7 +1713,7 @@ Object {
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
        "responses": Object {
 | 
			
		||||
          "200": Object {
 | 
			
		||||
          "204": Object {
 | 
			
		||||
            "description": "emptyResponse",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
@ -1520,7 +1736,7 @@ Object {
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
        "responses": Object {
 | 
			
		||||
          "200": Object {
 | 
			
		||||
          "204": Object {
 | 
			
		||||
            "description": "emptyResponse",
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user