@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,37 @@
1
+ import { drizzle } from 'drizzle-orm/postgres-js';
2
+ import type { OrganizationAdapter } from '@aphexcms/cms-core/server';
3
+ import type { Organization, NewOrganization, OrganizationMember, NewOrganizationMember, Invitation, NewInvitation, UserSession, OrganizationMembership } from '@aphexcms/cms-core';
4
+ import type { CMSSchema } from './schema.js';
5
+ /**
6
+ * PostgreSQL organization adapter implementation
7
+ * Handles all multi-tenancy related database operations
8
+ */
9
+ export declare class PostgreSQLOrganizationAdapter implements OrganizationAdapter {
10
+ private db;
11
+ private tables;
12
+ constructor(db: ReturnType<typeof drizzle>, tables: CMSSchema);
13
+ createOrganization(data: NewOrganization): Promise<Organization>;
14
+ findOrganizationById(id: string): Promise<Organization | null>;
15
+ findOrganizationBySlug(slug: string): Promise<Organization | null>;
16
+ updateOrganization(id: string, data: Partial<Omit<Organization, 'id' | 'createdAt' | 'createdBy'>>): Promise<Organization | null>;
17
+ deleteOrganization(id: string): Promise<boolean>;
18
+ addMember(data: NewOrganizationMember): Promise<OrganizationMember>;
19
+ removeMember(organizationId: string, userId: string): Promise<boolean>;
20
+ removeAllMembers(organizationId: string): Promise<boolean>;
21
+ updateMemberRole(organizationId: string, userId: string, role: 'owner' | 'admin' | 'editor' | 'viewer'): Promise<OrganizationMember | null>;
22
+ findUserMembership(userId: string, organizationId: string): Promise<OrganizationMember | null>;
23
+ findUserOrganizations(userId: string): Promise<OrganizationMembership[]>;
24
+ findOrganizationMembers(organizationId: string): Promise<OrganizationMember[]>;
25
+ createInvitation(data: NewInvitation): Promise<Invitation>;
26
+ findInvitationByToken(token: string): Promise<Invitation | null>;
27
+ findOrganizationInvitations(organizationId: string): Promise<Invitation[]>;
28
+ findInvitationsByEmail(email: string): Promise<Invitation[]>;
29
+ acceptInvitation(token: string, userId: string): Promise<OrganizationMember>;
30
+ deleteInvitation(id: string): Promise<boolean>;
31
+ removeAllInvitations(organizationId: string): Promise<boolean>;
32
+ cleanupExpiredInvitations(): Promise<number>;
33
+ updateUserSession(userId: string, organizationId: string): Promise<void>;
34
+ findUserSession(userId: string): Promise<UserSession | null>;
35
+ deleteUserSession(userId: string): Promise<boolean>;
36
+ }
37
+ //# sourceMappingURL=organization-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-adapter.d.ts","sourceRoot":"","sources":["../src/organization-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,233 @@
1
+ import { eq, and, sql } from 'drizzle-orm';
2
+ /**
3
+ * PostgreSQL organization adapter implementation
4
+ * Handles all multi-tenancy related database operations
5
+ */
6
+ export class PostgreSQLOrganizationAdapter {
7
+ db;
8
+ tables;
9
+ constructor(db, tables) {
10
+ this.db = db;
11
+ this.tables = tables;
12
+ }
13
+ // ============================================
14
+ // ORGANIZATION CRUD
15
+ // ============================================
16
+ async createOrganization(data) {
17
+ const result = await this.db.insert(this.tables.organizations).values(data).returning();
18
+ return result[0];
19
+ }
20
+ async findOrganizationById(id) {
21
+ const result = await this.db
22
+ .select()
23
+ .from(this.tables.organizations)
24
+ .where(eq(this.tables.organizations.id, id))
25
+ .limit(1);
26
+ return result[0] || null;
27
+ }
28
+ async findOrganizationBySlug(slug) {
29
+ const result = await this.db
30
+ .select()
31
+ .from(this.tables.organizations)
32
+ .where(eq(this.tables.organizations.slug, slug))
33
+ .limit(1);
34
+ return result[0] || null;
35
+ }
36
+ async updateOrganization(id, data) {
37
+ const result = await this.db
38
+ .update(this.tables.organizations)
39
+ .set({
40
+ ...data,
41
+ updatedAt: new Date()
42
+ })
43
+ .where(eq(this.tables.organizations.id, id))
44
+ .returning();
45
+ return result[0] || null;
46
+ }
47
+ async deleteOrganization(id) {
48
+ const result = await this.db
49
+ .delete(this.tables.organizations)
50
+ .where(eq(this.tables.organizations.id, id))
51
+ .returning({ id: this.tables.organizations.id });
52
+ return result.length > 0;
53
+ }
54
+ // ============================================
55
+ // MEMBER MANAGEMENT
56
+ // ============================================
57
+ async addMember(data) {
58
+ const result = await this.db.insert(this.tables.organizationMembers).values(data).returning();
59
+ return result[0];
60
+ }
61
+ async removeMember(organizationId, userId) {
62
+ const result = await this.db
63
+ .delete(this.tables.organizationMembers)
64
+ .where(and(eq(this.tables.organizationMembers.organizationId, organizationId), eq(this.tables.organizationMembers.userId, userId)))
65
+ .returning({ id: this.tables.organizationMembers.id });
66
+ return result.length > 0;
67
+ }
68
+ async removeAllMembers(organizationId) {
69
+ const result = await this.db
70
+ .delete(this.tables.organizationMembers)
71
+ .where(eq(this.tables.organizationMembers.organizationId, organizationId))
72
+ .returning({ id: this.tables.organizationMembers.id });
73
+ return result.length > 0;
74
+ }
75
+ async updateMemberRole(organizationId, userId, role) {
76
+ const result = await this.db
77
+ .update(this.tables.organizationMembers)
78
+ .set({
79
+ role,
80
+ updatedAt: new Date()
81
+ })
82
+ .where(and(eq(this.tables.organizationMembers.organizationId, organizationId), eq(this.tables.organizationMembers.userId, userId)))
83
+ .returning();
84
+ return result[0] || null;
85
+ }
86
+ async findUserMembership(userId, organizationId) {
87
+ const result = await this.db
88
+ .select()
89
+ .from(this.tables.organizationMembers)
90
+ .where(and(eq(this.tables.organizationMembers.userId, userId), eq(this.tables.organizationMembers.organizationId, organizationId)))
91
+ .limit(1);
92
+ return result[0] || null;
93
+ }
94
+ async findUserOrganizations(userId) {
95
+ const result = await this.db
96
+ .select()
97
+ .from(this.tables.organizationMembers)
98
+ .innerJoin(this.tables.organizations, eq(this.tables.organizationMembers.organizationId, this.tables.organizations.id))
99
+ .where(eq(this.tables.organizationMembers.userId, userId));
100
+ return result.map((row) => ({
101
+ organization: row.cms_organizations,
102
+ member: row.cms_organization_members
103
+ }));
104
+ }
105
+ async findOrganizationMembers(organizationId) {
106
+ const result = await this.db
107
+ .select()
108
+ .from(this.tables.organizationMembers)
109
+ .where(eq(this.tables.organizationMembers.organizationId, organizationId));
110
+ return result;
111
+ }
112
+ // ============================================
113
+ // INVITATION MANAGEMENT
114
+ // ============================================
115
+ async createInvitation(data) {
116
+ const result = await this.db.insert(this.tables.invitations).values(data).returning();
117
+ return result[0];
118
+ }
119
+ async findInvitationByToken(token) {
120
+ const result = await this.db
121
+ .select()
122
+ .from(this.tables.invitations)
123
+ .where(eq(this.tables.invitations.token, token))
124
+ .limit(1);
125
+ return result[0] || null;
126
+ }
127
+ async findOrganizationInvitations(organizationId) {
128
+ const result = await this.db
129
+ .select()
130
+ .from(this.tables.invitations)
131
+ .where(eq(this.tables.invitations.organizationId, organizationId));
132
+ return result;
133
+ }
134
+ async findInvitationsByEmail(email) {
135
+ const result = await this.db
136
+ .select()
137
+ .from(this.tables.invitations)
138
+ .where(eq(this.tables.invitations.email, email.toLowerCase()));
139
+ return result;
140
+ }
141
+ async acceptInvitation(token, userId) {
142
+ // Find the invitation
143
+ const invitation = await this.findInvitationByToken(token);
144
+ if (!invitation) {
145
+ throw new Error('Invitation not found');
146
+ }
147
+ if (invitation.acceptedAt) {
148
+ throw new Error('Invitation already accepted');
149
+ }
150
+ if (invitation.expiresAt < new Date()) {
151
+ throw new Error('Invitation expired');
152
+ }
153
+ // Check if user is already a member to prevent duplicates
154
+ const existingMembership = await this.findUserMembership(userId, invitation.organizationId);
155
+ if (existingMembership) {
156
+ // User is already a member - just mark the invitation as accepted and return existing membership
157
+ await this.db
158
+ .update(this.tables.invitations)
159
+ .set({ acceptedAt: new Date() })
160
+ .where(eq(this.tables.invitations.token, token));
161
+ return existingMembership;
162
+ }
163
+ // Create the membership with invitation link
164
+ const member = await this.addMember({
165
+ organizationId: invitation.organizationId,
166
+ userId,
167
+ role: invitation.role,
168
+ invitationId: invitation.id
169
+ });
170
+ // Mark invitation as accepted
171
+ await this.db
172
+ .update(this.tables.invitations)
173
+ .set({ acceptedAt: new Date() })
174
+ .where(eq(this.tables.invitations.token, token));
175
+ return member;
176
+ }
177
+ async deleteInvitation(id) {
178
+ const result = await this.db
179
+ .delete(this.tables.invitations)
180
+ .where(eq(this.tables.invitations.id, id))
181
+ .returning({ id: this.tables.invitations.id });
182
+ return result.length > 0;
183
+ }
184
+ async removeAllInvitations(organizationId) {
185
+ const result = await this.db
186
+ .delete(this.tables.invitations)
187
+ .where(eq(this.tables.invitations.organizationId, organizationId))
188
+ .returning({ id: this.tables.invitations.id });
189
+ return result.length > 0;
190
+ }
191
+ async cleanupExpiredInvitations() {
192
+ const result = await this.db
193
+ .delete(this.tables.invitations)
194
+ .where(sql `${this.tables.invitations.expiresAt} < NOW()`)
195
+ .returning({ id: this.tables.invitations.id });
196
+ return result.length;
197
+ }
198
+ // ============================================
199
+ // USER SESSION MANAGEMENT
200
+ // ============================================
201
+ async updateUserSession(userId, organizationId) {
202
+ await this.db
203
+ .insert(this.tables.userSessions)
204
+ .values({
205
+ userId,
206
+ activeOrganizationId: organizationId,
207
+ updatedAt: new Date()
208
+ })
209
+ .onConflictDoUpdate({
210
+ target: this.tables.userSessions.userId,
211
+ set: {
212
+ activeOrganizationId: organizationId,
213
+ updatedAt: new Date()
214
+ }
215
+ });
216
+ }
217
+ async findUserSession(userId) {
218
+ const result = await this.db
219
+ .select()
220
+ .from(this.tables.userSessions)
221
+ .where(eq(this.tables.userSessions.userId, userId))
222
+ .limit(1);
223
+ return result[0] || null;
224
+ }
225
+ async deleteUserSession(userId) {
226
+ const result = await this.db
227
+ .delete(this.tables.userSessions)
228
+ .where(eq(this.tables.userSessions.userId, userId))
229
+ .returning({ userId: this.tables.userSessions.userId });
230
+ return result.length > 0;
231
+ }
232
+ }
233
+ //# sourceMappingURL=organization-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"organization-adapter.js","sourceRoot":"","sources":["../src/organization-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { SchemaAdapter, SchemaType } from '@aphexcms/cms-core/server';
2
+ import type { drizzle } from 'drizzle-orm/postgres-js';
3
+ import type { CMSSchema } from './schema.js';
4
+ export declare class PostgreSQLSchemaAdapter implements SchemaAdapter {
5
+ private db;
6
+ private tables;
7
+ constructor(db: ReturnType<typeof drizzle>, tables: CMSSchema);
8
+ registerSchemaType(schemaType: SchemaType): Promise<void>;
9
+ getSchemaType(name: string): Promise<SchemaType | null>;
10
+ listSchemas(): Promise<SchemaType[]>;
11
+ listDocumentTypes(): Promise<Array<{
12
+ name: string;
13
+ title: string;
14
+ description?: string;
15
+ }>>;
16
+ listObjectTypes(): Promise<Array<{
17
+ name: string;
18
+ title: string;
19
+ description?: string;
20
+ }>>;
21
+ deleteSchemaType(name: string): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=schema-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-adapter.d.ts","sourceRoot":"","sources":["../src/schema-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C,qBAAa,uBAAwB,YAAW,aAAa;IAC5D,OAAO,CAAC,EAAE,CAA6B;IACvC,OAAO,CAAC,MAAM,CAAY;gBAEd,EAAE,EAAE,UAAU,CAAC,OAAO,OAAO,CAAC,EAAE,MAAM,EAAE,SAAS;IAKvD,kBAAkB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAsCzD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAyBvD,WAAW,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;IASpC,iBAAiB,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkB1F,eAAe,IAAI,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAkBxF,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAInD"}
@@ -0,0 +1,106 @@
1
+ import { eq } from 'drizzle-orm';
2
+ export class PostgreSQLSchemaAdapter {
3
+ db;
4
+ tables;
5
+ constructor(db, tables) {
6
+ this.db = db;
7
+ this.tables = tables;
8
+ }
9
+ async registerSchemaType(schemaType) {
10
+ const existing = await this.db
11
+ .select()
12
+ .from(this.tables.schemaTypes)
13
+ .where(eq(this.tables.schemaTypes.name, schemaType.name))
14
+ .limit(1);
15
+ if (existing.length === 0) {
16
+ await this.db.insert(this.tables.schemaTypes).values({
17
+ name: schemaType.name,
18
+ title: schemaType.title,
19
+ type: schemaType.type,
20
+ description: schemaType.description,
21
+ fields: schemaType.fields
22
+ });
23
+ console.log(`📝 Registered ${schemaType.type}: ${schemaType.name} with ${schemaType.fields?.length || 0} fields`);
24
+ }
25
+ else {
26
+ await this.db
27
+ .update(this.tables.schemaTypes)
28
+ .set({
29
+ title: schemaType.title,
30
+ description: schemaType.description,
31
+ fields: schemaType.fields,
32
+ updatedAt: new Date()
33
+ })
34
+ .where(eq(this.tables.schemaTypes.name, schemaType.name));
35
+ console.log(`🔄 Updated ${schemaType.type}: ${schemaType.name} with ${schemaType.fields?.length || 0} fields`);
36
+ console.log(` Fields:`, schemaType.fields?.map((f) => ({ name: f.name, type: f.type, private: f.private })));
37
+ }
38
+ }
39
+ async getSchemaType(name) {
40
+ console.log(`[PostgreSQL] getSchemaType called for: ${name}`);
41
+ const [schemaType] = await this.db
42
+ .select()
43
+ .from(this.tables.schemaTypes)
44
+ .where(eq(this.tables.schemaTypes.name, name))
45
+ .limit(1);
46
+ if (!schemaType) {
47
+ console.log(`[PostgreSQL] Schema ${name} NOT FOUND in database`);
48
+ return null;
49
+ }
50
+ const result = {
51
+ ...schemaType,
52
+ description: schemaType.description ?? undefined,
53
+ fields: schemaType.fields
54
+ };
55
+ console.log(`[PostgreSQL] Schema ${name} found:`, {
56
+ fieldCount: result.fields?.length,
57
+ fields: result.fields?.map((f) => ({ name: f.name, type: f.type, private: f.private }))
58
+ });
59
+ return result;
60
+ }
61
+ async listSchemas() {
62
+ const schemaTypes = await this.db.select().from(this.tables.schemaTypes);
63
+ return schemaTypes.map((st) => ({
64
+ ...st,
65
+ description: st.description ?? undefined,
66
+ fields: st.fields
67
+ }));
68
+ }
69
+ async listDocumentTypes() {
70
+ const documentTypes = await this.db
71
+ .select({
72
+ name: this.tables.schemaTypes.name,
73
+ title: this.tables.schemaTypes.title,
74
+ description: this.tables.schemaTypes.description
75
+ })
76
+ .from(this.tables.schemaTypes)
77
+ .where(eq(this.tables.schemaTypes.type, 'document'))
78
+ .orderBy(this.tables.schemaTypes.title);
79
+ return documentTypes.map((d) => ({
80
+ name: d.name,
81
+ title: d.title,
82
+ description: d.description || undefined
83
+ }));
84
+ }
85
+ async listObjectTypes() {
86
+ const objectTypes = await this.db
87
+ .select({
88
+ name: this.tables.schemaTypes.name,
89
+ title: this.tables.schemaTypes.title,
90
+ description: this.tables.schemaTypes.description
91
+ })
92
+ .from(this.tables.schemaTypes)
93
+ .where(eq(this.tables.schemaTypes.type, 'object'))
94
+ .orderBy(this.tables.schemaTypes.title);
95
+ return objectTypes.map((o) => ({
96
+ name: o.name,
97
+ title: o.title,
98
+ description: o.description || undefined
99
+ }));
100
+ }
101
+ async deleteSchemaType(name) {
102
+ await this.db.delete(this.tables.schemaTypes).where(eq(this.tables.schemaTypes.name, name));
103
+ console.log(`🗑️ Deleted schema type: ${name}`);
104
+ }
105
+ }
106
+ //# sourceMappingURL=schema-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-adapter.js","sourceRoot":"","sources":["../src/schema-adapter.ts"],"names":[],"mappings":"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"}