update docs

This commit is contained in:
2026-07-22 14:11:18 +07:00
parent a836645728
commit 166276d19b
14 changed files with 1308 additions and 17 deletions

View File

@@ -9,6 +9,7 @@ IF OBJECT_ID(N'dbo.ApplicationPackages', N'U') IS NOT NULL
OR OBJECT_ID(N'dbo.PackageVersions', N'U') IS NOT NULL
OR OBJECT_ID(N'dbo.Applications', N'U') IS NOT NULL
OR OBJECT_ID(N'dbo.Packages', N'U') IS NOT NULL
OR OBJECT_ID(N'dbo.Documents', N'U') IS NOT NULL
OR OBJECT_ID(N'dbo.EmailConfirmationTokens', N'U') IS NOT NULL
OR OBJECT_ID(N'dbo.Users', N'U') IS NOT NULL
BEGIN
@@ -54,6 +55,37 @@ CREATE TABLE dbo.EmailConfirmationTokens
);
GO
CREATE TABLE dbo.Documents
(
Id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT PK_Documents PRIMARY KEY CLUSTERED
CONSTRAINT DF_Documents_Id DEFAULT NEWSEQUENTIALID(),
Title NVARCHAR(200) NOT NULL,
Category NVARCHAR(50) NOT NULL
CONSTRAINT DF_Documents_Category DEFAULT N'other',
Summary NVARCHAR(1000) NULL,
Content NVARCHAR(MAX) NULL,
FilePath NVARCHAR(1000) NULL,
OriginalFileName NVARCHAR(260) NULL,
MimeType NVARCHAR(200) NULL,
FileSizeBytes BIGINT NULL,
CreatedByUserId UNIQUEIDENTIFIER NOT NULL,
CreatedAt DATETIME2(3) NOT NULL
CONSTRAINT DF_Documents_CreatedAt DEFAULT SYSUTCDATETIME(),
UpdatedAt DATETIME2(3) NULL,
CONSTRAINT FK_Documents_CreatedByUser
FOREIGN KEY (CreatedByUserId) REFERENCES dbo.Users(Id),
CONSTRAINT CK_Documents_Title_NotBlank CHECK (LEN(LTRIM(RTRIM(Title))) > 0),
CONSTRAINT CK_Documents_Category CHECK (
Category IN (N'introduction', N'guide', N'user-guide', N'technical', N'policy', N'other')
),
CONSTRAINT CK_Documents_FileSizeBytes CHECK (FileSizeBytes IS NULL OR FileSizeBytes >= 0),
CONSTRAINT CK_Documents_HasReadableContent CHECK (
NULLIF(LTRIM(RTRIM(Content)), N'') IS NOT NULL OR FilePath IS NOT NULL
)
);
GO
CREATE TABLE dbo.Packages
(
Id UNIQUEIDENTIFIER NOT NULL
@@ -164,6 +196,13 @@ CREATE INDEX IX_EmailConfirmationTokens_UserId
ON dbo.EmailConfirmationTokens(UserId);
GO
CREATE INDEX IX_Documents_Category_UpdatedAt
ON dbo.Documents(Category, UpdatedAt DESC, CreatedAt DESC);
CREATE INDEX IX_Documents_CreatedByUserId
ON dbo.Documents(CreatedByUserId);
GO
CREATE UNIQUE INDEX UX_Packages_PackageCode ON dbo.Packages(PackageCode);
CREATE INDEX IX_Packages_CreatedByUserId ON dbo.Packages(CreatedByUserId);
CREATE INDEX IX_Packages_PackageType ON dbo.Packages(PackageType);

View File

@@ -0,0 +1,67 @@
USE [RobotInstaller];
GO
SET ANSI_NULLS ON;
SET QUOTED_IDENTIFIER ON;
GO
IF OBJECT_ID(N'dbo.Documents', N'U') IS NULL
BEGIN
CREATE TABLE dbo.Documents
(
Id UNIQUEIDENTIFIER NOT NULL
CONSTRAINT PK_Documents PRIMARY KEY CLUSTERED
CONSTRAINT DF_Documents_Id DEFAULT NEWSEQUENTIALID(),
Title NVARCHAR(200) NOT NULL,
Category NVARCHAR(50) NOT NULL
CONSTRAINT DF_Documents_Category DEFAULT N'other',
Summary NVARCHAR(1000) NULL,
Content NVARCHAR(MAX) NULL,
FilePath NVARCHAR(1000) NULL,
OriginalFileName NVARCHAR(260) NULL,
MimeType NVARCHAR(200) NULL,
FileSizeBytes BIGINT NULL,
CreatedByUserId UNIQUEIDENTIFIER NOT NULL,
CreatedAt DATETIME2(3) NOT NULL
CONSTRAINT DF_Documents_CreatedAt DEFAULT SYSUTCDATETIME(),
UpdatedAt DATETIME2(3) NULL,
CONSTRAINT FK_Documents_CreatedByUser
FOREIGN KEY (CreatedByUserId) REFERENCES dbo.Users(Id),
CONSTRAINT CK_Documents_Title_NotBlank CHECK (LEN(LTRIM(RTRIM(Title))) > 0),
CONSTRAINT CK_Documents_Category CHECK (
Category IN (N'introduction', N'guide', N'user-guide', N'technical', N'policy', N'other')
),
CONSTRAINT CK_Documents_FileSizeBytes CHECK (FileSizeBytes IS NULL OR FileSizeBytes >= 0),
CONSTRAINT CK_Documents_HasReadableContent CHECK (
NULLIF(LTRIM(RTRIM(Content)), N'') IS NOT NULL OR FilePath IS NOT NULL
)
);
END;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE name = N'IX_Documents_Category_UpdatedAt'
AND object_id = OBJECT_ID(N'dbo.Documents')
)
BEGIN
CREATE INDEX IX_Documents_Category_UpdatedAt
ON dbo.Documents(Category, UpdatedAt DESC, CreatedAt DESC);
END;
GO
IF NOT EXISTS (
SELECT 1
FROM sys.indexes
WHERE name = N'IX_Documents_CreatedByUserId'
AND object_id = OBJECT_ID(N'dbo.Documents')
)
BEGIN
CREATE INDEX IX_Documents_CreatedByUserId
ON dbo.Documents(CreatedByUserId);
END;
GO
PRINT N'RobotInstaller documents schema is ready.';
GO

View File

@@ -28,6 +28,7 @@ Không lưu mật khẩu thật vào file cấu hình. Khi chạy local, tạo f
| `dbo.PackageVersions` | Các version của từng package |
| `dbo.Applications` | App được đóng gói từ nhiều package |
| `dbo.ApplicationPackages` | Liên kết app-package, có thể chọn version cụ thể |
| `dbo.Documents` | Nội dung tài liệu và metadata file đính kèm |
| `dbo.Notifications` | Thông báo riêng cho từng user và thông báo hệ thống do Admin đăng |
## Ràng buộc quan trọng
@@ -65,13 +66,14 @@ sqlcmd -S 172.20.235.176 -U sa -b -i .\database\01_create_database.sql
sqlcmd -S 172.20.235.176 -U sa -d RobotInstaller -b -i .\database\02_schema.sql
sqlcmd -S 172.20.235.176 -U sa -d RobotInstaller -b -i .\database\03_views.sql
sqlcmd -S 172.20.235.176 -U sa -d RobotInstaller -b -i .\database\04_notifications.sql
sqlcmd -S 172.20.235.176 -U sa -d RobotInstaller -b -i .\database\05_documents.sql
```
Chạy các lệnh trên từ thư mục `web-server`.
Khi dùng `sqlcmd` để seed/test dữ liệu, thêm `-I` hoặc bật `SET QUOTED_IDENTIFIER ON` vì schema có filtered index cho ràng buộc một latest version trên mỗi package.
`04_notifications.sql` migration chỉ bổ sung bảng/index và có thể chạy lặp lại. Với database đang hoạt động, chỉ chạy file này; không chạy lại `02_schema.sql` vì script schema gốc chủ động dừng khi phát hiện bảng đã tồn tại.
`04_notifications.sql` `05_documents.sql` là các migration chỉ bổ sung bảng/index và có thể chạy lặp lại. Với database đang hoạt động, chỉ chạy các migration còn thiếu; không chạy lại `02_schema.sql` vì script schema gốc chủ động dừng khi phát hiện bảng đã tồn tại. Web server cũng tự bảo đảm bảng `Documents` tồn tại khi chức năng tài liệu được truy cập.
## Luồng dữ liệu đề xuất