@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 @@
|
|
|
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":"AAAA,kDAAkD;AAClD,OAAO,EACN,OAAO,EACP,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,OAAO,EACP,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAElC,+CAA+C;AAC/C,QAAQ;AACR,+CAA+C;AAC/C,MAAM,CAAC,MAAM,kBAAkB,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC;AACpF,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,MAAM,CAAC,mBAAmB,EAAE;IAC/D,OAAO;IACP,OAAO;IACP,QAAQ;IACR,QAAQ;CACR,CAAC,CAAC;AAEH,+CAA+C;AAC/C,uBAAuB;AACvB,+CAA+C;AAE/C,yFAAyF;AACzF,MAAM,CAAC,MAAM,aAAa,GAAG,OAAO,CAAC,mBAAmB,EAAE;IACzD,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE;IAC3C,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAChD,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IACzD,oBAAoB,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,UAAU,CAAC,GAAQ,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE;QAC5F,QAAQ,EAAE,UAAU;KACpB,CAAC,EAAE,6DAA6D;IACjE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,EAK7B;IACJ,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,uCAAuC;IAChF,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACzD,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CACzD,CAAC,CAAC;AAEH,wFAAwF;AACxF,MAAM,CAAC,MAAM,mBAAmB,GAAG,OAAO,CACzC,0BAA0B,EAC1B;IACC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE;IAC3C,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;SACrC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,EAAE,8BAA8B;IACjE,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5C,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,EAAuB,EAAE,gCAAgC;IAChG,YAAY,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC,EAAE,6DAA6D;IAC7J,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACzD,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CACzD,EACD,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAC5D,CAAC;AAEF,6DAA6D;AAC7D,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,iBAAiB,EAAE;IACrD,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE;IAC3C,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;SACrC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAClD,IAAI,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5C,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,EAAE,iCAAiC;IAC1E,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,qBAAqB;IAC9D,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE,EAAE,0BAA0B;IACxE,UAAU,EAAE,SAAS,CAAC,aAAa,CAAC,EAAE,sBAAsB;IAC5D,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CACzD,CAAC,CAAC;AAEH,8EAA8E;AAC9E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,EAAE;IACxD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,8BAA8B;IACpE,oBAAoB,EAAE,IAAI,CAAC,wBAAwB,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;IACvF,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CACzD,CAAC,CAAC;AAEH,+CAA+C;AAC/C,iBAAiB;AACjB,+CAA+C;AAE/C,uEAAuE;AACvE,MAAM,CAAC,MAAM,SAAS,GAAG,OAAO,CAC/B,eAAe,EACf;IACC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE;IAC3C,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;SACrC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,qBAAqB;IACvE,MAAM,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,wBAAwB;IAC/E,kCAAkC;IAClC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,EAAE,0BAA0B;IAC1D,aAAa,EAAE,KAAK,CAAC,gBAAgB,CAAC,EAAE,yBAAyB;IACjE,mBAAmB;IACnB,aAAa,EAAE,OAAO,CAAC,gBAAgB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,iDAAiD;IAC3G,uDAAuD;IACvD,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,oCAAoC;IACnE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,yCAAyC;IACxE,WAAW;IACX,WAAW,EAAE,SAAS,CAAC,cAAc,CAAC,EAAE,wBAAwB;IAChE,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;IAC/C,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;CAC/C,EACD,GAAG,EAAE,CAAC;IACL,6FAA6F;IAC7F,QAAQ,CAAC,yBAAyB,EAAE;QACnC,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,GAAG,CAAA;;;;sBAIS,aAAa;;;IAG/B;QACD,SAAS,EAAE,GAAG,CAAA;;IAEb;KACD,CAAC;CACF,CACD,CAAC;AAEF,qEAAqE;AACrE,MAAM,CAAC,MAAM,MAAM,GAAG,OAAO,CAC5B,YAAY,EACZ;IACC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE;IAC3C,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC;SACrC,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC7D,gCAAgC;IAChC,SAAS,EAAE,OAAO,CAAC,YAAY,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,mBAAmB;IAC/E,mBAAmB;IACnB,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,6BAA6B;IACvF,gBAAgB,EAAE,OAAO,CAAC,mBAAmB,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IACzE,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IACzD,IAAI,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC/B,sBAAsB;IACtB,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,aAAa;IACzC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,wBAAwB;IACtD,cAAc,EAAE,OAAO,CAAC,iBAAiB,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,iCAAiC;IACxH,gDAAgD;IAChD,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC;IACvB,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC;IACzB,+BAA+B;IAC/B,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,4BAA4B;IACzD,sDAAsD;IACtD,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;IACxC,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;IAChC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC;IAChB,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC;IAC/B,uDAAuD;IACvD,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,kCAAkC;IACjE,SAAS,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,sCAAsC;IACrE,aAAa;IACb,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;IAC/C,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;CAC/C,EACD,GAAG,EAAE,CAAC;IACL,0FAA0F;IAC1F,QAAQ,CAAC,sBAAsB,EAAE;QAChC,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,GAAG,CAAA;;;;sBAIS,aAAa;;;IAG/B;QACD,SAAS,EAAE,GAAG,CAAA;;IAEb;KACD,CAAC;CACF,CACD,CAAC;AAEF,kFAAkF;AAClF,MAAM,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,kBAAkB,EAAE;IACtD,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE;IAC3C,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE;IACzD,KAAK,EAAE,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE;IAClD,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,yBAAyB;IACjE,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC;IAChC,MAAM,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,EAAE,oBAAoB;IACvD,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;IAC/C,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE;CAC/C,CAAC,CAAC;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,mBAAmB,EAAE;IACxD,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,UAAU,EAAE,EAAE,uCAAuC;IAC7E,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,CAAC;SACxE,OAAO,CAAC,QAAQ,CAAC;SACjB,OAAO,EAAE;IACX,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC,KAAK,EAInC;IACJ,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;IACzD,SAAS,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC,UAAU,EAAE,CAAC,OAAO,EAAE;CACzD,CAAC,CAAC;AAEH,+CAA+C;AAC/C,oBAAoB;AACpB,+CAA+C;AAC/C,MAAM,CAAC,MAAM,SAAS,GAAG;IACxB,uBAAuB;IACvB,aAAa;IACb,mBAAmB;IACnB,WAAW;IACX,YAAY;IAEZ,iBAAiB;IACjB,SAAS;IACT,MAAM;IACN,WAAW;IACX,YAAY;IAEZ,QAAQ;IACR,kBAAkB;IAClB,cAAc;IACd,oBAAoB;CACpB,CAAC;AAuBF,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAC/C,yDAAyD;AACzD,mFAAmF;AACnF,mEAAmE"}
|
|
@@ -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
|
+
}
|