Chuyển tới nội dung chính

Tham khảo API

Swagger UI

Tài liệu API tương tác có sẵn tại:

http://localhost:3000/api/docs

Swagger tự động generate từ NestJS decorators (@ApiTags, @ApiOperation, @ApiResponse, ...). Tất cả endpoint đều có mô tả chi tiết request/response.

Để lấy OpenAPI spec dạng JSON:

curl http://localhost:3000/api/docs-json

Base URL và Convention

Thuộc tínhGiá trị
Base URL/api
FormatJSON
VersioningKhông dùng versioning (monolith)

Xác thực (Authentication)

SmartCK Hub sử dụng JWT lưu trong httpOnly cookies:

POST /api/auth/login
Content-Type: application/json

{
"username": "admin",
"password": "Admin@123"
}

Response: Set cookies access_token + refresh_token tự động. Các request tiếp theo không cần gửi header Authorization -- browser tự gửi cookie.

CookieMục đíchThời hạn
access_tokenJWT access15 phút
refresh_tokenJWT refresh7 ngày
Auto-refresh

Khi access token hết hạn, backend tự động dùng refresh token để cấp token mới. Frontend không cần xử lý thủ công.

Tổng quan Endpoints

IAM

MethodEndpointMô tả
POST/api/auth/loginĐăng nhập
POST/api/auth/logoutĐăng xuất
POST/api/auth/refreshRefresh token
POST/api/auth/forgot-passwordGửi email reset mật khẩu
GET/api/admin/usersDanh sách users
GET/api/admin/rolesDanh sách roles
GET/api/admin/permissionsDanh sách permissions
GET/api/admin/menusMenu hệ thống
GET/api/profileProfile user hiện tại
POST/api/uploadUpload file

Commercial

MethodEndpointMô tả
GET/api/customersDanh sách khách hàng
POST/api/customersTạo khách hàng mới
GET/api/contractsDanh sách hợp đồng
POST/api/contractsTạo hợp đồng
GET/api/service-packagesDanh sách gói dịch vụ

Delivery

MethodEndpointMô tả
GET/api/projectsDanh sách dự án
GET/api/operations/sprintsDanh sách sprints
GET/api/operations/tasksDanh sách tasks
GET/api/operations/postsDanh sách posts
GET/api/shooting-sessionsPhiên chụp/quay
GET/api/support-ticketsPhiếu hỗ trợ

Organization

MethodEndpointMô tả
GET/api/organization/departmentsPhòng ban
GET/api/organization/positionsChức vụ
GET/api/organization/employeesNhân viên
GET/api/organization/podsPOD

Auto-generated API Client

Frontend sử dụng Orval để tự động generate typed React Query hooks từ OpenAPI spec.

Cách generate

# Đảm bảo backend đang chạy (cần Swagger JSON endpoint)
pnpm api:generate

Sử dụng trong Frontend

import { useGetProjects, useGetProjectsId, usePostProjects } from '@smartck/api-client';

// GET danh sách
const { data, isLoading } = useGetProjects({ page: 1, limit: 20 });

// GET chi tiết
const { data: project } = useGetProjectsId(projectId);

// POST tạo mới
const { mutate } = usePostProjects();
mutate({ data: { name: 'Dự án mới' } });

Error Response Format

Tất cả error trả về theo format nhất quán:

{
"statusCode": 400,
"message": "Validation failed",
"errors": [
{
"field": "email",
"message": "Email không hợp lệ"
}
],
"timestamp": "2026-03-16T10:00:00.000Z",
"path": "/api/customers"
}
HTTP CodeÝ nghĩa
400Validation error
401Chưa xác thực (token missing)
403Không có quyền
404Resource không tồn tại
409Conflict (duplicate)
500Server error

Pagination Pattern

Các endpoint danh sách hỗ trợ pagination qua query params:

GET /api/customers?page=1&limit=20&search=abc&sortBy=createdAt&sortOrder=desc

Response:

{
"data": [...],
"meta": {
"total": 150,
"page": 1,
"limit": 20,
"totalPages": 8
}
}

Service PaginationService tại src/shared/common/services/pagination.service.ts chuẩn hóa logic pagination cho toàn bộ backend.