Turtor Docs
API

REST API endpointy

Přehled dostupných API endpointů, Swagger dokumentace a vzory controllerů

Všechny API endpointy jsou dostupné pod prefixem /api/v1/. Swagger dokumentace je přístupná na http://localhost:4405/docs.

Verzování

// V main.ts
app.enableVersioning({
  type: VersioningType.URI,
  defaultVersion: '1',
  prefix: 'api/v',
});
// Výsledná URL: /api/v1/auth/login

Přehled controllerů

Doménové controllery

ControllerRoute prefixAutentizaceKlíčové endpointy
AuthController/authSmíšenáregister, login, magic-link, OAuth, me, switch-role
UsersController/usersRoles(ADMIN)CRUD, aktivace/deaktivace
CoursesController/coursesSmíšenáCRUD, publish, cancel, tým, kanban
BookingsController/bookingsJWTCRUD, confirm, cancel, recenze, statistiky
InstructorsController/instructorsSmíšenáCRUD, approve, reject, suspend, certifikace
CompaniesController/companiesJWTCRUD, členové, ověření, pozastavení

Kurzy -- podcontrollery

ControllerRoute prefixAutentizacePopis
CourseGenerationController/courses/generateRoles(ADMIN, GARANT)Generování kurzů, náhled, fronta
CourseProposalsController/course-proposalsRoles(ADMIN, GARANT)Návrhy kurzů ke schválení
ReplacementController/replacementsRoles(ADMIN, GARANT, INSTRUCTOR)Náhrady instruktorů
WithdrawalController/withdrawalsJWTŽádosti o odstoupení z kurzu
GenerationLogsController/generation-logsRoles(ADMIN, GARANT)Logy generovacího algoritmu

Podpůrné controllery

ControllerRoute prefixAutentizacePopis
SalesController/salesRoles(SALES_REP, ADMIN)B2B leady, aktivity, pipeline
SimpleAvailabilityController/simple-availabilityRoles(INSTRUCTOR)Správa dostupnosti
RegionsController/regionsSmíšenáKraje, oblastní spolky, garanti
PaymentsController/paymentsSmíšenáStripe webhook, platby, faktury
NotificationsController/notificationsJWTIn-app notifikace
FilesController/filesJWTNahrávání souborů

Integrační controllery

ControllerRoute prefixAutentizacePopis
AresController/aresVeřejnýVyhledávání v obchodním rejstříku
VerifyController/verifyJWTSMS ověření telefonu
MagicActionsController/actionsVeřejnýAkce z e-mailu (potvrzení/odmítnutí)
GeoController/geoSmíšenáMěsta, pokrytí instruktorů, H3
DocsChatController/docsVeřejný (rate-limited)AI chat asistent pro dokumentaci
HealthController/VeřejnýHealth check (GET /api/v1/health)

Vzor controlleru

@ApiTags('feature')
@Controller('feature')
export class FeatureController {
  constructor(private featureService: FeatureService) {}

  @Get()
  @ApiOperation({ summary: 'Seznam záznamů' })
  findAll() {
    return this.featureService.findAll();
  }

  @Post()
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(UserRole.ADMIN)
  @ApiBearerAuth()
  @ApiOperation({ summary: 'Vytvořit záznam' })
  create(@Body() dto: CreateFeatureDto, @CurrentUser() user: User) {
    return this.featureService.create(dto, user);
  }
}

DTO vzor (class-validator)

export class CreateUserDto {
  @ApiProperty({ example: 'jan@example.com' })
  @IsEmail()
  email: string;

  @ApiProperty({ minLength: 8 })
  @IsString()
  @MinLength(8)
  password: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  phone?: string;

  @ApiProperty({ enum: UserRole })
  @IsEnum(UserRole)
  role: UserRole;
}

Každá vlastnost DTO musí mít dekorátor @ApiProperty() nebo @ApiPropertyOptional(). Bez něj Orval vygeneruje { [key: string]: unknown } místo správného typu.

Globální validace

// V main.ts
app.useGlobalPipes(
  new ValidationPipe({
    whitelist: true,              // Odstraní neznámé vlastnosti
    forbidNonWhitelisted: true,   // Vrátí 400 při neznámých vlastnostech
    transform: true,              // Automatická transformace typů
    transformOptions: {
      enableImplicitConversion: true,  // "1" v query stringu -> number 1
    },
  })
);

Formát chybové odpovědi

{
  "statusCode": 400,
  "message": ["email musí být platný email", "heslo musí mít alespoň 8 znaků"],
  "error": "Bad Request",
  "timestamp": "2025-01-15T10:30:00.000Z",
  "path": "/api/v1/users"
}

Guardy a dekorátory

Guard/DekorátorÚčelPoužití
JwtAuthGuardOvěření JWT tokenu@UseGuards(JwtAuthGuard)
RolesGuardKontrola role uživatele@UseGuards(RolesGuard) + @Roles(...)
@CurrentUser()Získání autentizovaného uživatele@CurrentUser() user: User
@CurrentUser('id')Získání konkrétní vlastnosti@CurrentUser('id') userId: string
@Roles(...)Požadované role@Roles(UserRole.ADMIN)
@Public()Přeskočení autentizaceNa handler/class

JwtAuthGuard musí být vždy před RolesGuard -- @UseGuards(JwtAuthGuard, RolesGuard). Opačné pořadí způsobí chybu.

CORS

API podporuje tři frontendové originy (FRONTEND_URL + ADMIN_URL + DOCS_URL), všechny s credentials: true pro cross-origin cookies.

Swagger dokumentace

Přístupná na http://localhost:4405/docs. OpenAPI specifikace se automaticky exportuje do apps/api/openapi.json po startu serveru (v development režimu).

// Dekorátory pro Swagger
@ApiTags('auth')                      // Skupina endpointů
@ApiOperation({ summary: 'Přihlášení' })  // Popis operace
@ApiResponse({ status: 200, description: 'Úspěch' })
@ApiBearerAuth()                      // Vyžaduje autentizaci