Skip to content

Domain Model

Cả hai entity được định nghĩa trong @nx/core dưới schema PostgreSQL outreach và re-export vào package này. Không có khóa ngoại giữa chúng — mỗi cái là một bảng thu thập độc lập.

1. ERD đầy đủ

2. Entities

Inquiry

Thuộc tínhGiá trị
Bảngoutreach.Inquiry
Nguồnpackages/core/src/models/schemas/outreach/inquiry/schema.ts
Soft-deletecó (deletedAt)
Cột Owner ID— (global, không scope theo merchant)
Thuộc tính ẩndeletedAt

Trường:

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
typetext000_CONSULTChannel nguồn — xem enum
statustextNEWTrạng thái pipeline — xem enum
firstNametextTên liên hệ
lastNametextHọ liên hệ
emailtextEmail liên hệ (indexed)
phonetextSĐT liên hệ
businessNametextDoanh nghiệp của lead
businessTypetextDanh mục doanh nghiệp
locationCounttextĐánh giá lead
estimatedRevenuetextĐánh giá lead
subjecttextChủ đề tin nhắn
messagetextNội dung free-text
assignedTotextid admin/user sở hữu
repliedAttimestamptzTimestamp reply đầu tiên
repliedBytextid user reply
convertedAttimestamptzTimestamp conversion
lostReasontextLý do mất deal
notetextGhi chú nội bộ
createdAttimestamptznow()

Enum type (InquiryTypes):

Giá trịMô tả
000_CONSULTTư vấn chung / nguồn không rõ (mặc định)
100_CONTACTForm liên hệ (/contact)
200_SALESYêu cầu sales (/contact-sales)
300_DEMOYêu cầu demo (/demo)
400_PARTNERĐăng ký partner (/partners)

Enum status (InquiryStatuses, IGNIS Statuses):

Giá trịMô tả
NEWVừa submit
PROCESSINGAdmin đã tiếp nhận
COMPLETEDConverted
CLOSEDGiải quyết không convert
CANCELLEDSpam / invalid / abandon

Index & constraint:

TênCộtLoại
PK_InquiryidKhóa chính
IDX_Inquiry_typetypeBtree
IDX_Inquiry_statusstatusBtree
IDX_Inquiry_emailemailBtree

Quan hệ: không có.

Subscriber

Thuộc tínhGiá trị
Bảngoutreach.Subscriber
Nguồnpackages/core/src/models/schemas/outreach/subscriber/schema.ts
Soft-deletecó (deletedAt)
Cột Owner ID— (global)
Thuộc tính ẩndeletedAt, unsubscribeToken (không bao giờ trả về bởi model API)

Trường:

TrườngKiểuBắt buộcMặc địnhMô tả
idtextSnowflakeKhóa chính
emailtextUnique (partial, where not deleted)
localetextviNgôn ngữ newsletter (vi / en)
topicsjsonb (string[])['all']Tùy chọn chủ đề
statustextACTIVATEDXem enum
unsubscribeTokentextSnowflake ($defaultFn)Token cho link unsubscribe; ẩn khỏi API
subscribedAttimestamptznow()Thời điểm subscribe đầu/cuối
unsubscribedAttimestamptzSet khi unsubscribe, clear khi re-subscribe
createdAttimestamptznow()

Enum status (SubscriberStatuses, IGNIS Statuses):

Giá trịMô tả
ACTIVATEDSubscription đang active
DEACTIVATEDĐã unsubscribe
ARCHIVEDAdmin lưu trữ (status hợp lệ, không tạo ra bởi luồng service)

Index & constraint:

TênCộtLoại
PK_SubscriberidKhóa chính
UPI_Subscriber_emailemail (where deletedAt IS NULL)Unique partial index
IDX_Subscriber_statusstatusBtree
IDX_Subscriber_unsubscribeTokenunsubscribeTokenBtree

Quan hệ: không có.

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

Bất biếnCách thực thi
Một Subscriber live cho mỗi emailUnique partial index UPI_Subscriber_email (where deletedAt IS NULL) + SubscriberService.subscribe() find-then-reactivate
unsubscribeToken đủ unique để không đoán đượcSnowflake $defaultFn (64-bit, worker 10) — xem ADR-0001
Re-subscribe clear unsubscribedAtSubscriberService.subscribe() set unsubscribedAt: null khi reactivate

4. Hành vi Soft-delete

Hành viChi tiết
Đọc mặc địnhdeletedAt IS NULL (model defaultFilter)
Hard-deleteKhông bao giờ theo mặc định; CRUD admin deleteById thực hiện soft-delete
RestoreKhông expose qua API
Email uniquenessChỉ thực thi trên các dòng không-xóa (partial unique index)

5. Trang liên quan

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