@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.
@@ -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":"AAEA,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAO1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAElE,iBAAiB;AACjB,MAAM,aAAa,GAAG,EAAE,CAAC;AACzB,MAAM,cAAc,GAAG,CAAC,CAAC;AAEzB,4BAA4B;AAC5B,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,KAAK,EAAE,OAAgB;IACvB,SAAS,EAAE,WAAoB;CAC/B,CAAC;AAIF;;;GAGG;AACH,MAAM,OAAO,yBAAyB;IAC7B,EAAE,CAA6B;IAC/B,MAAM,CAAY;IAE1B,YAAY,EAA8B,EAAE,MAAiB;QAC5D,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAChB,cAAsB,EACtB,UAAmD,EAAE;QAErD,iBAAiB;QACjB,MAAM,EACL,IAAI,EACJ,MAAM,EACN,KAAK,GAAG,aAAa,EACrB,MAAM,GAAG,cAAc,EACvB,KAAK,GAAG,CAAC,EACT,qBAAqB,EACrB,GAAG,OAAO,CAAC;QAEZ,yBAAyB;QACzB,MAAM,UAAU,GAAG,EAAE,CAAC;QAEtB,sEAAsE;QACtE,6EAA6E;QAC7E,IAAI,qBAAqB,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/D,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACvF,CAAC;aAAM,CAAC;YACP,gFAAgF;YAChF,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,CAAC;QAC3E,CAAC;QAED,IAAI,IAAI,EAAE,CAAC;YACV,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,IAAI,MAAM,EAAE,CAAC;YACZ,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAwB,CAAC,CAAC,CAAC;QAC7E,CAAC;QAED,0BAA0B;QAC1B,IAAI,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAEzD,gDAAgD;QAChD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,UAAU,CAAC,CAAQ,CAAC;QAChD,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,KAAK;aACxB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;aAC9C,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,MAAM,CAAC,CAAC;QAEjB,kCAAkC;QAClC,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,GAAG,CACjB,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,CAC5E,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAChB,cAAsB,EACtB,EAAU,EACV,QAAgB,CAAC;QAEjB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,EAAE;aACR,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC3B,KAAK,CACL,GAAG,CACF,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAChC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CACxD,CACD;aACA,KAAK,CAAC,CAAC,CAAC,CAAC;QAEX,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAEnC,sDAAsD;QACtD,IAAI,QAAQ,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,iBAAiB,CAAC,QAAQ,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,IAAwB;QAC5C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC7B,MAAM,CAAC;YACP,cAAc,EAAE,IAAI,CAAC,cAAc;YACnC,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,eAAe,CAAC,KAAK;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACd,CAAC;aACD,SAAS,EAAE,CAAC;QAEd,OAAO,MAAM,CAAC,CAAC,CAAE,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CACnB,cAAsB,EACtB,EAAU,EACV,IAAS,EACT,SAAkB;QAElB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC7B,GAAG,CAAC;YACJ,SAAS,EAAE,IAAI;YACf,SAAS;YACT,SAAS,EAAE,GAAG;SACd,CAAC;aACD,KAAK,CACL,GAAG,CACF,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAChC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CACxD,CACD;aACA,SAAS,EAAE,CAAC;QAEd,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,cAAsB,EAAE,EAAU;QAClD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,uBAAuB;QACvB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QAC3D,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACb,CAAC;QAED,2CAA2C;QAC3C,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAE/D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC7B,GAAG,CAAC;YACJ,MAAM,EAAE,eAAe,CAAC,SAAS;YACjC,aAAa,EAAE,OAAO,CAAC,SAAS;YAChC,aAAa,EAAE,WAAW;YAC1B,WAAW,EAAE,GAAG;YAChB,SAAS,EAAE,GAAG;SACd,CAAC;aACD,KAAK,CACL,GAAG,CACF,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAChC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CACxD,CACD;aACA,SAAS,EAAE,CAAC;QAEd,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,cAAsB,EAAE,EAAU;QACpD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC7B,GAAG,CAAC;YACJ,MAAM,EAAE,eAAe,CAAC,KAAK;YAC7B,aAAa,EAAE,IAAI;YACnB,aAAa,EAAE,IAAI;YACnB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,GAAG;SACd,CAAC;aACD,KAAK,CACL,GAAG,CACF,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAChC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CACxD,CACD;aACA,SAAS,EAAE,CAAC;QAEd,OAAO,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,cAAsB,EAAE,EAAU;QACrD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC7B,KAAK,CACL,GAAG,CACF,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAChC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CACxD,CACD;aACA,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAE9C,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,eAAe,CAAC,cAAsB,EAAE,IAAY;QACzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,EAAE,KAAK,EAAE,GAAG,CAAQ,UAAU,EAAE,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC3B,KAAK,CACL,GAAG,CACF,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,EACxD,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CACpC,CACD,CAAC;QAEH,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,cAAsB;QAC9C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC;YACP,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI;YAChC,KAAK,EAAE,GAAG,CAAQ,UAAU;SAC5B,CAAC;aACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;aAC3B,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;aAC/D,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAEtC,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,MAAM,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE;YACtB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IACf,CAAC;CACD"}