@aphexcms/postgresql-adapter 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/asset-adapter.d.ts +50 -0
- package/dist/asset-adapter.d.ts.map +1 -0
- package/dist/asset-adapter.js +230 -0
- package/dist/asset-adapter.js.map +1 -0
- package/dist/document-adapter.d.ts +54 -0
- package/dist/document-adapter.d.ts.map +1 -0
- package/dist/document-adapter.js +195 -0
- package/dist/document-adapter.js.map +1 -0
- package/dist/index.d.ts +161 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +450 -0
- package/dist/index.js.map +1 -0
- package/dist/organization-adapter.d.ts +37 -0
- package/dist/organization-adapter.d.ts.map +1 -0
- package/dist/organization-adapter.js +233 -0
- package/dist/organization-adapter.js.map +1 -0
- package/dist/schema-adapter.d.ts +23 -0
- package/dist/schema-adapter.d.ts.map +1 -0
- package/dist/schema-adapter.js +106 -0
- package/dist/schema-adapter.js.map +1 -0
- package/dist/schema.d.ts +2762 -0
- package/dist/schema.d.ts.map +1 -0
- package/dist/schema.js +200 -0
- package/dist/schema.js.map +1 -0
- package/dist/user-adapter.d.ts +25 -0
- package/dist/user-adapter.d.ts.map +1 -0
- package/dist/user-adapter.js +54 -0
- package/dist/user-adapter.js.map +1 -0
- package/dist/utils/reference-resolver.d.ts +17 -0
- package/dist/utils/reference-resolver.d.ts.map +1 -0
- package/dist/utils/reference-resolver.js +81 -0
- package/dist/utils/reference-resolver.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
2
|
+
import type { AssetAdapter, AssetFilters, CreateAssetData, UpdateAssetData, Asset } from '@aphexcms/cms-core/server';
|
|
3
|
+
import type { CMSSchema } from './schema.js';
|
|
4
|
+
/**
|
|
5
|
+
* PostgreSQL asset adapter implementation
|
|
6
|
+
* Handles all asset-related database operations
|
|
7
|
+
*/
|
|
8
|
+
export declare class PostgreSQLAssetAdapter implements AssetAdapter {
|
|
9
|
+
private db;
|
|
10
|
+
private tables;
|
|
11
|
+
constructor(db: ReturnType<typeof drizzle>, tables: CMSSchema);
|
|
12
|
+
/**
|
|
13
|
+
* Create new asset
|
|
14
|
+
*/
|
|
15
|
+
createAsset(data: CreateAssetData): Promise<Asset>;
|
|
16
|
+
/**
|
|
17
|
+
* Find asset by ID
|
|
18
|
+
*/
|
|
19
|
+
findAssetById(organizationId: string, id: string): Promise<Asset | null>;
|
|
20
|
+
/**
|
|
21
|
+
* Find multiple assets with filtering
|
|
22
|
+
*/
|
|
23
|
+
findAssets(organizationId: string, filters?: Omit<AssetFilters, 'organizationId'>): Promise<Asset[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Find asset by ID (bypasses organization filter for public access)
|
|
26
|
+
* Uses raw SQL to bypass RLS policies
|
|
27
|
+
*/
|
|
28
|
+
findAssetByIdGlobal(id: string): Promise<Asset | null>;
|
|
29
|
+
/**
|
|
30
|
+
* Update asset metadata
|
|
31
|
+
*/
|
|
32
|
+
updateAsset(organizationId: string, id: string, data: UpdateAssetData): Promise<Asset | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Delete asset by ID
|
|
35
|
+
*/
|
|
36
|
+
deleteAsset(organizationId: string, id: string): Promise<boolean>;
|
|
37
|
+
/**
|
|
38
|
+
* Count total assets
|
|
39
|
+
*/
|
|
40
|
+
countAssets(organizationId: string): Promise<number>;
|
|
41
|
+
/**
|
|
42
|
+
* Count assets by type
|
|
43
|
+
*/
|
|
44
|
+
countAssetsByType(organizationId: string): Promise<Record<string, number>>;
|
|
45
|
+
/**
|
|
46
|
+
* Get total size of all assets
|
|
47
|
+
*/
|
|
48
|
+
getTotalAssetsSize(organizationId: string): Promise<number>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=asset-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-adapter.d.ts","sourceRoot":"","sources":["../src/asset-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,KAAK,EACX,YAAY,EACZ,YAAY,EACZ,eAAe,EACf,eAAe,EACf,KAAK,EACL,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C;;;GAGG;AACH,qBAAa,sBAAuB,YAAW,YAAY;IAC1D,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,MAAM,CAAY;gBAEd,EAAE,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS;IAK7D;;OAEG;IACG,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC;IA2BxD;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAiB9E;;OAEG;IACG,UAAU,CACf,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAM,GAChD,OAAO,CAAC,KAAK,EAAE,CAAC;IAyCnB;;;OAGG;IACG,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IA0C5D;;OAEG;IACG,WAAW,CAChB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,eAAe,GACnB,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAoBxB;;OAEG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAgBvE;;OAEG;IACG,WAAW,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc1D;;OAEG;IACG,iBAAiB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAuBhF;;OAEG;IACG,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAajE"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
import { eq, desc, and, like, sql } from 'drizzle-orm';
|
|
2
|
+
// Default values
|
|
3
|
+
const DEFAULT_LIMIT = 20;
|
|
4
|
+
const DEFAULT_OFFSET = 0;
|
|
5
|
+
/**
|
|
6
|
+
* PostgreSQL asset adapter implementation
|
|
7
|
+
* Handles all asset-related database operations
|
|
8
|
+
*/
|
|
9
|
+
export class PostgreSQLAssetAdapter {
|
|
10
|
+
db;
|
|
11
|
+
tables;
|
|
12
|
+
constructor(db, tables) {
|
|
13
|
+
this.db = db;
|
|
14
|
+
this.tables = tables;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Create new asset
|
|
18
|
+
*/
|
|
19
|
+
async createAsset(data) {
|
|
20
|
+
const result = await this.db
|
|
21
|
+
.insert(this.tables.assets)
|
|
22
|
+
.values({
|
|
23
|
+
organizationId: data.organizationId,
|
|
24
|
+
assetType: data.assetType,
|
|
25
|
+
filename: data.filename,
|
|
26
|
+
originalFilename: data.originalFilename,
|
|
27
|
+
mimeType: data.mimeType,
|
|
28
|
+
size: data.size,
|
|
29
|
+
url: data.url,
|
|
30
|
+
path: data.path,
|
|
31
|
+
storageAdapter: data.storageAdapter,
|
|
32
|
+
width: data.width,
|
|
33
|
+
height: data.height,
|
|
34
|
+
metadata: data.metadata,
|
|
35
|
+
title: data.title,
|
|
36
|
+
description: data.description,
|
|
37
|
+
alt: data.alt,
|
|
38
|
+
creditLine: data.creditLine,
|
|
39
|
+
createdBy: data.createdBy
|
|
40
|
+
})
|
|
41
|
+
.returning();
|
|
42
|
+
return result[0];
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Find asset by ID
|
|
46
|
+
*/
|
|
47
|
+
async findAssetById(organizationId, id) {
|
|
48
|
+
try {
|
|
49
|
+
const result = await this.db
|
|
50
|
+
.select()
|
|
51
|
+
.from(this.tables.assets)
|
|
52
|
+
.where(and(eq(this.tables.assets.id, id), eq(this.tables.assets.organizationId, organizationId)))
|
|
53
|
+
.limit(1);
|
|
54
|
+
return result[0] || null;
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('Error finding asset by ID:', error);
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Find multiple assets with filtering
|
|
63
|
+
*/
|
|
64
|
+
async findAssets(organizationId, filters = {}) {
|
|
65
|
+
try {
|
|
66
|
+
const { assetType, mimeType, search, limit = DEFAULT_LIMIT, offset = DEFAULT_OFFSET } = filters;
|
|
67
|
+
// Build query conditions - ALWAYS include organizationId
|
|
68
|
+
const conditions = [eq(this.tables.assets.organizationId, organizationId)];
|
|
69
|
+
if (assetType) {
|
|
70
|
+
conditions.push(eq(this.tables.assets.assetType, assetType));
|
|
71
|
+
}
|
|
72
|
+
if (mimeType) {
|
|
73
|
+
conditions.push(eq(this.tables.assets.mimeType, mimeType));
|
|
74
|
+
}
|
|
75
|
+
if (search) {
|
|
76
|
+
conditions.push(like(this.tables.assets.originalFilename, `%${search}%`));
|
|
77
|
+
}
|
|
78
|
+
// Build and execute query
|
|
79
|
+
const result = await this.db
|
|
80
|
+
.select()
|
|
81
|
+
.from(this.tables.assets)
|
|
82
|
+
.where(and(...conditions))
|
|
83
|
+
.orderBy(desc(this.tables.assets.createdAt))
|
|
84
|
+
.limit(limit)
|
|
85
|
+
.offset(offset);
|
|
86
|
+
return result;
|
|
87
|
+
}
|
|
88
|
+
catch (error) {
|
|
89
|
+
console.error('Error finding assets:', error);
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Find asset by ID (bypasses organization filter for public access)
|
|
95
|
+
* Uses raw SQL to bypass RLS policies
|
|
96
|
+
*/
|
|
97
|
+
async findAssetByIdGlobal(id) {
|
|
98
|
+
try {
|
|
99
|
+
const result = await this.db.execute(sql `
|
|
100
|
+
SELECT * FROM ${this.tables.assets}
|
|
101
|
+
WHERE id = ${id}
|
|
102
|
+
LIMIT 1
|
|
103
|
+
`);
|
|
104
|
+
// Drizzle's execute returns an array directly with snake_case columns
|
|
105
|
+
if (result && result.length > 0) {
|
|
106
|
+
const raw = result[0];
|
|
107
|
+
return {
|
|
108
|
+
id: raw.id,
|
|
109
|
+
organizationId: raw.organization_id,
|
|
110
|
+
assetType: raw.asset_type,
|
|
111
|
+
filename: raw.filename,
|
|
112
|
+
originalFilename: raw.original_filename,
|
|
113
|
+
mimeType: raw.mime_type,
|
|
114
|
+
size: raw.size,
|
|
115
|
+
url: raw.url,
|
|
116
|
+
path: raw.path,
|
|
117
|
+
storageAdapter: raw.storage_adapter,
|
|
118
|
+
width: raw.width,
|
|
119
|
+
height: raw.height,
|
|
120
|
+
metadata: raw.metadata,
|
|
121
|
+
title: raw.title,
|
|
122
|
+
description: raw.description,
|
|
123
|
+
alt: raw.alt,
|
|
124
|
+
creditLine: raw.credit_line,
|
|
125
|
+
createdBy: raw.created_by,
|
|
126
|
+
createdAt: raw.created_at,
|
|
127
|
+
updatedAt: raw.updated_at
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
catch (error) {
|
|
133
|
+
console.error('Error finding asset globally:', error);
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Update asset metadata
|
|
139
|
+
*/
|
|
140
|
+
async updateAsset(organizationId, id, data) {
|
|
141
|
+
try {
|
|
142
|
+
const result = await this.db
|
|
143
|
+
.update(this.tables.assets)
|
|
144
|
+
.set({
|
|
145
|
+
...data,
|
|
146
|
+
updatedAt: new Date()
|
|
147
|
+
})
|
|
148
|
+
.where(and(eq(this.tables.assets.id, id), eq(this.tables.assets.organizationId, organizationId)))
|
|
149
|
+
.returning();
|
|
150
|
+
return result[0] || null;
|
|
151
|
+
}
|
|
152
|
+
catch (error) {
|
|
153
|
+
console.error('Error updating asset:', error);
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Delete asset by ID
|
|
159
|
+
*/
|
|
160
|
+
async deleteAsset(organizationId, id) {
|
|
161
|
+
try {
|
|
162
|
+
const result = await this.db
|
|
163
|
+
.delete(this.tables.assets)
|
|
164
|
+
.where(and(eq(this.tables.assets.id, id), eq(this.tables.assets.organizationId, organizationId)))
|
|
165
|
+
.returning({ id: this.tables.assets.id });
|
|
166
|
+
return result.length > 0;
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
console.error('Error deleting asset:', error);
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Count total assets
|
|
175
|
+
*/
|
|
176
|
+
async countAssets(organizationId) {
|
|
177
|
+
try {
|
|
178
|
+
const result = await this.db
|
|
179
|
+
.select({ count: sql `count(*)` })
|
|
180
|
+
.from(this.tables.assets)
|
|
181
|
+
.where(eq(this.tables.assets.organizationId, organizationId));
|
|
182
|
+
return result[0]?.count || 0;
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
console.error('Error counting assets:', error);
|
|
186
|
+
return 0;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Count assets by type
|
|
191
|
+
*/
|
|
192
|
+
async countAssetsByType(organizationId) {
|
|
193
|
+
try {
|
|
194
|
+
const result = await this.db
|
|
195
|
+
.select({
|
|
196
|
+
assetType: this.tables.assets.assetType,
|
|
197
|
+
count: sql `count(*)`
|
|
198
|
+
})
|
|
199
|
+
.from(this.tables.assets)
|
|
200
|
+
.where(eq(this.tables.assets.organizationId, organizationId))
|
|
201
|
+
.groupBy(this.tables.assets.assetType);
|
|
202
|
+
const counts = {};
|
|
203
|
+
result.forEach((row) => {
|
|
204
|
+
counts[row.assetType] = row.count;
|
|
205
|
+
});
|
|
206
|
+
return counts;
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
console.error('Error getting asset counts by type:', error);
|
|
210
|
+
return {};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Get total size of all assets
|
|
215
|
+
*/
|
|
216
|
+
async getTotalAssetsSize(organizationId) {
|
|
217
|
+
try {
|
|
218
|
+
const result = await this.db
|
|
219
|
+
.select({ totalSize: sql `sum(size)` })
|
|
220
|
+
.from(this.tables.assets)
|
|
221
|
+
.where(eq(this.tables.assets.organizationId, organizationId));
|
|
222
|
+
return result[0]?.totalSize || 0;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
console.error('Error getting total assets size:', error);
|
|
226
|
+
return 0;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=asset-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"asset-adapter.js","sourceRoot":"","sources":["../src/asset-adapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { drizzle } from 'drizzle-orm/postgres-js';
|
|
2
|
+
import type { DocumentAdapter, DocumentFilters, CreateDocumentData, Document } from '@aphexcms/cms-core/server';
|
|
3
|
+
import type { CMSSchema } from './schema.js';
|
|
4
|
+
export declare const DOCUMENT_STATUS: {
|
|
5
|
+
DRAFT: "draft";
|
|
6
|
+
PUBLISHED: "published";
|
|
7
|
+
};
|
|
8
|
+
export type DocumentStatus = 'draft' | 'published';
|
|
9
|
+
/**
|
|
10
|
+
* PostgreSQL document adapter implementation
|
|
11
|
+
* Handles all document-related database operations
|
|
12
|
+
*/
|
|
13
|
+
export declare class PostgreSQLDocumentAdapter implements DocumentAdapter {
|
|
14
|
+
private db;
|
|
15
|
+
private tables;
|
|
16
|
+
constructor(db: ReturnType<typeof drizzle>, tables: CMSSchema);
|
|
17
|
+
/**
|
|
18
|
+
* Get all documents with optional filtering
|
|
19
|
+
*/
|
|
20
|
+
findManyDoc(organizationId: string, filters?: Omit<DocumentFilters, 'organizationId'>): Promise<Document[]>;
|
|
21
|
+
/**
|
|
22
|
+
* Get document by ID
|
|
23
|
+
*/
|
|
24
|
+
findByDocId(organizationId: string, id: string, depth?: number): Promise<Document | null>;
|
|
25
|
+
/**
|
|
26
|
+
* Create new document (always starts as draft)
|
|
27
|
+
*/
|
|
28
|
+
createDocument(data: CreateDocumentData): Promise<Document>;
|
|
29
|
+
/**
|
|
30
|
+
* Update draft data (auto-save)
|
|
31
|
+
*/
|
|
32
|
+
updateDocDraft(organizationId: string, id: string, data: any, updatedBy?: string): Promise<Document | null>;
|
|
33
|
+
/**
|
|
34
|
+
* Publish document (copy draft -> published)
|
|
35
|
+
*/
|
|
36
|
+
publishDoc(organizationId: string, id: string): Promise<Document | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Unpublish document (revert to draft only)
|
|
39
|
+
*/
|
|
40
|
+
unpublishDoc(organizationId: string, id: string): Promise<Document | null>;
|
|
41
|
+
/**
|
|
42
|
+
* Delete document permanently
|
|
43
|
+
*/
|
|
44
|
+
deleteDocById(organizationId: string, id: string): Promise<boolean>;
|
|
45
|
+
/**
|
|
46
|
+
* Count documents by type
|
|
47
|
+
*/
|
|
48
|
+
countDocsByType(organizationId: string, type: string): Promise<number>;
|
|
49
|
+
/**
|
|
50
|
+
* Get counts for all document types
|
|
51
|
+
*/
|
|
52
|
+
getDocCountsByType(organizationId: string): Promise<Record<string, number>>;
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=document-adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-adapter.d.ts","sourceRoot":"","sources":["../src/document-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,KAAK,EACX,eAAe,EACf,eAAe,EACf,kBAAkB,EAClB,QAAQ,EACR,MAAM,2BAA2B,CAAC;AAEnC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAQ7C,eAAO,MAAM,eAAe;;;CAG3B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,WAAW,CAAC;AAEnD;;;GAGG;AACH,qBAAa,yBAA0B,YAAW,eAAe;IAChE,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,MAAM,CAAY;gBAEd,EAAE,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS;IAK7D;;OAEG;IACG,WAAW,CAChB,cAAc,EAAE,MAAM,EACtB,OAAO,GAAE,IAAI,CAAC,eAAe,EAAE,gBAAgB,CAAM,GACnD,OAAO,CAAC,QAAQ,EAAE,CAAC;IAqDtB;;OAEG;IACG,WAAW,CAChB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,KAAK,GAAE,MAAU,GACf,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAsB3B;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,QAAQ,CAAC;IAmBjE;;OAEG;IACG,cAAc,CACnB,cAAc,EAAE,MAAM,EACtB,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,GAAG,EACT,SAAS,CAAC,EAAE,MAAM,GAChB,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAqB3B;;OAEG;IACG,UAAU,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAgC9E;;OAEG;IACG,YAAY,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAuBhF;;OAEG;IACG,aAAa,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAczE;;OAEG;IACG,eAAe,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAc5E;;OAEG;IACG,kBAAkB,CAAC,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAiBjF"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { eq, and, desc, sql, inArray } from 'drizzle-orm';
|
|
2
|
+
import { createHashForPublishing } from '@aphexcms/cms-core/server';
|
|
3
|
+
import { resolveReferences } from './utils/reference-resolver.js';
|
|
4
|
+
// Default values
|
|
5
|
+
const DEFAULT_LIMIT = 50;
|
|
6
|
+
const DEFAULT_OFFSET = 0;
|
|
7
|
+
// Document status constants
|
|
8
|
+
export const DOCUMENT_STATUS = {
|
|
9
|
+
DRAFT: 'draft',
|
|
10
|
+
PUBLISHED: 'published'
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* PostgreSQL document adapter implementation
|
|
14
|
+
* Handles all document-related database operations
|
|
15
|
+
*/
|
|
16
|
+
export class PostgreSQLDocumentAdapter {
|
|
17
|
+
db;
|
|
18
|
+
tables;
|
|
19
|
+
constructor(db, tables) {
|
|
20
|
+
this.db = db;
|
|
21
|
+
this.tables = tables;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get all documents with optional filtering
|
|
25
|
+
*/
|
|
26
|
+
async findManyDoc(organizationId, filters = {}) {
|
|
27
|
+
// Apply defaults
|
|
28
|
+
const { type, status, limit = DEFAULT_LIMIT, offset = DEFAULT_OFFSET, depth = 0, filterOrganizationIds } = filters;
|
|
29
|
+
// Build query conditions
|
|
30
|
+
const conditions = [];
|
|
31
|
+
// If filterOrganizationIds is provided, filter by those specific orgs
|
|
32
|
+
// RLS will ensure user has access to them (e.g., parent can access children)
|
|
33
|
+
if (filterOrganizationIds && filterOrganizationIds.length > 0) {
|
|
34
|
+
conditions.push(inArray(this.tables.documents.organizationId, filterOrganizationIds));
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
// Always filter by the current organizationId - don't show parent org documents
|
|
38
|
+
conditions.push(eq(this.tables.documents.organizationId, organizationId));
|
|
39
|
+
}
|
|
40
|
+
if (type) {
|
|
41
|
+
conditions.push(eq(this.tables.documents.type, type));
|
|
42
|
+
}
|
|
43
|
+
if (status) {
|
|
44
|
+
conditions.push(eq(this.tables.documents.status, status));
|
|
45
|
+
}
|
|
46
|
+
// Build and execute query
|
|
47
|
+
let query = this.db.select().from(this.tables.documents);
|
|
48
|
+
// Only add WHERE clause if there are conditions
|
|
49
|
+
if (conditions.length > 0) {
|
|
50
|
+
query = query.where(and(...conditions));
|
|
51
|
+
}
|
|
52
|
+
const result = await query
|
|
53
|
+
.orderBy(desc(this.tables.documents.updatedAt))
|
|
54
|
+
.limit(limit)
|
|
55
|
+
.offset(offset);
|
|
56
|
+
// Resolve references if depth > 0
|
|
57
|
+
if (depth > 0) {
|
|
58
|
+
return Promise.all(result.map((doc) => resolveReferences(doc, this, organizationId, { depth })));
|
|
59
|
+
}
|
|
60
|
+
return result;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get document by ID
|
|
64
|
+
*/
|
|
65
|
+
async findByDocId(organizationId, id, depth = 0) {
|
|
66
|
+
const result = await this.db
|
|
67
|
+
.select()
|
|
68
|
+
.from(this.tables.documents)
|
|
69
|
+
.where(and(eq(this.tables.documents.id, id), eq(this.tables.documents.organizationId, organizationId)))
|
|
70
|
+
.limit(1);
|
|
71
|
+
const document = result[0] || null;
|
|
72
|
+
// Resolve references if depth > 0 and document exists
|
|
73
|
+
if (document && depth > 0) {
|
|
74
|
+
return resolveReferences(document, this, organizationId, { depth });
|
|
75
|
+
}
|
|
76
|
+
return document;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Create new document (always starts as draft)
|
|
80
|
+
*/
|
|
81
|
+
async createDocument(data) {
|
|
82
|
+
const now = new Date();
|
|
83
|
+
const result = await this.db
|
|
84
|
+
.insert(this.tables.documents)
|
|
85
|
+
.values({
|
|
86
|
+
organizationId: data.organizationId,
|
|
87
|
+
type: data.type,
|
|
88
|
+
status: DOCUMENT_STATUS.DRAFT,
|
|
89
|
+
draftData: data.draftData,
|
|
90
|
+
createdBy: data.createdBy,
|
|
91
|
+
createdAt: now,
|
|
92
|
+
updatedAt: now
|
|
93
|
+
})
|
|
94
|
+
.returning();
|
|
95
|
+
return result[0];
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Update draft data (auto-save)
|
|
99
|
+
*/
|
|
100
|
+
async updateDocDraft(organizationId, id, data, updatedBy) {
|
|
101
|
+
const now = new Date();
|
|
102
|
+
const result = await this.db
|
|
103
|
+
.update(this.tables.documents)
|
|
104
|
+
.set({
|
|
105
|
+
draftData: data,
|
|
106
|
+
updatedBy,
|
|
107
|
+
updatedAt: now
|
|
108
|
+
})
|
|
109
|
+
.where(and(eq(this.tables.documents.id, id), eq(this.tables.documents.organizationId, organizationId)))
|
|
110
|
+
.returning();
|
|
111
|
+
return result[0] || null;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Publish document (copy draft -> published)
|
|
115
|
+
*/
|
|
116
|
+
async publishDoc(organizationId, id) {
|
|
117
|
+
const now = new Date();
|
|
118
|
+
// Get current document
|
|
119
|
+
const current = await this.findByDocId(organizationId, id);
|
|
120
|
+
if (!current || !current.draftData) {
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
// Create content hash for change detection
|
|
124
|
+
const contentHash = createHashForPublishing(current.draftData);
|
|
125
|
+
const result = await this.db
|
|
126
|
+
.update(this.tables.documents)
|
|
127
|
+
.set({
|
|
128
|
+
status: DOCUMENT_STATUS.PUBLISHED,
|
|
129
|
+
publishedData: current.draftData,
|
|
130
|
+
publishedHash: contentHash,
|
|
131
|
+
publishedAt: now,
|
|
132
|
+
updatedAt: now
|
|
133
|
+
})
|
|
134
|
+
.where(and(eq(this.tables.documents.id, id), eq(this.tables.documents.organizationId, organizationId)))
|
|
135
|
+
.returning();
|
|
136
|
+
return result[0] || null;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Unpublish document (revert to draft only)
|
|
140
|
+
*/
|
|
141
|
+
async unpublishDoc(organizationId, id) {
|
|
142
|
+
const now = new Date();
|
|
143
|
+
const result = await this.db
|
|
144
|
+
.update(this.tables.documents)
|
|
145
|
+
.set({
|
|
146
|
+
status: DOCUMENT_STATUS.DRAFT,
|
|
147
|
+
publishedData: null,
|
|
148
|
+
publishedHash: null,
|
|
149
|
+
publishedAt: null,
|
|
150
|
+
updatedAt: now
|
|
151
|
+
})
|
|
152
|
+
.where(and(eq(this.tables.documents.id, id), eq(this.tables.documents.organizationId, organizationId)))
|
|
153
|
+
.returning();
|
|
154
|
+
return result[0] || null;
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Delete document permanently
|
|
158
|
+
*/
|
|
159
|
+
async deleteDocById(organizationId, id) {
|
|
160
|
+
const result = await this.db
|
|
161
|
+
.delete(this.tables.documents)
|
|
162
|
+
.where(and(eq(this.tables.documents.id, id), eq(this.tables.documents.organizationId, organizationId)))
|
|
163
|
+
.returning({ id: this.tables.documents.id });
|
|
164
|
+
return result.length > 0;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Count documents by type
|
|
168
|
+
*/
|
|
169
|
+
async countDocsByType(organizationId, type) {
|
|
170
|
+
const result = await this.db
|
|
171
|
+
.select({ count: sql `count(*)` })
|
|
172
|
+
.from(this.tables.documents)
|
|
173
|
+
.where(and(eq(this.tables.documents.organizationId, organizationId), eq(this.tables.documents.type, type)));
|
|
174
|
+
return result[0]?.count || 0;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Get counts for all document types
|
|
178
|
+
*/
|
|
179
|
+
async getDocCountsByType(organizationId) {
|
|
180
|
+
const result = await this.db
|
|
181
|
+
.select({
|
|
182
|
+
type: this.tables.documents.type,
|
|
183
|
+
count: sql `count(*)`
|
|
184
|
+
})
|
|
185
|
+
.from(this.tables.documents)
|
|
186
|
+
.where(eq(this.tables.documents.organizationId, organizationId))
|
|
187
|
+
.groupBy(this.tables.documents.type);
|
|
188
|
+
const counts = {};
|
|
189
|
+
result.forEach((row) => {
|
|
190
|
+
counts[row.type] = row.count;
|
|
191
|
+
});
|
|
192
|
+
return counts;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
//# sourceMappingURL=document-adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-adapter.js","sourceRoot":"","sources":["../src/document-adapter.ts"],"names":[],"mappings":"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"}
|