Đặc tả Thiết kế Kỹ thuật

Module Quản lý Tệp tin
FILE
Phiên bản1.0
Hệ thốngHệ thống Cổng Thông tin Tuyển dụng
ModuleFILE - Quản lý Tệp tin
Ngày2026-08-17
Tác giảNam Nguyen
Trạng tháiBản nháp
SRS liên quanSRS Quản lý Tệp tin

Mục lục

1. Tổng quan

1.1 Mục đích

Tài liệu này mô tả các quyết định thiết kế kỹ thuật cho module Quản lý Tệp tin.

1.2 Yêu cầu được Giải quyết

Danh mụcMã Yêu cầuPhần Thiết kế
Chức năngFR-001 - FR-018Phần 3, 5
Phi chức năngNFR-001 - NFR-011Phần 6, 7

2. Kiến trúc

2.1 Kiểu Kiến trúc

Khía cạnhQuyết địnhGiải quyết
MẫuNestJS Module (trong Monolith)NFR-003
Backend Lưu trữLocal Filesystem (Multer + fs)FR-001, FR-002
ORMDrizzle ORMTất cả yêu cầu dữ liệu
Cơ sở dữ liệuPostgreSQL (file_db)NFR-003
Hàng đợi Tin nhắnRabbitMQ (dọn dẹp dựa trên sự kiện)FR-004, FR-006
Lên lịch Tác vụNestJS Scheduler (cron)FR-006

2.2 Các Quyết định Thiết kế Chính

#Quyết địnhLý doGiải quyết
1Tải lên qua Multer (multipart/form-data) Đơn giản; server kiểm soát trực tiếp; không phụ thuộc service bên ngoài FR-001, NFR-004
2Xóa mềm với xóa vật lý trên filesystem Cho phép hoàn nguyên metadata; xóa vật lý ngay khi xóa mềm; kiểm toán FR-004
3Cơ sở dữ liệu file_db riêng biệt Mở rộng độc lập; biệt lập miền lỗi; phân tách rõ ràng trách nhiệm NFR-003
4Cấu trúc thư mục local phân cấp Hỗ trợ đa tenancy; đơn giản hóa kiểm soát truy cập; cách ly file theo user FR-005
5Trạng thái TEMP cho tải lên đang thực hiện Ngăn chặn tệp tin ảo; cho phép dọn dẹp tự động các tải lên bị bỏ rơi FR-006
6Xác thực dựa trên danh mục Bắt buộc quy tắc loại/kích thước tệp tin theo từng trường hợp sử dụng; ngăn chặn lạm dụng FR-001, NFR-005
7Thư mục là bản ghi sys_files (type=FOLDER) Bảng thống nhất cho tệp tin và thư mục; đơn giản hóa truy vấn; hỗ trợ điều hướng phân cấp FR-008
8Bảng quyền riêng biệt (sys_file_permissions) Kiểm soát truy cập chi tiết; hỗ trợ quyền ở cấp người dùng/vai trò/tổ chức; có thể kế thừa FR-014
9Tìm kiếm toàn văn qua PostgreSQL tsvector Tìm kiếm PostgreSQL gốc; không phụ thuộc bên ngoài; hỗ trợ nội dung Thái/Anh FR-009, NFR-007
10Ghi nhật ký truy cập dựa trên sự kiện (RabbitMQ → LOG → OpenSearch) Kiểm toán tách biệt; ghi nhật ký bất đồng bộ; quản lý nhật ký tập trung FR-015, NFR-010
11Sao chép = bản ghi mới với cùng file_path (không sao chép vật lý) Lưu trữ hiệu quả; không trùng lặp file vật lý; dọn dẹp theo số tham chiếu FR-012
12Di chuyển = cập nhật parent_folder_id Thao tác chỉ trên metadata; nhanh; không cần di chuyển file vật lý FR-013
13Hạn ngạch lưu trữ với theo dõi bất đồng bộ Ngăn chặn lạm dụng; kiểm tra hạn ngạch khi tải lên; theo dõi sử dụng qua tác vụ cron FR-016, FR-017
14Chính sách lưu trữ theo danh mục Các quy tắc có thể cấu hình; quản trị viên quản lý; chỉ ảnh hưởng tải lên mới FR-018

3. Thiết kế Thành phần

3.1 Sơ đồ Thành phần

Sơ đồ Thành phần FILE
Hình 1: Các Thành phần Module FILE

3.2 Cấu trúc Module

src/
  file/
    file.module.ts
    file.controller.ts
    file.service.ts
    file.guard.ts
    permission.guard.ts       # Kiểm tra quyền truy cập
    dto/
      create-file.dto.ts
      confirm-file.dto.ts
      list-files.dto.ts
      create-folder.dto.ts
      rename-file.dto.ts
      move-file.dto.ts
      copy-file.dto.ts
      search-files.dto.ts
      batch-upload.dto.ts
      manage-permissions.dto.ts
      storage-quota.dto.ts
      storage-policy.dto.ts
    workers/
      file.worker.ts          # Bộ tiêu thụ xóa file vật lý
    events/
      file.events.ts          # Định nghĩa sự kiện
    services/
      folder.service.ts       # Quản lý thư mục
      permission.service.ts   # Quản lý quyền
      search.service.ts       # Tìm kiếm toàn văn
      storage.service.ts      # Theo dõi lưu trữ & hạn ngạch
      audit.service.ts        # Ghi nhật ký lịch sử truy cập
    utils/
      multer.util.ts          # Cấu hình Multer (local upload)
      file.util.ts            # Thao tác filesystem (đọc, xóa, copy)
      name-resolver.util.ts   # Xử lý tên trùng lặp

3.3 Ánh xạ Thành phần đến Yêu cầu

Thành phầnTrách nhiệmGiải quyết
FileControllerEndpoint HTTP cho tải lên, tải xuống, liệt kê, xóa, sao chép, di chuyển, hàng loạtFR-001 - FR-004, FR-007, FR-011, FR-012, FR-013
FileServiceLogic nghiệp vụ: xác thực, CRUD metadata, phối hợp filesystemFR-001 - FR-005
FileGuardKiểm soát truy cập: xác thực quyền sở hữu và RBACFR-005
PermissionGuardKiểm tra quyền chi tiết (xem/sửa/xóa) theo người dùng/vai trò/tổ chứcFR-014
PermissionServiceQuản lý quyền tệp tin/thư mục (CRUD trên sys_file_permissions)FR-014
FolderServiceCRUD thư mục, quản lý cấu trúc thư mụcFR-008, FR-015
SearchServiceTìm kiếm toàn văn trên tên và metadata tệp tin/thư mụcFR-009
StorageServiceTheo dõi sử dụng lưu trữ, quản lý hạn ngạch, áp dụng chính sáchFR-016, FR-017, FR-018
AuditServiceGhi nhật ký lịch sử truy cập (phát đến RabbitMQ cho module LOG)FR-015
FileWorkerBộ tiêu thụ xóa file vật lý bất đồng bộ (xóa đối tượng vật lý)FR-004
MulterUtilCấu hình Multer cho upload multipart (disk storage, file filter)FR-001
FileUtilThao tác filesystem: đọc, xóa, copy tệp tin (fs.readFile, fs.unlink, fs.copyFile)FR-001, FR-002, FR-004
NameResolverUtilXử lý tên tệp tin/thư mục trùng lặp (thêm hậu tố số)FR-010, FR-012, FR-013
TempCleanupJobTác vụ cron xóa các tệp tin TEMP cũ hơn 24hFR-006
StorageUsageJobTác vụ cron tính toán và cập nhật thống kê sử dụng lưu trữFR-016

3.4 Thiết kế Lớp

FileController

Phương thứcChữ kýMô tả
POSTuploadFile(dto: CreateFileDto)Tải lên tệp tin (multipart)
POSTconfirmUpload(dto: ConfirmFileDto)Xác nhận tải lên, đặt trạng thái ACTIVE
POSTbatchUpload(dto: BatchUploadDto)Tải lên nhiều tệp tin
GETdownloadFile(id: string)Tải xuống tệp tin (file stream)
GETlistFiles(query: ListFilesDto)Liệt kê tệp tin với bộ lọc và phân trang
GETsearchFiles(query: SearchFilesDto)Tìm kiếm toàn văn trên tệp tin/thư mục
POSTcreateFolder(dto: CreateFolderDto)Tạo thư mục mới
PATCHrenameFile(id: string, dto: RenameFileDto)Đổi tên tệp tin hoặc thư mục
POSTcopyFile(id: string, dto: CopyFileDto)Sao chép tệp tin đến thư mục đích
POSTmoveFile(id: string, dto: MoveFileDto)Di chuyển tệp tin đến thư mục đích
DELETEdeleteFile(id: string)Xóa mềm tệp tin/thư mục, phát sự kiện dọn dẹp
GETgetPermissions(id: string)Lấy quyền tệp tin/thư mục
PUTmanagePermissions(id: string, dto: ManagePermissionsDto)Cập nhật quyền cho tệp tin/thư mục
GETgetStorageUsage()Lấy thống kê sử dụng lưu trữ
GETgetStorageQuotas()Lấy cấu hình hạn ngạch lưu trữ
PUTmanageStorageQuotas(dto: StorageQuotaDto)Cập nhật giới hạn hạn ngạch lưu trữ
GETgetStoragePolicies()Lấy chính sách lưu trữ
PUTmanageStoragePolicies(dto: StoragePolicyDto)Cập nhật chính sách lưu trữ

FileService

Phương thứcChữ kýMô tả
createFileMetadata(dto, userId, employerId?)Chèn bản ghi sys_files với trạng thái TEMP
confirmUpload(fileId, userId)Xác minh quyền sở hữu, cập nhật trạng thái thành ACTIVE
generateDownloadUrl(fileId, userId)Xác thực truy cập, đọc file từ disk
listFiles(filters, pagination)Truy vấn tệp tin với kiểm soát truy cập
searchFiles(query, filters, pagination)Tìm kiếm toàn văn với kiểm soát truy cập
softDelete(fileId, userId)Đặt trạng thái DELETED, phát sự kiện file.deleted
cleanupTempFiles()Xóa các tệp tin TEMP cũ hơn 24h (cron)

FolderService

Phương thứcChữ kýMô tả
createFolder(dto, userId)Tạo bản ghi thư mục (type=FOLDER)
renameFolder(folderId, newName, userId)Đổi tên thư mục, xử lý trùng lặp
deleteFolder(folderId, userId)Xóa mềm đệ quy các mục con
cleanupOrphanedFolders()Xóa các thư mục trống (cron)

PermissionService

Phương thứcChữ kýMô tả
checkAccess(fileId, userId, action)Kiểm tra người dùng có quyền thực hiện thao tác không
getPermissions(fileId)Lấy tất cả quyền cho tệp tin/thư mục
updatePermissions(fileId, permissions[])Cập nhật quyền hàng loạt
inheritPermissions(parentId, childId)Sao chép quyền từ cha sang con

SearchService

Phương thứcChữ kýMô tả
search(query, filters, userId)Tìm kiếm toàn văn với tsvector
buildSearchVector(fileId)Cập nhật tsvector cho metadata tệp tin

StorageService

Phương thứcChữ kýMô tả
trackUsage()Tính toán và cập nhật sử dụng lưu trữ (cron)
checkQuota(userId, fileSize)Kiểm tra tải lên có vượt hạn ngạch không
getUsage(userId?, orgId?)Lấy thống kê sử dụng lưu trữ
updateQuotas(quotas)Cập nhật cấu hình hạn ngạch
updatePolicies(policies)Cập nhật chính sách lưu trữ

AuditService

Phương thứcChữ kýMô tả
logAccess(fileId, userId, action, ip)Phát sự kiện truy cập đến RabbitMQ

FileWorker

Phương thứcSự kiệnMô tả
handleFileDeletedfile.deletedXóa file trên filesystem
handleTempCleanupfile.temp_cleanupXóa file trên filesystem cho các tệp tin TEMP đã dọn dẹp

4. Kiến trúc Dữ liệu

4.1 Cơ sở dữ liệu

Cơ sở dữ liệu: file_db (PostgreSQL)

Tham khảo: Thiết kế Cơ sở dữ liệu

4.2 Giải quyết Yêu cầu Dữ liệu

Yêu cầu SRSGiải pháp Thiết kếBảng CSDL
FR-001 Tải lên Tệp tinLưu tệp tin vào filesystem, tạo metadatasys_files
FR-002 Tải xuống Tệp tinTra cứu file_path, đọc file từ disksys_files
FR-003 Liệt kê Tệp tinTruy vấn với bộ lọc (người dùng, nhà tuyển dụng, danh mục) + phân trangsys_files
FR-004 Xóa Tệp tinXóa mềm (status=DELETED), phát sự kiện để xóa file vật lýsys_files
FR-005 Kiểm soát Truy cậpMiddleware FileGuard xác thực quyền sở hữu hoặc thành viên tổ chứcsys_files + auth_users + auth_members
FR-006 Dọn dẹp TạmTác vụ cron xóa các bản ghi TEMP > 24h, phát sự kiện dọn dẹpsys_files
FR-007 Tải lên CV/Hồ sơDanh mục RESUME, thay thế CV hiện cósys_files
FR-008 Tạo Thư mụcTạo bản ghi với type=FOLDER, parent_folder_idsys_files
FR-009 Tìm kiếm Tệp tinTìm kiếm toàn văn qua tsvector, lọc theo kiểm soát truy cậpsys_files
FR-010 Đổi tên Tệp tinCập nhật original_name, xử lý trùng lặpsys_files
FR-011 Tải lên Hàng loạtNhiều tệp tin multipart, báo cáo thành công một phầnsys_files
FR-012 Sao chép Tệp tinBản ghi mới với cùng file_path, xử lý trùng lặpsys_files
FR-013 Di chuyển Tệp tinCập nhật parent_folder_id, xử lý trùng lặpsys_files
FR-014 Quản lý QuyềnCRUD trên sys_file_permissions, có thể kế thừasys_file_permissions
FR-015 Ghi nhật ký Truy cậpSự kiện đến RabbitMQ → module LOG → OpenSearchOpenSearch (qua LOG)
FR-016 Theo dõi Sử dụngTác vụ cron tính toán sử dụng theo người dùng/tổ chứcsys_storage_usage
FR-017 Quản lý Hạn ngạchCRUD trên sys_storage_quotas, kiểm tra khi tải lênsys_storage_quotas
FR-018 Chính sách Lưu trữCRUD trên sys_storage_policies, theo danh mụcsys_storage_policies

5. Thiết kế API

5.1 Ánh xạ Endpoint đến Yêu cầu

Phương thứcĐường dẫnMô tảGiải quyết
POST/files/uploadTải lên tệp tin (multipart/form-data)FR-001
POST/files/batchTải lên hàng loạt (nhiều tệp tin)FR-011
GET/files/:id/downloadTải xuống tệp tin (file stream)FR-002
GET/filesLiệt kê tệp tin với bộ lọcFR-003
GET/files/searchTìm kiếm toàn văn tệp tin/thư mụcFR-009
POST/files/foldersTạo thư mụcFR-008
PATCH/files/:idĐổi tên tệp tin/thư mụcFR-010
POST/files/:id/copySao chép tệp tin đến thư mụcFR-012
POST/files/:id/moveDi chuyển tệp tin đến thư mụcFR-013
DELETE/files/:idXóa mềm tệp tin/thư mụcFR-004
GET/files/:id/permissionsLấy quyền tệp tinFR-014
PUT/files/:id/permissionsQuản lý quyền tệp tinFR-014
GET/files/storage-usageLấy thống kê sử dụng lưu trữFR-016
GET/files/quotasLấy hạn ngạch lưu trữFR-017
PUT/files/quotasCập nhật hạn ngạch lưu trữFR-017
GET/files/policiesLấy chính sách lưu trữFR-018
PUT/files/policiesCập nhật chính sách lưu trữFR-018

5.2 Pipeline Middleware

Request
  → AuthGuard (Xác thực JWT)
    → FileGuard (Kiểm tra quyền sở hữu/RBAC)
      → FileController (handler)
        → FileService (logic nghiệp vụ)
          → Response

6. Lưu trình Tích hợp

6.1 Lưu trình Tải lên Tệp tin

Sơ đồ Hoạt động

Sơ đồ Hoạt động Tải lên
Hình 2: Lưu trình Hoạt động Tải lên Tệp tin

Sơ đồ Tuần tự

Sơ đồ Tuần tự Tải lên
Hình 3: Lưu trình Tích hợp Tải lên Tệp tin

Mô tả Lưu trình:

  1. Client gửi POST /files/upload (multipart/form-data) với tệp tin và category
  2. FileService kiểm tra MIME types và giới hạn kích thước của danh mục
  3. MulterUtil lưu tệp tin vào disk: uploads/{user_id}/{category}/{uuid_filename}
  4. FileService chèn bản ghi sys_files với trạng thái ACTIVE và file_path
  5. Bản ghi tệp tin được trả về cho client

6.2 Lưu trình Tải xuống Tệp tin

Sơ đồ Hoạt động

Sơ đồ Hoạt động Tải xuống
Hình 4: Lưu trình Hoạt động Tải xuống Tệp tin

Sơ đồ Tuần tự

Sơ đồ Tuần tự Tải xuống
Hình 5: Lưu trình Tích hợp Tải xuống Tệp tin

Mô tả Lưu trình:

  1. Client gửi GET /files/:id/download
  2. AuthGuard xác thực token JWT
  3. FileGuard kiểm tra truy cập (chủ sở hữu hoặc admin/HR tổ chức)
  4. FileService tra cứu bản ghi sys_files, lấy file_path
  5. FileUtil đọc tệp tin từ local filesystem
  6. Phản hồi được gửi đến client với nội dung tệp tin (file stream)

6.3 Lưu trình Xóa Tệp tin

Sơ đồ Hoạt động

Sơ đồ Hoạt động Xóa
Hình 6: Lưu trình Hoạt động Xóa Tệp tin

Sơ đồ Tuần tự

Sơ đồ Tuần tự Xóa
Hình 7: Lưu trình Tích hợp Xóa Tệp tin

Mô tả Lưu trình:

  1. Client gửi DELETE /files/:id
  2. AuthGuard xác thực token JWT
  3. FileGuard kiểm tra quyền sở hữu hoặc vai trò admin
  4. FileService đặt trạng thái thành DELETED và timestamp deleted_at
  5. FileService gọi FileUtil để xóa tệp tin trên filesystem (fs.unlink)
  6. Phản hồi thành công được gửi đến client

6.4 Lưu trình Dọn dẹp Tệp tin Tạm

Sơ đồ Hoạt động

Sơ đồ Hoạt động Dọn dẹp
Hình 8: Lưu trình Hoạt động Dọn dẹp Tệp tin Tạm

Sơ đồ Tuần tự

Sơ đồ Tuần tự Dọn dẹp
Hình 9: Lưu trình Tích hợp Dọn dẹp Tệp tin Tạm

Mô tả Lưu trình:

  1. NestJS Scheduler kích hoạt tác vụ cron mỗi 1 giờ
  2. TempCleanupJob truy vấn sys_files where status=TEMP AND created_at < NOW() - 24h
  3. Đối với mỗi tệp tin TEMP hết hạn:
  4. FileUtil xóa file trên filesystem

6.5 Lưu trình Quản lý Thư mục

Mô tả Lưu trình:

  1. Client gửi POST /files/folders với name và parent_folder_id
  2. FolderService kiểm tra tên (không có ký tự đặc biệt, duy nhất trong thư mục cha)
  3. FolderService tạo bản ghi sys_files với type=FOLDER
  4. Nếu thư mục cha có quyền: kế thừa quyền cho thư mục mới
  5. Bản ghi thư mục được trả về cho client

6.6 Lưu trình Di chuyển/Sao chép Tệp tin

Mô tả Lưu trình (Di chuyển):

  1. Client gửi POST /files/:id/move với destination_folder_id
  2. PermissionGuard kiểm tra quyền EDIT trên nguồn và WRITE trên đích
  3. FileService cập nhật parent_folder_id
  4. NameResolverUtil xử lý tên trùng lặp tại đích
  5. AuditService ghi nhật ký sự kiện di chuyển
  6. Bản ghi tệp tin đã cập nhật được trả về

Mô tả Lưu trình (Sao chép):

  1. Client gửi POST /files/:id/copy với destination_folder_id
  2. PermissionGuard kiểm tra VIEW trên nguồn và WRITE trên đích
  3. FileService tạo bản ghi mới với cùng file_path (không sao chép file vật lý)
  4. NameResolverUtil xử lý tên trùng lặp tại đích
  5. Bản ghi tệp tin mới được trả về

6.7 Lưu trình Ghi nhật ký Truy cập

Mô tả Lưu trình:

  1. Truy cập tệp tin xảy ra (xem, tải xuống, sửa, xóa)
  2. AuditService thu thập: user_id, file_id, action, timestamp, IP
  3. AuditService phát sự kiện đến RabbitMQ (hàng đợi: log.events)
  4. Module LOG tiêu thụ sự kiện và lưu trữ
  5. Lịch sử truy cập sẵn sàng cho các truy vấn kiểm toán

7. Thiết kế Bảo mật

Yêu cầu SRSGiải pháp Thiết kếTriển khai
FR-005 Kiểm soát Truy cập Tệp tin Middleware FileGuard với kiểm tra quyền sở hữu + RBAC Kiểm tra khớp user_id hoặc thành viên tổ chức với vai trò admin/HR
NFR-002 Giới hạn Kích thước Kiểm tra kích thước tệp tin theo danh mục RESUME/COMPANY_DOC/JOB_ATTACHMENT: 10MB, AVATAR: 5MB
NFR-005 Giới hạn Kích thước Tệp tin Xác thực dựa trên danh mục RESUME/COMPANY_DOC/JOB_ATTACHMENT: 10MB, AVATAR: 5MB

7.1 Quy tắc Kiểm soát Truy cập

Thao tácChủ sở hữuAdmin/HR Tổ chứcNgười dùng KhácQuyền Rõ ràng
Tải lênCó (theo phạm vi tổ chức)Có (chỉ cá nhân)-
Tải xuốngCó (theo phạm vi tổ chức)KhôngVIEW hoặc DOWNLOAD
Liệt kêChỉ tệp tin của riêngTệp tin tổ chứcChỉ tệp tin của riêng-
Tìm kiếmChỉ tệp tin của riêngTệp tin tổ chứcChỉ tệp tin của riêng-
Đổi tênCó (theo phạm vi tổ chức)KhôngEDIT
Sao chépCó (theo phạm vi tổ chức)KhôngVIEW (nguồn) + WRITE (đích)
Di chuyểnCó (theo phạm vi tổ chức)KhôngEDIT
XóaCó (theo phạm vi tổ chức)KhôngDELETE
Quản lý QuyềnKhôngChỉ Admin Hệ thốngKhông-
Tạo Thư mụcCó (theo phạm vi tổ chức)Có (chỉ cá nhân)-

7.2 Kế thừa Quyền

7.3 Bảo mật Local Filesystem

8. Tóm tắt Truy xuất Nguồn gốc

Mã Yêu cầu SRSYêu cầuPhần TDSQuyết định Thiết kế
FR-001Tải lên Tệp tin3.2, 5.1, 6.1FileController + POST /files/upload (multipart) + Multer + FileUtil
FR-002Tải xuống Tệp tin3.2, 5.1, 6.2FileController + GET /files/:id/download + FileUtil (file stream)
FR-003Liệt kê Tệp tin3.2, 5.1FileController + GET /files với bộ lọc và phân trang
FR-004Xóa Tệp tin3.2, 5.1, 6.3FileController + DELETE /files/:id + sự kiện file.deleted + FileWorker
FR-005Kiểm soát Truy cập Tệp tin3.2, 7Middleware FileGuard với quyền sở hữu + xác thực RBAC
FR-006Dọn dẹp Tệp tin Tạm3.2, 6.4TempCleanupJob (cron) + sự kiện file.temp_cleanup + FileWorker
FR-007Tải lên CV/Hồ sơ3.2, 5.1FileController + danh mục RESUME + logic thay thế CV hiện có
FR-008Tạo Thư mục3.2, 5.1FolderService + POST /files/folders + bản ghi type=FOLDER
FR-009Tìm kiếm Tệp tin3.2, 5.1SearchService + GET /files/search + tìm kiếm toàn văn tsvector
FR-010Đổi tên Tệp tin3.2, 5.1FileController + PATCH /files/:id + NameResolverUtil
FR-011Tải lên Hàng loạt3.2, 5.1FileController + POST /files/batch + báo cáo thành công một phần
FR-012Sao chép Tệp tin3.2, 5.1FileController + POST /files/:id/copy + cùng file_path
FR-013Di chuyển Tệp tin3.2, 5.1FileController + POST /files/:id/move + cập nhật parent_folder_id
FR-014Quản lý Quyền3.2, 5.1, 7PermissionService + PUT /files/:id/permissions + có thể kế thừa
FR-015Ghi nhật ký Truy cập3.2AuditService → RabbitMQ → module LOG → OpenSearch
FR-016Theo dõi Sử dụng3.2, 5.1StorageService + GET /files/storage-usage + tác vụ cron
FR-017Quản lý Hạn ngạch3.2, 5.1StorageService + PUT /files/quotas + kiểm tra khi tải lên
FR-018Chính sách Lưu trữ3.2, 5.1StorageService + PUT /files/policies + cấu hình theo danh mục
NFR-001Hiệu suất2.1Local filesystem, server xử lý trực tiếp
NFR-002Bảo mật - Thời hạn URL7.3Giới hạn kích thước tệp tin theo danh mục
NFR-003Khả dụng2.1file_db độc lập; filesystem local trên server
NFR-004Khả năng mở rộng2.2Tải lên phía client; không bộ đệm tệp tin trên server
NFR-005Giới hạn Kích thước Tệp tin3.2, 7Xác thực dựa trên danh mục trong FileService
NFR-006Dọn dẹp Tạm6.4Tác vụ cron hàng giờ qua NestJS Scheduler
NFR-007Hiệu suất Tìm kiếm2.1, 3.2Chỉ mục PostgreSQL tsvector; < 1000ms p95
NFR-008Tải lên Hàng loạt2.1, 3.2Xử lý upload song song; < 2000ms cho 20 tệp tin
NFR-009Độ trễ Kiểm soát Truy cập7PermissionGuard với tra cứu vai trò được đệm; < 100ms p95
NFR-010Thời gian Lưu trữ Nhật ký3.2Chính sách vòng đời chỉ mục OpenSearch; 90 ngày mặc định
NFR-011Độ chính xác Lưu trữ3.2Tác vụ cron bất đồng bộ với dung sai +-1%