@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 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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,EAAE,MAAM,CAAA;qBAAE;8BAC3D,MAAM;+BACL,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAuKtB,OAAO,GAAG,MAAM;+BACb,MAAM;;;;;;;;;;;;;;;4BADT,OAAO,GAAG,MAAM;+BACb,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BlB,CAAC;AAGF,MAAM,MAAM,SAAS,GAAG,OAAO,SAAS,CAAC;AAQzC,MAAM,MAAM,YAAY,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAC7D,MAAM,MAAM,eAAe,GAAG,OAAO,aAAa,CAAC,YAAY,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AACzE,MAAM,MAAM,qBAAqB,GAAG,OAAO,mBAAmB,CAAC,YAAY,CAAC;AAE5E,MAAM,MAAM,UAAU,GAAG,OAAO,WAAW,CAAC,YAAY,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,OAAO,WAAW,CAAC,YAAY,CAAC;AAE5D,MAAM,MAAM,WAAW,GAAG,OAAO,YAAY,CAAC,YAAY,CAAC;AAC3D,MAAM,MAAM,cAAc,GAAG,OAAO,YAAY,CAAC,YAAY,CAAC"}
package/dist/schema.js ADDED
@@ -0,0 +1,200 @@
1
+ // Database schema for Aphex CMS using Drizzle ORM
2
+ import { pgTable, text, uuid, timestamp, jsonb, varchar, integer, pgEnum, pgPolicy, unique } from 'drizzle-orm/pg-core';
3
+ import { sql } from 'drizzle-orm';
4
+ // ============================================
5
+ // ENUMS
6
+ // ============================================
7
+ export const documentStatusEnum = pgEnum('document_status', ['draft', 'published']);
8
+ export const schemaTypeEnum = pgEnum('schema_type', ['document', 'object']);
9
+ export const organizationRoleEnum = pgEnum('organization_role', [
10
+ 'owner',
11
+ 'admin',
12
+ 'editor',
13
+ 'viewer'
14
+ ]);
15
+ // ============================================
16
+ // MULTI-TENANCY TABLES
17
+ // ============================================
18
+ // Organizations table - stores organization (client/project) data with branding/settings
19
+ export const organizations = pgTable('cms_organizations', {
20
+ id: uuid('id').defaultRandom().primaryKey(),
21
+ name: varchar('name', { length: 200 }).notNull(),
22
+ slug: varchar('slug', { length: 100 }).notNull().unique(),
23
+ parentOrganizationId: uuid('parent_organization_id').references(() => organizations.id, {
24
+ onDelete: 'set null'
25
+ }), // For parent-child hierarchy (e.g., Record Label -> Artists)
26
+ metadata: jsonb('metadata').$type(),
27
+ createdBy: text('created_by').notNull(), // User ID (super admin who created it)
28
+ createdAt: timestamp('created_at').defaultNow().notNull(),
29
+ updatedAt: timestamp('updated_at').defaultNow().notNull()
30
+ });
31
+ // Organization Members table - junction table linking users to organizations with roles
32
+ export const organizationMembers = pgTable('cms_organization_members', {
33
+ id: uuid('id').defaultRandom().primaryKey(),
34
+ organizationId: uuid('organization_id')
35
+ .notNull()
36
+ .references(() => organizations.id, { onDelete: 'cascade' }),
37
+ userId: text('user_id').notNull(), // References Better Auth user
38
+ role: organizationRoleEnum('role').notNull(),
39
+ preferences: jsonb('preferences').$type(), // Org-specific user preferences
40
+ invitationId: uuid('invitation_id').references(() => invitations.id, { onDelete: 'set null' }), // Link to invitation (get invitedBy, invitedEmail from here)
41
+ createdAt: timestamp('created_at').defaultNow().notNull(),
42
+ updatedAt: timestamp('updated_at').defaultNow().notNull()
43
+ }, (table) => [unique().on(table.organizationId, table.userId)]);
44
+ // Invitations table - pending invitations with secure tokens
45
+ export const invitations = pgTable('cms_invitations', {
46
+ id: uuid('id').defaultRandom().primaryKey(),
47
+ organizationId: uuid('organization_id')
48
+ .notNull()
49
+ .references(() => organizations.id, { onDelete: 'cascade' }),
50
+ email: varchar('email', { length: 255 }).notNull(),
51
+ role: organizationRoleEnum('role').notNull(),
52
+ token: text('token').notNull().unique(), // Crypto-random token (32 bytes)
53
+ invitedBy: text('invited_by').notNull(), // User ID of inviter
54
+ expiresAt: timestamp('expires_at').notNull(), // Default: now() + 7 days
55
+ acceptedAt: timestamp('accepted_at'), // Null until accepted
56
+ createdAt: timestamp('created_at').defaultNow().notNull()
57
+ });
58
+ // User Sessions table - track which organization user is currently working in
59
+ export const userSessions = pgTable('cms_user_sessions', {
60
+ userId: text('user_id').primaryKey(), // References Better Auth user
61
+ activeOrganizationId: uuid('active_organization_id').references(() => organizations.id),
62
+ updatedAt: timestamp('updated_at').defaultNow().notNull()
63
+ });
64
+ // ============================================
65
+ // CONTENT TABLES
66
+ // ============================================
67
+ // Documents table - stores all content with draft/published separation
68
+ export const documents = pgTable('cms_documents', {
69
+ id: uuid('id').defaultRandom().primaryKey(),
70
+ organizationId: uuid('organization_id')
71
+ .notNull()
72
+ .references(() => organizations.id, { onDelete: 'cascade' }),
73
+ type: varchar('type', { length: 100 }).notNull(), // Document type name
74
+ status: documentStatusEnum('status').default('draft'), // 'draft' | 'published'
75
+ // Draft/Published data separation
76
+ draftData: jsonb('draft_data'), // Current working version
77
+ publishedData: jsonb('published_data'), // Live/published version
78
+ // Version tracking
79
+ publishedHash: varchar('published_hash', { length: 20 }), // Hash of published content for change detection
80
+ // User tracking (no FK - references user in app layer)
81
+ createdBy: text('created_by'), // User ID who created this document
82
+ updatedBy: text('updated_by'), // User ID who last updated this document
83
+ // Metadata
84
+ publishedAt: timestamp('published_at'), // When was it published
85
+ createdAt: timestamp('created_at').defaultNow(),
86
+ updatedAt: timestamp('updated_at').defaultNow()
87
+ }, () => [
88
+ // RLS Policy: Users can only access documents from their organization or child organizations
89
+ pgPolicy('documents_org_isolation', {
90
+ for: 'all',
91
+ using: sql `
92
+ organization_id IN (
93
+ SELECT current_setting('app.organization_id', true)::uuid
94
+ UNION
95
+ SELECT id FROM ${organizations}
96
+ WHERE parent_organization_id = current_setting('app.organization_id', true)::uuid
97
+ )
98
+ `,
99
+ withCheck: sql `
100
+ organization_id = current_setting('app.organization_id', true)::uuid
101
+ `
102
+ })
103
+ ]);
104
+ // Asset table - stores uploaded files (Sanity-style asset documents)
105
+ export const assets = pgTable('cms_assets', {
106
+ id: uuid('id').defaultRandom().primaryKey(),
107
+ organizationId: uuid('organization_id')
108
+ .notNull()
109
+ .references(() => organizations.id, { onDelete: 'cascade' }),
110
+ // Asset type: 'image' or 'file'
111
+ assetType: varchar('asset_type', { length: 20 }).notNull(), // 'image' | 'file'
112
+ // File information
113
+ filename: varchar('filename', { length: 255 }).notNull(), // Generated filename on disk
114
+ originalFilename: varchar('original_filename', { length: 255 }).notNull(),
115
+ mimeType: varchar('mime_type', { length: 100 }).notNull(),
116
+ size: integer('size').notNull(),
117
+ // Storage information
118
+ url: text('url').notNull(), // Public URL
119
+ path: text('path').notNull(), // Internal storage path
120
+ storageAdapter: varchar('storage_adapter', { length: 50 }).notNull().default('local'), // Which adapter stored this file
121
+ // Image-specific metadata (null for non-images)
122
+ width: integer('width'),
123
+ height: integer('height'),
124
+ // Rich metadata (Sanity-style)
125
+ metadata: jsonb('metadata'), // EXIF, color palette, etc.
126
+ // Optional fields (can be set during upload or later)
127
+ title: varchar('title', { length: 255 }),
128
+ description: text('description'),
129
+ alt: text('alt'),
130
+ creditLine: text('credit_line'),
131
+ // User tracking (no FK - references user in app layer)
132
+ createdBy: text('created_by'), // User ID who uploaded this asset
133
+ updatedBy: text('updated_by'), // User ID who last updated this asset
134
+ // Timestamps
135
+ createdAt: timestamp('created_at').defaultNow(),
136
+ updatedAt: timestamp('updated_at').defaultNow()
137
+ }, () => [
138
+ // RLS Policy: Users can only access assets from their organization or child organizations
139
+ pgPolicy('assets_org_isolation', {
140
+ for: 'all',
141
+ using: sql `
142
+ organization_id IN (
143
+ SELECT current_setting('app.organization_id', true)::uuid
144
+ UNION
145
+ SELECT id FROM ${organizations}
146
+ WHERE parent_organization_id = current_setting('app.organization_id', true)::uuid
147
+ )
148
+ `,
149
+ withCheck: sql `
150
+ organization_id = current_setting('app.organization_id', true)::uuid
151
+ `
152
+ })
153
+ ]);
154
+ // Schema types table - stores document and object type definitions (Sanity-style)
155
+ export const schemaTypes = pgTable('cms_schema_types', {
156
+ id: uuid('id').defaultRandom().primaryKey(),
157
+ name: varchar('name', { length: 100 }).notNull().unique(),
158
+ title: varchar('title', { length: 200 }).notNull(),
159
+ type: schemaTypeEnum('type').notNull(), // 'document' or 'object'
160
+ description: text('description'),
161
+ fields: jsonb('fields').notNull(), // Field definitions
162
+ createdAt: timestamp('created_at').defaultNow(),
163
+ updatedAt: timestamp('updated_at').defaultNow()
164
+ });
165
+ // User Profiles table - stores CMS-specific user data (roles, preferences)
166
+ export const userProfiles = pgTable('cms_user_profiles', {
167
+ userId: text('user_id').primaryKey(), // No FK - references user in app layer
168
+ role: text('role', { enum: ['super_admin', 'admin', 'editor', 'viewer'] })
169
+ .default('editor')
170
+ .notNull(),
171
+ preferences: jsonb('preferences').$type(),
172
+ createdAt: timestamp('created_at').defaultNow().notNull(),
173
+ updatedAt: timestamp('updated_at').defaultNow().notNull()
174
+ });
175
+ // ============================================
176
+ // EXPORT CMS SCHEMA
177
+ // ============================================
178
+ export const cmsSchema = {
179
+ // Multi-tenancy tables
180
+ organizations,
181
+ organizationMembers,
182
+ invitations,
183
+ userSessions,
184
+ // Content tables
185
+ documents,
186
+ assets,
187
+ schemaTypes,
188
+ userProfiles,
189
+ // Enums
190
+ documentStatusEnum,
191
+ schemaTypeEnum,
192
+ organizationRoleEnum
193
+ };
194
+ // ============================================
195
+ // TYPE SAFETY
196
+ // ============================================
197
+ // Type safety is enforced through the adapter interfaces
198
+ // DocumentAdapter, AssetAdapter use universal types from @aphexcms/cms-core/server
199
+ // The Drizzle schema must be compatible with these universal types
200
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import type { UserProfileAdapter, NewUserProfileData, UserProfile } from '@aphexcms/cms-core/server';
3
+ import type { CMSSchema } from './schema.js';
4
+ /**
5
+ * PostgreSQL user profile adapter implementation
6
+ * Handles all user profile-related database operations
7
+ */
8
+ export declare class PostgreSQLUserProfileAdapter implements UserProfileAdapter {
9
+ private db;
10
+ private tables;
11
+ constructor(db: ReturnType<typeof drizzle>, tables: CMSSchema);
12
+ /**
13
+ * Create a new user profile
14
+ */
15
+ createUserProfile(data: NewUserProfileData): Promise<UserProfile>;
16
+ /**
17
+ * Find a user profile by their ID
18
+ */
19
+ findUserProfileById(userId: string): Promise<UserProfile | null>;
20
+ /**
21
+ * Delete a user profile by their ID
22
+ */
23
+ deleteUserProfile(userId: string): Promise<boolean>;
24
+ }
25
+ //# sourceMappingURL=user-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-adapter.d.ts","sourceRoot":"","sources":["../src/user-adapter.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAElD,OAAO,KAAK,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACrG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;;GAGG;AACH,qBAAa,4BAA6B,YAAW,kBAAkB;IACtE,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,MAAM,CAAY;gBAEd,EAAE,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS;IAK7D;;OAEG;IACG,iBAAiB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,WAAW,CAAC;IAYvE;;OAEG;IACG,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC;IAmBtE;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAQzD"}
@@ -0,0 +1,54 @@
1
+ import { eq } from 'drizzle-orm';
2
+ /**
3
+ * PostgreSQL user profile adapter implementation
4
+ * Handles all user profile-related database operations
5
+ */
6
+ export class PostgreSQLUserProfileAdapter {
7
+ db;
8
+ tables;
9
+ constructor(db, tables) {
10
+ this.db = db;
11
+ this.tables = tables;
12
+ }
13
+ /**
14
+ * Create a new user profile
15
+ */
16
+ async createUserProfile(data) {
17
+ console.log(`[PostgreSQLAdapter]: Creating user profile for userId: ${data.userId}`);
18
+ const result = await this.db.insert(this.tables.userProfiles).values(data).returning();
19
+ const userProfile = result[0];
20
+ return {
21
+ ...userProfile,
22
+ preferences: userProfile.preferences ?? undefined
23
+ };
24
+ }
25
+ /**
26
+ * Find a user profile by their ID
27
+ */
28
+ async findUserProfileById(userId) {
29
+ const result = await this.db
30
+ .select()
31
+ .from(this.tables.userProfiles)
32
+ .where(eq(this.tables.userProfiles.userId, userId))
33
+ .limit(1);
34
+ const userProfile = result[0] || null;
35
+ if (!userProfile) {
36
+ return null;
37
+ }
38
+ return {
39
+ ...userProfile,
40
+ preferences: userProfile.preferences ?? undefined
41
+ };
42
+ }
43
+ /**
44
+ * Delete a user profile by their ID
45
+ */
46
+ async deleteUserProfile(userId) {
47
+ const result = await this.db
48
+ .delete(this.tables.userProfiles)
49
+ .where(eq(this.tables.userProfiles.userId, userId))
50
+ .returning({ id: this.tables.userProfiles.userId });
51
+ return result.length > 0;
52
+ }
53
+ }
54
+ //# sourceMappingURL=user-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user-adapter.js","sourceRoot":"","sources":["../src/user-adapter.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAIjC;;;GAGG;AACH,MAAM,OAAO,4BAA4B;IAChC,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,iBAAiB,CAAC,IAAwB;QAC/C,OAAO,CAAC,GAAG,CAAC,0DAA0D,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAEvF,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QAE/B,OAAO;YACN,GAAG,WAAW;YACd,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,SAAS;SACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,EAAE;aACR,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;aAC9B,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAClD,KAAK,CAAC,CAAC,CAAC,CAAC;QAEX,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;QAEtC,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO;YACN,GAAG,WAAW;YACd,WAAW,EAAE,WAAW,CAAC,WAAW,IAAI,SAAS;SACjD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,MAAc;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE;aAC1B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;aAChC,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;aAClD,SAAS,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QAErD,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1B,CAAC;CACD"}
@@ -0,0 +1,17 @@
1
+ import type { Document, DocumentAdapter } from '@aphexcms/cms-core/server';
2
+ interface ResolveOptions {
3
+ depth: number;
4
+ currentDepth?: number;
5
+ visited?: Set<string>;
6
+ }
7
+ /**
8
+ * Recursively resolves reference fields in a document
9
+ * @param document - The document to resolve references for
10
+ * @param adapter - Document adapter for fetching referenced documents
11
+ * @param organizationId - Organization ID for filtering referenced documents
12
+ * @param options - Resolution options (depth, tracking)
13
+ * @returns Document with resolved references
14
+ */
15
+ export declare function resolveReferences(document: Document, adapter: DocumentAdapter, organizationId: string, options: ResolveOptions): Promise<Document>;
16
+ export {};
17
+ //# sourceMappingURL=reference-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-resolver.d.ts","sourceRoot":"","sources":["../../src/utils/reference-resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE3E,UAAU,cAAc;IACvB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACtB;AAED;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACtC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,eAAe,EACxB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,cAAc,GACrB,OAAO,CAAC,QAAQ,CAAC,CA2CnB"}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Recursively resolves reference fields in a document
3
+ * @param document - The document to resolve references for
4
+ * @param adapter - Document adapter for fetching referenced documents
5
+ * @param organizationId - Organization ID for filtering referenced documents
6
+ * @param options - Resolution options (depth, tracking)
7
+ * @returns Document with resolved references
8
+ */
9
+ export async function resolveReferences(document, adapter, organizationId, options) {
10
+ const { depth, currentDepth = 0, visited = new Set() } = options;
11
+ // Base case: no more depth to resolve or already visited (circular reference)
12
+ if (currentDepth >= depth || visited.has(document.id)) {
13
+ return document;
14
+ }
15
+ // Mark as visited
16
+ visited.add(document.id);
17
+ // Clone the document to avoid mutations
18
+ const resolvedDocument = { ...document };
19
+ // Resolve references in draftData
20
+ if (document.draftData) {
21
+ resolvedDocument.draftData = await resolveDataReferences(document.draftData, adapter, organizationId, {
22
+ depth,
23
+ currentDepth: currentDepth + 1,
24
+ visited
25
+ });
26
+ }
27
+ // Resolve references in publishedData
28
+ if (document.publishedData) {
29
+ resolvedDocument.publishedData = await resolveDataReferences(document.publishedData, adapter, organizationId, {
30
+ depth,
31
+ currentDepth: currentDepth + 1,
32
+ visited
33
+ });
34
+ }
35
+ return resolvedDocument;
36
+ }
37
+ /**
38
+ * Resolves references within document data (recursive)
39
+ */
40
+ async function resolveDataReferences(data, adapter, organizationId, options) {
41
+ if (!data || typeof data !== 'object') {
42
+ return data;
43
+ }
44
+ // Handle arrays
45
+ if (Array.isArray(data)) {
46
+ return Promise.all(data.map((item) => resolveDataReferences(item, adapter, organizationId, options)));
47
+ }
48
+ // Clone object
49
+ const resolved = {};
50
+ for (const [key, value] of Object.entries(data)) {
51
+ // Check if this looks like a reference field (string ID)
52
+ if (typeof value === 'string' && key !== '_type' && key !== '_key') {
53
+ // Try to fetch the referenced document
54
+ try {
55
+ const referencedDoc = await adapter.findByDocId(organizationId, value);
56
+ if (referencedDoc) {
57
+ // Recursively resolve nested references
58
+ resolved[key] = await resolveReferences(referencedDoc, adapter, organizationId, options);
59
+ }
60
+ else {
61
+ // Reference not found, keep the ID
62
+ resolved[key] = value;
63
+ }
64
+ }
65
+ catch (error) {
66
+ // On error, keep the original value
67
+ resolved[key] = value;
68
+ }
69
+ }
70
+ else if (value && typeof value === 'object') {
71
+ // Recursively resolve nested objects/arrays
72
+ resolved[key] = await resolveDataReferences(value, adapter, organizationId, options);
73
+ }
74
+ else {
75
+ // Primitive value, keep as is
76
+ resolved[key] = value;
77
+ }
78
+ }
79
+ return resolved;
80
+ }
81
+ //# sourceMappingURL=reference-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-resolver.js","sourceRoot":"","sources":["../../src/utils/reference-resolver.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@aphexcms/postgresql-adapter",
3
+ "version": "0.1.0",
4
+ "description": "PostgreSQL database adapter for Aphex CMS using Drizzle ORM",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "default": "./dist/index.js"
13
+ },
14
+ "./schema": {
15
+ "types": "./dist/schema.d.ts",
16
+ "import": "./dist/schema.js",
17
+ "default": "./dist/schema.js"
18
+ }
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "scripts": {
24
+ "build": "tsc",
25
+ "prepublishOnly": "pnpm build"
26
+ },
27
+ "dependencies": {
28
+ "drizzle-orm": "^0.40.0",
29
+ "postgres": "^3.4.5"
30
+ },
31
+ "peerDependencies": {
32
+ "@aphexcms/cms-core": "workspace:*"
33
+ },
34
+ "devDependencies": {
35
+ "@aphexcms/cms-core": "workspace:*",
36
+ "tsup": "^8.0.0",
37
+ "typescript": "^5.3.3"
38
+ }
39
+ }