FE: module brand — thương hiệu #
Phần chung (khởi tạo client, lỗi, danh sách, ngôn ngữ) ở tài liệu FE của Core:
docs/fe/common.md (bản đọc: xforge-documentation, ADR-0102 của xforge-core).
Sửa file này CÙNG PR khi đổi hành vi FE thấy được của module.
Thương hiệu có field dịch được (name, description, slug, metaTitle,
metaDescription) và logo (logoFileId + logoFileInfo, file của module
files). Quy ước field dịch được: phần chung §3.3.
CMS / admin (XforgeClient) #
Menu: key brand.brands (quyền brand.read).
| Việc | Method | Quyền |
|---|---|---|
| Danh sách | listBrands({ query }) | brand.read |
| Picker (ô chọn thương hiệu) | listBrandOptions({ query }) → { id, code } + bản dịch đã chọn | brand.read |
| Chi tiết | getBrand({ params: { id } }) | brand.read |
| Tạo | createBrand({ body }) | brand.create |
| Sửa một phần / thay hết | updateBrand / replaceBrand | brand.update |
| Một bản dịch | addBrandTranslation / updateBrandTranslation / deleteBrandTranslation | brand.update |
| Xoá (vào thùng rác) | deleteBrand({ params: { id } }) | brand.delete |
| Thùng rác / khôi phục | listBrandTrash / restoreBrand | brand.restore |
| Xoá vĩnh viễn | deleteBrand({ params: { id }, query: { force: "true" } }) | brand.delete + brand.hard_delete |
- Danh sách: lọc
active,qtìm theo mã và mọi tên đã dịch; sắpsort_order/code/created_at/updated_at. - Form:
codeduy nhất trong store;translationsmột nhóm ô cho mỗi ngôn ngữ của store, gửi LẠI cả mảng khiupdateBrand(ngôn ngữ vắng bị xoá).slugđể trống → server sinh từname. - Logo: tải file qua module
filesrồi gửilogoFileId(file của store khác → 400file_not_attachable).
Màn hình dựng sẵn (listMenu().screen khác null, docs/fe/cms.md §3.1 của
Core): getMenuScreen({ params: { key: "brand.brands" } }) trả type: "crud" —
CMS chung vẽ được mà không cần code riêng:
- Cột: logo (
image, tải nội dung quadownloadFile), mã, tên (bản dịch đã chọn), đang dùng, thứ tự, cập nhật; sắp theo mã / thứ tự / cập nhật. Ô tìm (q) + lọcactive(boolean). - Form tạo / sửa: mã, bản dịch (widget
translations: tên, mô tả, slug, tiêu đề / mô tả SEO — mỗi ngôn ngữ của store một nhóm), website, logo (file: tải lênuploadFile, hiệnlogoFileInfo), thứ tự, đang dùng. Sửa gửiupdateBrand(PATCH) — gửitranslationslà thay cả bộ. - Logo trên màn hình dùng quyền của module
files: xem ảnh cầnfiles.read(downloadFile), tải lên cầnfiles.write(uploadFile) — thiếu thì CMS ẩn ảnh / nút tải lên (quyền từng operation ởoperations[…].permissions). - Thùng rác:
listBrandTrash+restoreBrand. - KHÔNG có trên màn hình chung (CMS tự thêm nếu cần): xoá vĩnh viễn
(
?force=true, cần thêmbrand.hard_delete— quyền kiểm trong handler, mô tả không thấy được), sửa từng bản dịch (addBrandTranslation…),replaceBrand.
Storefront (StorefrontClient) #
Không cần đăng nhập. Chỉ thương hiệu đang bật VÀ có ít nhất một bản dịch.
listPublicBrands({ query })— trang danh sách thương hiệu (≤ 100 / trang).getPublicBrandBySlug({ params: { slug } })— trang thương hiệu; slug của ngôn ngữ nào cũng khớp (ngôn ngữ request trước). Sản phẩm của thương hiệu:listPublicProducts({ query: { brand_id: brand.id } })(moduleproduct).
Lỗi cần xử lý #
code | Status | FE nên |
|---|---|---|
brand_not_found | 404 | trang 404 (storefront: slug không còn / thương hiệu ẩn) |
brand_code_exists | 409 | báo ở ô code (cả khi khôi phục mà mã đã bị lấy) |
brand_slug_exists | 409 | báo ở ô slug của đúng ngôn ngữ |
brand_translation_lang_exists | 409 | ngôn ngữ đó đã có bản dịch → sửa thay vì thêm |
brand_translation_not_found | 404 | tải lại thương hiệu |
unsupported_language | 400 | ngôn ngữ không bật cho store (details.languages) |
file_not_attachable | 400 | logo không phải file của store này |