Skip to content

Domain Model

@nx/asset không sở hữu schema nào. Entity duy nhất nó đọc/ghi — MetaLink — được định nghĩa trong @nx/core để các package khác (commerce, ledger) có thể tham chiếu mà không gây dependency vòng.

1. ERD đầy đủ

Quan hệ là đa hình mềmprincipalId là một cột text thường, được resolve với bảng nào khớp principalType. Không có khóa ngoại DB.

2. Entities

Thuộc tínhGiá trị
Bảngpublic.MetaLink
Nguồnpackages/core/src/models/schemas/public/meta-link/schema.ts
Soft-deletekhông — dùng timestamp generateTzColumnDefs(); asset xóa qua hard deleteAll
Cột Owner IDprincipalId (đa hình, optional)

Trường:

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
bucketNametextBucket S3/Minio
objectNametextObject key trong bucket
linktextPath truy cập tương đối (/assets/objects/{name})
mimetypetextContent type từ stat metadata
sizeintegerKích thước object theo byte
etagtextS3 etag
varianttextTag variant do caller cung cấp (vd vai trò thumbnail)
metadatajsonbRecord<string, any> — stat metadata thô của S3
storageTypetextHiện luôn là s3
isSyncedbooleanfalseTrue khi MetaLink phản chiếu object đã lưu (đặt khi upload)
principalTypetextLoại entity sở hữu — xem enum
principalIdtextID entity sở hữu
createdAt / updatedAttimestampnow()Từ generateTzColumnDefs()

Enum principal type (MetaLinkPrincipalTypes):

Giá trịMô tả
ProductẢnh / tài liệu sản phẩm
ProductVariantMedia riêng cho variant
OrganizerBranding của Organizer
LedgerPDF/XLSX được tạo (output ledger)
CategoryArtwork danh mục

Định nghĩa MetaLink.relations() trong core cũng khai báo quan hệ merchantuser (khớp trên principalId), dù các giá trị đó không nằm trong tập validation MetaLinkPrincipalTypes.

Index & constraint:

TênCộtLoại
PK_MetaLinkidKhóa chính
IDX_MetaLink_bucket_namebucketNameBtree
IDX_MetaLink_object_nameobjectNameBtree
IDX_MetaLink_storage_typestorageTypeBtree
IDX_MetaLink_is_syncedisSyncedBtree
IDX_MetaLink_principal_type_principal_idprincipalType, principalIdBtree (composite)
IDX_MetaLink_principal_idprincipalIdBtree

Quan hệ:

TrườngCardinalityTham chiếu
principalId (type Product)M:1Product.id
principalId (type ProductVariant)M:1ProductVariant.id
principalId (type Organizer)M:1Organizer.id
principalId (type Ledger)M:1Ledger.id
principalId (type Category)M:1Category.id

3. Bất biến xuyên entity

Bất biếnCách thực thi
Một MetaLink phản chiếu đúng một object đã lưu (bucketName + objectName)Tạo trong cùng handler với helper.upload
Xóa một object sẽ xóa các bản ghi MetaLink của nóAssetController deleteAll({ where: { bucketName, objectName } }) sau removeObject (best-effort, async)
storageType = 's3'Hardcode khi create — không có backend khác hoạt động (xem ADR-0001)
Owner đa hình chỉ resolve khi principalType ∈ MetaLinkPrincipalTypesMetaLinkPrincipalTypes.isValid() (helper validation, không phải constraint DB)

4. Hành vi Soft-delete

Hành viChi tiết
Đọc mặc địnhMọi bản ghi hiển thị — MetaLink không có cột deletedAt
Hard-deleteCó — deleteAll khi xóa object; CRUD /meta-links deleteById/deleteBy
RestoreKhông hỗ trợ

5. Trang liên quan

Proprietary and Confidential. Unauthorized copying, distribution, or use of this software is strictly prohibited.