Add Swagger metadata to DTOs and controllers
Enhanced API documentation by adding Swagger decorators like @ApiProperty, @ApiTags, and @ApiBearerAuth to DTOs and controllers. This will improve clarity and usability of the API for developers using Swagger.
This commit is contained in:
parent
1020d6283d
commit
4547a22f5c
@ -1,8 +1,10 @@
|
|||||||
import { Controller, Get } from "@nestjs/common";
|
import { Controller, Get } from "@nestjs/common";
|
||||||
|
|
||||||
import { AppService } from "./app.service";
|
import { AppService } from "./app.service";
|
||||||
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
@Controller()
|
@Controller()
|
||||||
|
@ApiTags("useless")
|
||||||
export class AppController {
|
export class AppController {
|
||||||
constructor(private readonly appService: AppService) {}
|
constructor(private readonly appService: AppService) {}
|
||||||
|
|
||||||
|
@ -13,7 +13,9 @@ import {
|
|||||||
import { SignInDto, SignUpDto } from "apps/backend/src/app/auth/auth.dto";
|
import { SignInDto, SignUpDto } from "apps/backend/src/app/auth/auth.dto";
|
||||||
import { AuthService } from "apps/backend/src/app/auth/auth.service";
|
import { AuthService } from "apps/backend/src/app/auth/auth.service";
|
||||||
import { UserGuard } from "./auth.guard";
|
import { UserGuard } from "./auth.guard";
|
||||||
|
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
@ApiTags('User authentification')
|
||||||
@Controller("auth")
|
@Controller("auth")
|
||||||
export class AuthController {
|
export class AuthController {
|
||||||
constructor(private readonly authService: AuthService) {}
|
constructor(private readonly authService: AuthService) {}
|
||||||
@ -33,6 +35,7 @@ export class AuthController {
|
|||||||
return this.authService.doLogin(dto);
|
return this.authService.doLogin(dto);
|
||||||
}
|
}
|
||||||
//GET me -- Get current user data via jwt
|
//GET me -- Get current user data via jwt
|
||||||
|
@ApiBearerAuth()
|
||||||
@HttpCode(HttpStatus.OK)
|
@HttpCode(HttpStatus.OK)
|
||||||
@Get("me")
|
@Get("me")
|
||||||
@UseGuards(UserGuard)
|
@UseGuards(UserGuard)
|
||||||
@ -46,6 +49,7 @@ export class AuthController {
|
|||||||
return userData;
|
return userData;
|
||||||
}
|
}
|
||||||
//DELETE me
|
//DELETE me
|
||||||
|
@ApiBearerAuth()
|
||||||
@HttpCode(HttpStatus.FOUND)
|
@HttpCode(HttpStatus.FOUND)
|
||||||
@Delete("me")
|
@Delete("me")
|
||||||
@UseGuards(UserGuard)
|
@UseGuards(UserGuard)
|
||||||
|
@ -6,6 +6,7 @@ import {
|
|||||||
MaxLength,
|
MaxLength,
|
||||||
MinLength,
|
MinLength,
|
||||||
} from "class-validator";
|
} from "class-validator";
|
||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
|
||||||
export class SignUpDto {
|
export class SignUpDto {
|
||||||
/*
|
/*
|
||||||
@ -22,11 +23,17 @@ export class SignUpDto {
|
|||||||
lastName: string;
|
lastName: string;
|
||||||
**/
|
**/
|
||||||
|
|
||||||
|
@ApiProperty({
|
||||||
|
example: 'jean@paul.fr',
|
||||||
|
})
|
||||||
@MaxLength(32)
|
@MaxLength(32)
|
||||||
@IsEmail()
|
@IsEmail()
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
email: string;
|
email: string;
|
||||||
|
|
||||||
|
@ApiProperty({
|
||||||
|
example: 'zSEs-6ze$',
|
||||||
|
})
|
||||||
@IsString()
|
@IsString()
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
@IsStrongPassword({
|
@IsStrongPassword({
|
||||||
@ -36,12 +43,16 @@ export class SignUpDto {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class SignInDto {
|
export class SignInDto {
|
||||||
@MaxLength(32)
|
@MaxLength(32)@ApiProperty({
|
||||||
|
example: 'jean@paul.fr',
|
||||||
|
})
|
||||||
@IsEmail()
|
@IsEmail()
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
email: string;
|
email: string;
|
||||||
|
|
||||||
@IsString()
|
@IsString()@ApiProperty({
|
||||||
|
example: 'zSEs-6ze$',
|
||||||
|
})
|
||||||
@IsNotEmpty()
|
@IsNotEmpty()
|
||||||
@IsStrongPassword({
|
@IsStrongPassword({
|
||||||
minLength: 6,
|
minLength: 6,
|
||||||
|
@ -11,7 +11,9 @@ import {
|
|||||||
} from "@nestjs/common";
|
} from "@nestjs/common";
|
||||||
import { AdminGuard } from "apps/backend/src/app/auth/auth.guard";
|
import { AdminGuard } from "apps/backend/src/app/auth/auth.guard";
|
||||||
import { AuthorsService } from "apps/backend/src/app/authors/authors.service";
|
import { AuthorsService } from "apps/backend/src/app/authors/authors.service";
|
||||||
|
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
@ApiTags('File authors')
|
||||||
@Controller("authors")
|
@Controller("authors")
|
||||||
export class AuthorsController {
|
export class AuthorsController {
|
||||||
constructor(private readonly authorService: AuthorsService) {}
|
constructor(private readonly authorService: AuthorsService) {}
|
||||||
@ -25,8 +27,8 @@ export class AuthorsController {
|
|||||||
return await this.authorService.find(limit, offset, search);
|
return await this.authorService.find(limit, offset, search);
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO DTO
|
//TODO Refactor
|
||||||
|
@ApiBearerAuth()
|
||||||
@UseGuards(AdminGuard)
|
@UseGuards(AdminGuard)
|
||||||
@Delete(":autor")
|
@Delete(":autor")
|
||||||
async deleteAuthor(@Param("author") author: string) {
|
async deleteAuthor(@Param("author") author: string) {
|
||||||
|
@ -23,7 +23,9 @@ import {
|
|||||||
import { CreateFileTypeDto } from "apps/backend/src/app/files/files.dto";
|
import { CreateFileTypeDto } from "apps/backend/src/app/files/files.dto";
|
||||||
import { AdminGuard, InsertAdminState } from "../auth/auth.guard";
|
import { AdminGuard, InsertAdminState } from "../auth/auth.guard";
|
||||||
import { FilesService } from "./files.service";
|
import { FilesService } from "./files.service";
|
||||||
|
import { ApiBearerAuth, ApiSecurity, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
@ApiTags('Files')
|
||||||
@Controller("files")
|
@Controller("files")
|
||||||
export class FilesController {
|
export class FilesController {
|
||||||
constructor(private readonly filesService: FilesService) {}
|
constructor(private readonly filesService: FilesService) {}
|
||||||
@ -129,6 +131,7 @@ export class FilesController {
|
|||||||
return await this.filesService.getAllFilesTypes();
|
return await this.filesService.getAllFilesTypes();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiBearerAuth()
|
||||||
@HttpCode(HttpStatus.CREATED)
|
@HttpCode(HttpStatus.CREATED)
|
||||||
@UseGuards(AdminGuard)
|
@UseGuards(AdminGuard)
|
||||||
@Post("types/new")
|
@Post("types/new")
|
||||||
@ -136,6 +139,7 @@ export class FilesController {
|
|||||||
return await this.filesService.createFileType(body.name, body.mime);
|
return await this.filesService.createFileType(body.name, body.mime);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiBearerAuth()
|
||||||
@HttpCode(HttpStatus.ACCEPTED)
|
@HttpCode(HttpStatus.ACCEPTED)
|
||||||
@UseGuards(AdminGuard)
|
@UseGuards(AdminGuard)
|
||||||
@Delete("types/:typeId")
|
@Delete("types/:typeId")
|
||||||
@ -149,6 +153,7 @@ export class FilesController {
|
|||||||
return await this.filesService.get(fileId);
|
return await this.filesService.get(fileId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiBearerAuth()
|
||||||
@HttpCode(HttpStatus.OK)
|
@HttpCode(HttpStatus.OK)
|
||||||
@UseGuards(AdminGuard)
|
@UseGuards(AdminGuard)
|
||||||
@Delete(":fileId")
|
@Delete(":fileId")
|
||||||
|
@ -1,27 +1,26 @@
|
|||||||
import { DefaultValuePipe } from "@nestjs/common";
|
import { DefaultValuePipe } from "@nestjs/common";
|
||||||
import { IsUUID, MaxLength, MinLength } from "class-validator";
|
import { IsUUID, MaxLength, MinLength } from "class-validator";
|
||||||
|
import { ApiBearerAuth, ApiProperty } from '@nestjs/swagger';
|
||||||
export class CreateFilesDto {
|
|
||||||
@MaxLength(128)
|
|
||||||
@MinLength(4)
|
|
||||||
fileName: string;
|
|
||||||
|
|
||||||
@MaxLength(64)
|
|
||||||
@MinLength(2)
|
|
||||||
uploadedBy: string;
|
|
||||||
|
|
||||||
isDocumentation?: boolean;
|
|
||||||
isRestricted?: boolean;
|
|
||||||
|
|
||||||
@IsUUID()
|
|
||||||
groupId: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export class CreateFileTypeDto {
|
export class CreateFileTypeDto {
|
||||||
|
@ApiProperty({
|
||||||
|
description: "Admin uniquement, nom d'affichage.",
|
||||||
|
examples: [
|
||||||
|
".scad",
|
||||||
|
"jpg"
|
||||||
|
]
|
||||||
|
})
|
||||||
@MaxLength(128)
|
@MaxLength(128)
|
||||||
@MinLength(3)
|
@MinLength(3)
|
||||||
name: string;
|
name: string;
|
||||||
|
|
||||||
|
@ApiProperty({
|
||||||
|
description: "Admin uniquement, Multipurpose Internet Mail Extensions (MIME)",
|
||||||
|
examples: [
|
||||||
|
"application/x-openscad",
|
||||||
|
"image/jpeg"
|
||||||
|
]
|
||||||
|
})
|
||||||
@MaxLength(64)
|
@MaxLength(64)
|
||||||
@MinLength(4)
|
@MinLength(4)
|
||||||
mime: string;
|
mime: string;
|
||||||
|
@ -14,7 +14,9 @@ import { AdminGuard } from "apps/backend/src/app/auth/auth.guard";
|
|||||||
import { CreateGroupDto } from "apps/backend/src/app/groups/groups.dto";
|
import { CreateGroupDto } from "apps/backend/src/app/groups/groups.dto";
|
||||||
import { ISearchQuery } from "apps/backend/src/app/groups/groups.types";
|
import { ISearchQuery } from "apps/backend/src/app/groups/groups.types";
|
||||||
import { GroupsService } from "./groups.service";
|
import { GroupsService } from "./groups.service";
|
||||||
|
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
@ApiTags('File groups')
|
||||||
@Controller("groups")
|
@Controller("groups")
|
||||||
export class GroupsController {
|
export class GroupsController {
|
||||||
constructor(private readonly groupsService: GroupsService) {}
|
constructor(private readonly groupsService: GroupsService) {}
|
||||||
@ -33,6 +35,7 @@ export class GroupsController {
|
|||||||
return await this.groupsService.newGroup(body.groupName);
|
return await this.groupsService.newGroup(body.groupName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ApiBearerAuth()
|
||||||
@UseGuards(AdminGuard)
|
@UseGuards(AdminGuard)
|
||||||
@Delete(":groupId")
|
@Delete(":groupId")
|
||||||
async deleteGroup(@Param("groupId") groupId: string) {
|
async deleteGroup(@Param("groupId") groupId: string) {
|
||||||
|
@ -1,6 +1,11 @@
|
|||||||
import { IsString, MaxLength, MinLength } from "class-validator";
|
import { IsString, MaxLength, MinLength } from "class-validator";
|
||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
|
||||||
export class CreateGroupDto {
|
export class CreateGroupDto {
|
||||||
|
@ApiProperty({
|
||||||
|
description: "Nom unique.",
|
||||||
|
example: "Numérique en communs"
|
||||||
|
})
|
||||||
@IsString()
|
@IsString()
|
||||||
@MinLength(4)
|
@MinLength(4)
|
||||||
@MaxLength(64)
|
@MaxLength(64)
|
||||||
|
@ -19,7 +19,9 @@ import {
|
|||||||
TypeDto,
|
TypeDto,
|
||||||
} from "apps/backend/src/app/machines/machines.dto";
|
} from "apps/backend/src/app/machines/machines.dto";
|
||||||
import { MachinesService } from "apps/backend/src/app/machines/machines.service";
|
import { MachinesService } from "apps/backend/src/app/machines/machines.service";
|
||||||
|
import { ApiTags } from '@nestjs/swagger';
|
||||||
|
|
||||||
|
@ApiTags('Machines')
|
||||||
@Controller("machines")
|
@Controller("machines")
|
||||||
export class MachinesController {
|
export class MachinesController {
|
||||||
constructor(private readonly machineService: MachinesService) {}
|
constructor(private readonly machineService: MachinesService) {}
|
||||||
|
@ -1,16 +1,27 @@
|
|||||||
import { IsUUID, MaxLength, MinLength } from "class-validator";
|
import { IsUUID, MaxLength, MinLength } from "class-validator";
|
||||||
|
import { ApiProperty } from '@nestjs/swagger';
|
||||||
|
|
||||||
export class CreateMachineDto {
|
export class CreateMachineDto {
|
||||||
|
@ApiProperty({
|
||||||
|
example: "Découpeuse laser portable"
|
||||||
|
})
|
||||||
@MaxLength(128)
|
@MaxLength(128)
|
||||||
@MinLength(4)
|
@MinLength(4)
|
||||||
machineName: string;
|
machineName: string;
|
||||||
|
|
||||||
|
@ApiProperty({
|
||||||
|
example: "Découpe au laser"
|
||||||
|
})
|
||||||
@MaxLength(64)
|
@MaxLength(64)
|
||||||
@MinLength(2)
|
@MinLength(2)
|
||||||
machineType: string;
|
machineType: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export class TypeDto {
|
export class TypeDto {
|
||||||
|
@ApiProperty({
|
||||||
|
description: "Un identifiant unique présent en base de donnée qui représente un MIME",
|
||||||
|
example: "dfd0fbb1-2bf3-4dbe-b86d-89b1bff5106c"
|
||||||
|
})
|
||||||
@IsUUID()
|
@IsUUID()
|
||||||
fileTypeId: string;
|
fileTypeId: string;
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,11 @@ async function bootstrap() {
|
|||||||
.setTitle("Fab Explorer")
|
.setTitle("Fab Explorer")
|
||||||
.setDescription("Définition de l'api du FabLab Explorer")
|
.setDescription("Définition de l'api du FabLab Explorer")
|
||||||
.setVersion("1.0")
|
.setVersion("1.0")
|
||||||
|
.addBearerAuth({
|
||||||
|
type: 'http',
|
||||||
|
scheme: 'bearer',
|
||||||
|
in: 'header',
|
||||||
|
})
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
const app = await NestFactory.create(AppModule);
|
const app = await NestFactory.create(AppModule);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user