| Phiên bản | 1.0 |
| Hệ thống | Hệ thống Cổng Thông tin Tuyển dụng |
| Module | FILE - Quản lý Tệp tin |
| Cơ sở dữ liệu | file_db |
| Ngày | 2026-08-17 |
| Tác giả | Nam Nguyen |
| Trạng thái | Bản nháp |
Tài liệu này định nghĩa các yêu cầu phần mềm cho module Quản lý Tệp tin của Hệ thống Cổng Thông tin Tuyển dụng.
Module Quản lý Tệp tin xử lý:
| Module | Loại Phụ thuộc | Mô tả |
|---|---|---|
| AUTH | Đồng bộ (Gọi API) | Xác thực danh tính người dùng và quyền RBAC |
| LOG | Bất đồng bộ (RabbitMQ) | Phát sự kiện vòng đời tệp tin (đã tải lên, đã xóa) |
| Thuật ngữ | Định nghĩa |
|---|---|
| FR | Yêu cầu Chức năng |
| NFR | Yêu cầu Phi chức năng |
| UC | Trường hợp Sử dụng |
| MIME Type | Multipurpose Internet Mail Extensions - định danh loại tệp tin |
| RBAC | Kiểm soát Truy cập Dựa trên Vai trò |
| Tải lên Hàng loạt | Tải lên nhiều tệp tin trong một yêu cầu duy nhất |
| Kế thừa Quyền | Quyền kế thừa từ thư mục cha đến các tệp tin/thư mục con |
| Hạn ngạch Lưu trữ | Giới hạn lưu trữ tối đa cho mỗi người dùng hoặc tổ chức |
| Chính sách Lưu trữ | Các quy tắc cấu hình cho danh mục tệp tin (loại được phép, giới hạn kích thước, thời gian lưu trữ) |
| OpenSearch | Công cụ tìm kiếm và phân tích được sử dụng để lưu trữ nhật ký và tìm kiếm toàn văn |
| Khía cạnh | Giá trị |
|---|---|
| Mã Module | FILE |
| Tên Module | Quản lý Tệp tin |
| Mô tả | Tải lên, tải xuống, liệt kê, quản lý thư mục, quyền và quản lý vòng đời tệp tin với local filesystem |
| Cơ sở dữ liệu | file_db |
| Bảng | sys_files, sys_file_permissions, sys_storage_usage, sys_storage_quotas, sys_storage_policies |
| Stack Công nghệ | NestJS, Drizzle ORM, PostgreSQL, Multer + fs (local filesystem) |
| Mã Yêu cầu | Module | Yêu cầu | Trường hợp Sử dụng | Ưu tiên | Mô tả |
|---|---|---|---|---|---|
| FR-001 | FILE | Tải lên Tệp tin | UC-05 | Cao | Hệ thống sẽ nhận tệp tin qua multipart/form-data. Server lưu tệp tin vào local filesystem và tạo bản ghi metadata. Trả về bản ghi tệp tin cho client. |
| FR-002 | FILE | Tải xuống Tệp tin | UC-06 | Cao | Hệ thống sẽ đọc tệp tin từ local filesystem và trả về nội dung cho client. Kiểm tra quyền truy cập trước khi trả về. |
| FR-003 | FILE | Liệt kê Tệp tin | UC-02 | Trung bình | Hệ thống sẽ truy vấn tệp tin theo người dùng, nhà tuyển dụng và danh mục với hỗ trợ phân trang. Kết quả được lọc theo kiểm soát truy cập. |
| FR-004 | FILE | Xóa Tệp tin | UC-09 | Trung bình | Hệ thống sẽ xóa mềm metadata tệp tin và xóa vật lý tệp tin trên local filesystem. Trạng thái tệp tin được đặt thành DELETED. |
| FR-005 | FILE | Kiểm soát Truy cập Tệp tin | UC-11 | Cao | Hệ thống sẽ kiểm tra quyền sở hữu tệp tin hoặc quyền RBAC trước khi tạo URL tải xuống. Người dùng chỉ có thể truy cập tệp tin của riêng họ trừ khi có vai trò admin/HR trong tổ chức. |
| FR-006 | FILE | Dọn dẹp Tệp tin Tạm | - | Trung bình | Hệ thống sẽ chạy tác vụ định kỳ (cron) để xóa các tệp tin TEMP cũ hơn 24 giờ. Xóa vật lý tệp tin trên local filesystem và xóa bản ghi metadata. |
| FR-007 | FILE | Tải lên CV/Hồ sơ | UC-05 | Cao | Hệ thống sẽ cho phép người dùng đã xác thực tải lên tệp tin CV/hồ sơ (PDF, DOC, DOCX) với kích thước tối đa 10MB. Tệp tin được lưu trữ dưới danh mục RESUME với đường dẫn theo phạm vi người dùng. Hệ thống kiểm tra loại tệp tin, lưu tệp tin vào local filesystem và tạo metadata. Chỉ cho phép một CV đang hoạt động cho mỗi người dùng - tải lên CV mới sẽ thay thế CV trước đó. |
| FR-008 | FILE | Tạo Thư mục | UC-01 | Trung bình | Hệ thống sẽ cho phép người dùng đã xác thực tạo thư mục trong cấu trúc thư mục được ủy quyền. Tên thư mục không được chứa ký tự đặc biệt (/, \, :, *, ?, ", <, >, |). Hệ thống kiểm tra tính duy nhất của tên thư mục trong thư mục cha. Metadata thư mục được lưu trong sys_files với type=FOLDER. |
| FR-009 | FILE | Tìm kiếm Tệp tin/Thư mục | UC-03 | Trung bình | Hệ thống sẽ cung cấp tìm kiếm toàn văn trên tên và metadata tệp tin/thư mục. Tìm kiếm hỗ trợ bộ lọc: danh mục, mime_type, khoảng ngày, chủ sở hữu và trạng thái. Kết quả được phân trang và sắp xếp theo mức độ liên quan hoặc ngày. Tìm kiếm tuân theo kiểm soát truy cập - người dùng chỉ thấy các tệp tin mà họ có quyền truy cập. |
| FR-010 | FILE | Đổi tên Tệp tin/Thư mục | UC-04 | Trung bình | Hệ thống sẽ cho phép người dùng được ủy quyền đổi tên tệp tin và thư mục. Tên mới phải duy nhất trong thư mục cha. Nếu tệp tin với tên tương tự tồn tại, hệ thống sẽ thêm hậu tố số (ví dụ: file(1).pdf). Hệ thống kiểm tra định dạng tên và cập nhật metadata. Việc đổi tên được ghi nhật ký để kiểm toán. |
| FR-011 | FILE | Tải lên Nhiều Tệp tin | UC-07 | Trung bình | Hệ thống sẽ hỗ trợ tải lên hàng loạt nhiều tệp tin trong một yêu cầu. Mỗi tệp tin được kiểm tra riêng biệt về loại và kích thước. Hệ thống xử lý tất cả tệp tin và trả về kết quả tải lên dưới dạng mảng. Các tải lên thất bại không chặn các tải thành công - báo cáo một phần được cung cấp. |
| FR-012 | FILE | Sao chép Tệp tin | UC-08 | Thấp | Hệ thống sẽ cho phép người dùng được ủy quyền sao chép tệp tin sang thư mục khác. Sao chép tạo bản ghi tệp tin mới với cùng đường dẫn file vật lý (hard link hoặc copy). Thư mục đích phải nằm trong phạm vi ủy quyền của người dùng. Hệ thống xử lý tên trùng lặp tại đích bằng cách thêm hậu tố số. |
| FR-013 | FILE | Di chuyển Tệp tin | UC-10 | Trung bình | Hệ thống sẽ cho phép người dùng được ủy quyền di chuyển tệp tin giữa các thư mục. Di chuyển cập nhật metadata parent_folder_id của tệp tin. Nguồn và đích phải nằm trong phạm vi ủy quyền của người dùng. Hệ thống xử lý tên trùng lặp tại đích. Việc di chuyển được ghi nhật ký để kiểm toán. |
| FR-014 | FILE | Quản lý Quyền | UC-13 | Cao | Hệ thống sẽ cho phép quản trị viên quản lý quyền tệp tin/thư mục ở cấp người dùng, vai trò và tổ chức. Các loại quyền: XEM, TẢI XUỐNG, SỬA, XÓA. Quyền có thể kế thừa từ thư mục cha. Thay đổi quyền được ghi nhật ký để kiểm toán. |
| FR-015 | FILE | Ghi nhật ký Lịch sử Truy cập | UC-12 | Trung bình | Hệ thống sẽ ghi nhật ký tất cả sự kiện truy cập tệp tin (xem, tải xuống, sửa, xóa) với mã người dùng, thời gian, địa chỉ IP và loại hành động. Nhật ký được lưu trữ trong OpenSearch thông qua module LOG. Nhật ký truy cập được lưu giữ trong 90 ngày theo mặc định. Nhật ký hỗ trợ kiểm toán và yêu cầu tuân thủ. |
| FR-016 | FILE | Theo dõi Sử dụng Lưu trữ | UC-14 | Trung bình | Hệ thống sẽ theo dõi sử dụng lưu trữ theo người dùng, tổ chức và toàn cục. Dữ liệu sử dụng bao gồm tổng kích thước, số lượng tệp tin và phân tích theo danh mục. Hệ thống cung cấp dữ liệu sử dụng lưu trữ qua API cho bảng điều khiển quản trị. Dữ liệu sử dụng được cập nhật bất đồng bộ thông qua phương pháp sự kiện. |
| FR-017 | FILE | Quản lý Hạn ngạch Lưu trữ | UC-16 | Trung bình | Hệ thống sẽ cho phép quản trị viên đặt hạn ngạch lưu trữ cho mỗi người dùng và tổ chức. Giới hạn hạn ngạch: tổng kích thước tối đa, số lượng tệp tin tối đa. Hệ thống từ chối tải lên khi vượt quá hạn ngạch. Cảnh báo hạn ngạch được kích hoạt ở ngưỡng sử dụng 80% và 95%. |
| FR-018 | FILE | Cấu hình Chính sách Lưu trữ | UC-17 | Thấp | Hệ thống sẽ cho phép quản trị viên cấu hình chính sách lưu trữ cho mỗi danh mục: loại mime được phép, kích thước tệp tin tối đa, thời gian lưu trữ và cài đặt mã hóa. Thay đổi chính sách có hiệu lực cho các tải lên mới. Các tệp tin hiện tại giữ nguyên cài đặt chính sách ban đầu. |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; người dùng có quyền ghi trong thư mục đích |
| Lưu trình Chính | 1. Người dùng điều hướng đến thư mục đích 2. Người dùng nhấp vào "Tạo Thư mục" và nhập tên thư mục 3. Client gửi POST /files/folders với name và parent_folder_id 4. Hệ thống kiểm tra tên thư mục (không có ký tự đặc biệt, duy nhất trong thư mục cha) 5. Hệ thống tạo bản ghi thư mục trong sys_files với type=FOLDER 6. Hệ thống trả về bản ghi thư mục với folder_id |
| Lưu trình Thay thế | 4a. Tên không hợp lệ (ký tự đặc biệt) → Hệ thống trả về 400 "Tên thư mục không hợp lệ" 4b. Tên đã tồn tại → Hệ thống trả về 409 "Thư mục đã tồn tại" 4c. Không có quyền ghi → Hệ thống trả về 403 Forbidden |
| Điều kiện hậu | Thư mục được tạo trong cơ sở dữ liệu; thư mục có thể truy cập trong trình duyệt tệp tin |
| FR liên quan | FR-008 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập |
| Lưu trình Chính | 1. Client yêu cầu danh sách tệp tin/thư mục với bộ lọc tùy chọn (user_id, employer_id, category, parent_folder_id) 2. Hệ thống áp dụng bộ lọc kiểm soát truy cập 3. Hệ thống truy vấn sys_files với phân trang 4. Hệ thống trả về danh sách tệp tin/thư mục với tổng số, sắp xếp theo tên hoặc ngày |
| Lưu trình Thay thế | 2a. Không có bộ lọc được cung cấp → Hệ thống trả về tệp tin của người dùng hiện tại 2b. Bộ lọc nhà tuyển dụng → Hệ thống trả về tất cả tệp tin của nhà tuyển dụng đó (chỉ admin/HR) 2c. parent_folder_id → Hệ thống trả về các mục con của thư mục đó |
| Điều kiện hậu | Danh sách tệp tin/thư mục phân trang được trả về với metadata (không có nội dung tệp tin) |
| FR liên quan | FR-003, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập |
| Lưu trình Chính | 1. Người dùng nhập từ khóa tìm kiếm (từ khóa, bộ lọc) 2. Client gửi GET /files/search với query, category, mime_type, khoảng ngày 3. Hệ thống thực hiện tìm kiếm toàn văn trên tên tệp tin và metadata 4. Hệ thống áp dụng bộ lọc kiểm soát truy cập 5. Hệ thống trả về kết quả tìm kiếm với phân trang, sắp xếp theo mức độ liên quan |
| Lưu trình Thay thế | 3a. Không tìm thấy kết quả → Hệ thống trả về danh sách trống với total_count=0 4a. Người dùng không có quyền truy cập bất kỳ tệp tin khớp nào → Hệ thống trả về danh sách trống |
| Điều kiện hậu | Kết quả tìm kiếm được trả về với metadata tệp tin |
| FR liên quan | FR-009, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực (chủ sở hữu hoặc admin) |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; tệp tin/thư mục tồn tại với trạng thái ACTIVE |
| Lưu trình Chính | 1. Người dùng chọn tệp tin/thư mục và nhấp vào "Đổi tên" 2. Người dùng nhập tên mới 3. Client gửi PATCH /files/:id với tên mới 4. Hệ thống kiểm tra người dùng có quyền sửa 5. Hệ thống kiểm tra tên mới (duy nhất trong thư mục cha, không có ký tự đặc biệt) 6. Hệ thống cập nhật metadata tệp tin 7. Hệ thống ghi nhật ký sự kiện đổi tên để kiểm toán 8. Hệ thống trả về bản ghi tệp tin đã cập nhật |
| Lưu trình Thay thế | 4a. Không có quyền sửa → Hệ thống trả về 403 Forbidden 5a. Tên đã tồn tại → Hệ thống thêm hậu tố số (ví dụ: file(1).pdf) 5b. Tên không hợp lệ → Hệ thống trả về 400 "Tên không hợp lệ" |
| Điều kiện hậu | Tệp tin/thư mục đã đổi tên; sự kiện đổi tên được ghi nhật ký để kiểm toán |
| FR liên quan | FR-010, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; người dùng có token phiên hợp lệ |
| Lưu trình Chính | 1. Người dùng chọn tệp tin để tải lên (ví dụ: hồ sơ, ảnh đại diện) 2. Client gửi yêu cầu POST /files/upload (multipart/form-data) với tệp tin và category 3. Hệ thống kiểm tra loại và kích thước tệp tin theo giới hạn danh mục 4. Hệ thống tạo tên file UUID và lưu tệp tin vào local filesystem (uploads/{user_id}/{category}/{uuid}) 5. Hệ thống tạo bản ghi metadata trong sys_files với trạng thái ACTIVE 6. Hệ thống trả về bản ghi tệp tin cho client |
| Lưu trình Thay thế | 3a. Loại tệp tin không hợp lệ → Hệ thống trả về 400 Lỗi Xác thực 3b. Tệp tin quá lớn → Hệ thống trả về 413 Payload Too Large 4a. Lưu filesystem thất bại → Hệ thống trả về 500 Lỗi Server |
| Điều kiện hậu | Tệp tin đã lưu trên local filesystem; metadata tệp tin được lưu trong cơ sở dữ liệu với trạng thái ACTIVE; tệp tin có thể truy cập qua endpoint tải xuống |
| FR liên quan | FR-001 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; tệp tin tồn tại với trạng thái ACTIVE |
| Lưu trình Chính | 1. Client yêu cầu tải xuống tệp tin bằng file ID 2. Hệ thống kiểm tra người dùng có quyền truy cập (chủ sở hữu hoặc admin/HR tổ chức) 3. Hệ thống đọc tệp tin từ local filesystem (file_path) 4. Hệ thống trả về nội dung tệp tin (file stream) |
| Lưu trình Thay thế | 2a. Người dùng không được ủy quyền → Hệ thống trả về 403 Forbidden 2b. Tệp tin không tìm thấy hoặc đã DELETED → Hệ thống trả về 404 Not Found 3a. Tệp tin không tồn tại trên filesystem → Hệ thống trả về 404 Not Found |
| Điều kiện hậu | Tệp tin đã được người dùng được ủy quyền tải xuống |
| FR liên quan | FR-002, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; người dùng có quyền ghi trong thư mục đích |
| Lưu trình Chính | 1. Người dùng chọn nhiều tệp tin để tải lên 2. Client gửi POST /files/batch với mảng metadata tệp tin 3. Hệ thống kiểm tra từng tệp tin riêng biệt về loại và kích thước 4. Hệ thống lưu tệp tin vào local filesystem cho tất cả tệp tin hợp lệ 5. Hệ thống tạo bản ghi tệp tin với trạng thái TEMP 6. Server lưu tệp tin vào local filesystem 7. 8. 9. Hệ thống trả về kết quả tải lên dưới dạng mảng (thành công/một phần) |
| Lưu trình Thay thế | 3a. Một số tệp tin không hợp lệ → Hệ thống trả về thành công một phần với chi tiết lỗi cho từng tệp tin 6a. Một số tải lên thất bại → Client có thể thử lại các tải lên thất bại riêng lẻ 7a. Một số xác nhận không được nhận → Dọn dẹp tệp tin tạm xóa các bản ghi bị bỏ rơi |
| Điều kiện hậu | Các tệp tin hợp lệ đã lưu trên filesystem; metadata tệp tin được lưu; tệp tin không hợp lệ bị từ chối với chi tiết lỗi |
| FR liên quan | FR-011 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; tệp tin nguồn tồn tại; người dùng có quyền đọc trên nguồn và quyền ghi trên đích |
| Lưu trình Chính | 1. Người dùng chọn tệp tin và nhấp vào "Sao chép đến..." 2. Người dùng chọn thư mục đích 3. Client gửi POST /files/:id/copy với destination_folder_id 4. Hệ thống kiểm tra quyền truy cập (đọc nguồn, ghi đích) 5. Hệ thống tạo bản ghi tệp tin mới với cùng đường dẫn file vật lý 6. Hệ thống xử lý tên trùng lặp tại đích (thêm hậu tố số) 7. Hệ thống trả về bản ghi tệp tin mới |
| Lưu trình Thay thế | 4a. Không có quyền đọc trên nguồn → Hệ thống trả về 403 Forbidden 4b. Không có quyền ghi trên đích → Hệ thống trả về 403 Forbidden 6a. Tên trùng lặp → Hệ thống thêm (1), (2), v.v. |
| Điều kiện hậu | Bản ghi tệp tin mới được tạo; tệp tin vật lý được sao chép trên filesystem; tệp tin có thể truy cập tại đích |
| FR liên quan | FR-012, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực (chủ sở hữu tệp tin hoặc admin) |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; tệp tin/thư mục tồn tại với trạng thái ACTIVE |
| Lưu trình Chính | 1. Client yêu cầu xóa tệp tin/thư mục bằng ID 2. Hệ thống kiểm tra người dùng là chủ sở hữu hoặc có vai trò admin 3. Nếu là thư mục: Hệ thống đánh dấu đệ quy tất cả các mục con là DELETED 4. Hệ thống đặt trạng thái tệp tin thành DELETED và timestamp deleted_at 5. Hệ thống xóa vật lý tệp tin trên local filesystem (fs.unlink) 6. Hệ thống trả về phản hồi thành công |
| Lưu trình Thay thế | 2a. Người dùng không được ủy quyền → Hệ thống trả về 403 Forbidden 2b. Tệp tin đã DELETED → Hệ thống trả về 404 Not Found 5a. Xóa filesystem thất bại → Ghi log lỗi, tệp tin vẫn đánh dấu DELETED |
| Điều kiện hậu | Metadata tệp tin/thư mục đã xóa mềm; tệp tin vật lý đã bị xóa trên filesystem; tệp tin không còn truy cập được |
| FR liên quan | FR-004, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực (chủ sở hữu tệp tin hoặc admin) |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; tệp tin tồn tại; người dùng có quyền ghi trên cả nguồn và đích |
| Lưu trình Chính | 1. Người dùng chọn tệp tin và nhấp vào "Di chuyển đến..." 2. Người dùng chọn thư mục đích 3. Client gửi POST /files/:id/move với destination_folder_id 4. Hệ thống kiểm tra quyền truy cập (ghi nguồn, ghi đích) 5. Hệ thống cập nhật parent_folder_id của tệp tin 6. Hệ thống xử lý tên trùng lặp tại đích (thêm hậu tố số) 7. Hệ thống ghi nhật ký sự kiện di chuyển để kiểm toán 8. Hệ thống trả về bản ghi tệp tin đã cập nhật |
| Lưu trình Thay thế | 4a. Không có quyền ghi → Hệ thống trả về 403 Forbidden 4b. Đích là thư mục con của nguồn → Hệ thống trả về 400 "Không thể di chuyển thư mục vào chính nó" 6a. Tên trùng lặp → Hệ thống thêm (1), (2), v.v. |
| Điều kiện hậu | Tệp tin đã di chuyển sang thư mục mới; sự kiện di chuyển được ghi nhật ký để kiểm toán |
| FR liên quan | FR-013, FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Hệ thống (nội bộ) |
| Điều kiện tiên quyết | Nhận yêu cầu từ người dùng; tệp tin/thư mục tồn tại |
| Lưu trình Chính | 1. Hệ thống nhận yêu cầu truy cập tệp tin 2. Hệ thống kiểm tra người dùng là chủ sở hữu tệp tin → cấp quyền truy cập 3. Hệ thống kiểm tra vai trò của người dùng trong tổ chức (admin/HR) → cấp quyền truy cập 4. Hệ thống kiểm tra quyền rõ ràng trong sys_file_permissions → cấp/từ chối 5. Hệ thống kiểm tra quyền thư mục cha (kế thừa) → cấp/từ chối 6. Hệ thống trả về quyết định truy cập (ALLOW/DENY) |
| Lưu trình Thay thế | 2a. Người dùng không phải chủ sở hữu → Tiếp tục bước 3 3a. Người dùng không phải admin/HR → Tiếp tục bước 4 4a. Không tìm thấy quyền rõ ràng → Tiếp tục bước 5 5a. Không tìm thấy quyền thư mục → DENY truy cập |
| Điều kiện hậu | Quyết định truy cập được trả về; quyết định được ghi nhật ký nếu DENY |
| FR liên quan | FR-005 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Hệ thống (nội bộ) |
| Điều kiện tiên quyết | Sự kiện truy cập tệp tin đã xảy ra (xem, tải xuống, sửa, xóa) |
| Lưu trình Chính | 1. Hệ thống phát hiện sự kiện truy cập tệp tin 2. Hệ thống thu thập: user_id, file_id, action, timestamp, địa chỉ IP 3. Hệ thống phát sự kiện vào RabbitMQ (hàng đợi: log.events) 4. Module LOG tiêu thụ sự kiện và lưu trữ trong OpenSearch 5. Lịch sử truy cập sẵn sàng cho các truy vấn kiểm toán |
| Lưu trình Thay thế | 3a. RabbitMQ không khả dụng → Sự kiện được xếp hàng cục bộ, thử lại khi kết nối lại |
| Điều kiện hậu | Sự kiện truy cập được ghi nhật ký; kiểm toán được duy trì |
| FR liên quan | FR-015 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Quản trị viên |
| Điều kiện tiên quyết | Admin đã đăng nhập; admin có vai trò admin hệ thống hoặc admin tổ chức |
| Lưu trình Chính | 1. Admin chọn tệp tin/thư mục và mở bảng "Quyền" 2. Admin thêm/cập nhật/xóa quyền cho người dùng, vai trò hoặc tổ chức 3. Admin đặt loại quyền: XEM, TẢI XUỐNG, SỬA, XÓA 4. Admin tùy chọn bật kế thừa quyền từ thư mục cha 5. Client gửi PUT /files/:id/permissions với mảng quyền 6. Hệ thống kiểm tra admin có vai trò quản lý quyền 7. Hệ thống cập nhật bảng sys_file_permissions 8. Hệ thống ghi nhật ký thay đổi quyền để kiểm toán 9. Hệ thống trả về quyền đã cập nhật |
| Lưu trình Thay thế | 6a. Admin không được ủy quyền → Hệ thống trả về 403 Forbidden 7a. Xung đột quyền → Hệ thống áp dụng quy tắc hạn chế nhất |
| Điều kiện hậu | Quyền được cập nhật; thay đổi có hiệu lực ngay lập tức; nhật ký kiểm toán được ghi lại |
| FR liên quan | FR-014 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Hệ thống (Tác vụ Cron) |
| Điều kiện tiên quyết | Hệ thống đang chạy; file_db có thể truy cập |
| Lưu trình Chính | 1. Tác vụ cron chạy định kỳ (mỗi giờ) 2. Hệ thống tính toán sử dụng lưu trữ cho mỗi người dùng: total_size, file_count 3. Hệ thống tính toán sử dụng lưu trữ cho mỗi tổ chức 4. Hệ thống tính toán sử dụng lưu trữ toàn cục 5. Hệ thống lưu dữ liệu sử dụng trong bảng sys_storage_usage 6. Hệ thống cung cấp dữ liệu sử dụng qua API GET /files/storage-usage |
| Lưu trình Thay thế | 2a. Tính toán thất bại → Hệ thống ghi nhật ký lỗi, thử lại ở chu kỳ tiếp theo |
| Điều kiện hậu | Dữ liệu sử dụng lưu trữ được cập nhật; sẵn sàng cho bảng điều khiển quản trị |
| FR liên quan | FR-016 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Hệ thống (Tác vụ Cron) |
| Điều kiện tiên quyết | Hệ thống đang chạy; file_db có thể truy cập |
| Lưu trình Chính | 1. Tác vụ cron chạy định kỳ (hàng ngày) 2. Hệ thống quét cấu trúc thư mục để tìm thư mục bị bỏ rơi 3. Hệ thống kiểm tra tính toàn vẹn cấp bậc thư mục 4. Hệ thống dọn dẹp các thư mục trống không có mục con 5. Hệ thống cập nhật metadata cấu trúc thư mục 6. Hệ thống ghi nhật ký các sự kiện dọn dẹp |
| Lưu trình Thay thế | 4a. Thư mục có mục con → Hệ thống bỏ qua việc xóa 5a. Phát hiện vấn đề toàn vẹn → Hệ thống ghi nhật ký cảnh báo |
| Điều kiện hậu | Cấu trúc thư mục được dọn dẹp; thư mục bị bỏ rơi được xóa |
| FR liên quan | FR-015 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Quản trị viên |
| Điều kiện tiên quyết | Admin đã đăng nhập; admin có vai trò admin hệ thống |
| Lưu trình Chính | 1. Admin điều hướng đến cài đặt Hạn ngạch Lưu trữ 2. Admin đặt giới hạn hạn ngạch cho mỗi người dùng hoặc tổ chức: max_total_size, max_file_count 3. Client gửi PUT /files/quotas với cấu hình hạn ngạch 4. Hệ thống kiểm tra ủy quyền của admin 5. Hệ thống lưu hạn ngạch trong bảng sys_storage_quotas 6. Hệ thống kiểm tra hạn ngạch tại mỗi lần tải lên 7. Hệ thống từ chối tải lên khi vượt quá hạn ngạch |
| Lưu trình Thay thế | 4a. Admin không được ủy quyền → Hệ thống trả về 403 Forbidden 6a. Vượt quá hạn ngạch → Hệ thống trả về 413 "Vượt quá hạn ngạch lưu trữ" 6b. Hạn ngạch ở 80% → Hệ thống gửi thông báo cảnh báo 6c. Hạn ngạch ở 95% → Hệ thống gửi thông báo nghiêm trọng |
| Điều kiện hậu | Giới hạn hạn ngạch được cấu hình; tải lên được kiểm tra theo hạn ngạch |
| FR liên quan | FR-017 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Quản trị viên |
| Điều kiện tiên quyết | Admin đã đăng nhập; admin có vai trò admin hệ thống |
| Lưu trình Chính | 1. Admin điều hướng đến cài đặt Chính sách Lưu trữ 2. Admin chọn hoặc tạo chính sách cho danh mục (RESUME, AVATAR, v.v.) 3. Admin cấu hình: mime_types được phép, max_file_size, retention_period, encryption 4. Client gửi PUT /files/policies với cấu hình chính sách 5. Hệ thống kiểm tra ủy quyền của admin 6. Hệ thống lưu chính sách trong bảng sys_storage_policies 7. Chính sách có hiệu lực cho các tải lên mới trong danh mục đó |
| Lưu trình Thay thế | 5a. Admin không được ủy quyền → Hệ thống trả về 403 Forbidden 7a. Tệp tin hiện tại → Giữ nguyên cài đặt chính sách ban đầu |
| Điều kiện hậu | Chính sách lưu trữ được cấu hình; tải lên mới được kiểm tra theo chính sách |
| FR liên quan | FR-018 |
| Khía cạnh | Mô tả |
|---|---|
| Actor | Người dùng đã xác thực (Ứng viên) |
| Điều kiện tiên quyết | Người dùng đã đăng nhập; người dùng có token phiên hợp lệ |
| Lưu trình Chính | 1. Người dùng điều hướng đến trang tải lên CV/Hồ sơ 2. Người dùng chọn tệp tin CV (PDF, DOC, DOCX) với kích thước tối đa 10MB 3. Client gửi yêu cầu tải lên với original_name, mime_type, category=RESUME 4. Hệ thống kiểm tra loại tệp tin được phép (PDF, DOC, DOCX) và kích thước <= 10MB 5. Hệ thống kiểm tra tệp tin RESUME đang hoạt động hiện có cho người dùng này 6a. Nếu tìm thấy CV hiện có: Hệ thống đặt trạng thái tệp tin cũ thành REPLACED 6b. Nếu không có CV hiện có: Hệ thống chuyển sang bước 7 7. Hệ thống lưu tệp tin vào local filesystem và tạo bản ghi tệp tin với trạng thái TEMP 8. Server lưu tệp tin vào local filesystem 9. Client xác nhận hoàn tất tải lên qua POST /files/confirm 10. 11. Hệ thống trả về bản ghi tệp tin với file_id |
| Lưu trình Thay thế | 4a. Loại tệp tin không hợp lệ → Hệ thống trả về 400 "Chỉ cho phép tệp tin PDF, DOC, DOCX" 4b. Tệp tin quá lớn (>10MB) → Hệ thống trả về 413 "Kích thước tệp tin vượt quá giới hạn 10MB" 5a. Lưu filesystem thất bại → Client có thể thử lại 9a. Xác nhận không được nhận trong vòng 24 giờ → Dọn dẹp tệp tin tạm xóa bản ghi |
| Điều kiện hậu | CV đã lưu trên filesystem trong thư mục RESUME của người dùng; metadata tệp tin được lưu với trạng thái ACTIVE; CV trước đó (nếu có) được đánh dấu là REPLACED; CV có thể truy cập qua URL tải xuống |
| FR liên quan | FR-007, FR-001 |
| Mã Yêu cầu | Danh mục | Yêu cầu | Mục tiêu |
|---|---|---|---|
| NFR-001 | Hiệu suất | Thời gian phản hồi tải lên tệp tin | < 2000ms (p95) cho tệp tin ≤ 10MB |
| NFR-002 | Bảo mật | Giới hạn kích thước tải lên | Theo danh mục: RESUME 10MB, AVATAR 5MB, OTHER 10MB |
| NFR-003 | Khả dụng | Uptime dịch vụ tệp tin | 99.9% |
| NFR-004 | Khả năng mở rộng | Tải lên đồng thời | 100+ tải lên đồng thời |
| NFR-005 | Lưu trữ | Kích thước tệp tin tối đa theo danh mục | RESUME: 10MB, AVATAR: 5MB, OTHER: 10MB |
| NFR-006 | Bảo trì | Tần suất dọn dẹp tệp tin tạm | Mỗi 1 giờ (tệp tin cũ hơn 24h) |
| NFR-007 | Hiệu suất | Thời gian phản hồi tìm kiếm | < 1000ms (p95) cho tìm kiếm toàn văn |
| NFR-008 | Hiệu suất | Thời gian phản hồi tải lên hàng loạt | < 2000ms để tạo multipart upload (tối đa 20 tệp tin) |
| NFR-009 | Bảo mật | Độ trễ kiểm tra kiểm soát truy cập | < 100ms (p95) mỗi yêu cầu |
| NFR-010 | Tuân thủ | Thời gian lưu trữ nhật ký truy cập | 90 ngày (có thể cấu hình) |
| NFR-011 | Lưu trữ | Độ chính xác theo dõi sử dụng lưu trữ | +- 1% so với sử dụng thực tế |
| Mã Yêu cầu | Yêu cầu | Trường hợp Sử dụng | Bảng CSDL | Endpoint API |
|---|---|---|---|---|
| FR-001 | Tải lên Tệp tin | UC-05 | sys_files | POST /files/upload (multipart) |
| FR-002 | Tải xuống Tệp tin | UC-06 | sys_files | GET /files/:id/download |
| FR-003 | Liệt kê Tệp tin | UC-02 | sys_files | GET /files |
| FR-004 | Xóa Tệp tin | UC-09 | sys_files | DELETE /files/:id |
| FR-005 | Kiểm soát Truy cập Tệp tin | UC-11 | sys_files, sys_file_permissions (join auth_users, auth_members) | Tất cả endpoint tệp tin (middleware) |
| FR-006 | Dọn dẹp Tệp tin Tạm | - | sys_files | Cron job (nội bộ) |
| FR-007 | Tải lên CV/Hồ sơ | UC-05 (mở rộng) | sys_files | POST /files/upload (multipart) |
| FR-008 | Tạo Thư mục | UC-01 | sys_files | POST /files/folders |
| FR-009 | Tìm kiếm Tệp tin/Thư mục | UC-03 | sys_files | GET /files/search |
| FR-010 | Đổi tên Tệp tin/Thư mục | UC-04 | sys_files | PATCH /files/:id |
| FR-011 | Tải lên Nhiều Tệp tin | UC-07 | sys_files | POST /files/batch |
| FR-012 | Sao chép Tệp tin | UC-08 | sys_files | POST /files/:id/copy |
| FR-013 | Di chuyển Tệp tin | UC-10 | sys_files | POST /files/:id/move |
| FR-014 | Quản lý Quyền | UC-13 | sys_file_permissions | PUT /files/:id/permissions |
| FR-015 | Ghi nhật ký Lịch sử Truy cập | UC-12 | OpenSearch (qua module LOG) | RabbitMQ (bất đồng bộ) |
| FR-016 | Theo dõi Sử dụng Lưu trữ | UC-14 | sys_storage_usage | GET /files/storage-usage |
| FR-017 | Quản lý Hạn ngạch Lưu trữ | UC-16 | sys_storage_quotas | PUT /files/quotas |
| FR-018 | Cấu hình Chính sách Lưu trữ | UC-17 | sys_storage_policies | PUT /files/policies |