@rebasepro/server-postgresql 0.2.3 → 0.2.5

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.
Files changed (63) hide show
  1. package/dist/common/src/collections/default-collections.d.ts +9 -0
  2. package/dist/common/src/collections/index.d.ts +1 -0
  3. package/dist/common/src/util/permissions.d.ts +1 -0
  4. package/dist/index.es.js +1075 -470
  5. package/dist/index.es.js.map +1 -1
  6. package/dist/index.umd.js +1071 -466
  7. package/dist/index.umd.js.map +1 -1
  8. package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +3 -1
  9. package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +1 -0
  10. package/dist/server-postgresql/src/auth/services.d.ts +48 -31
  11. package/dist/server-postgresql/src/connection.d.ts +25 -0
  12. package/dist/server-postgresql/src/schema/auth-schema.d.ts +2135 -41
  13. package/dist/server-postgresql/src/services/EntityFetchService.d.ts +4 -0
  14. package/dist/server-postgresql/src/services/EntityPersistService.d.ts +4 -0
  15. package/dist/server-postgresql/src/services/entityService.d.ts +6 -0
  16. package/dist/server-postgresql/src/services/realtimeService.d.ts +20 -0
  17. package/dist/server-postgresql/src/utils/drizzle-conditions.d.ts +18 -0
  18. package/dist/types/src/controllers/auth.d.ts +4 -26
  19. package/dist/types/src/controllers/client.d.ts +25 -43
  20. package/dist/types/src/controllers/collection_registry.d.ts +1 -1
  21. package/dist/types/src/controllers/data.d.ts +4 -0
  22. package/dist/types/src/controllers/data_driver.d.ts +23 -0
  23. package/dist/types/src/controllers/registry.d.ts +5 -4
  24. package/dist/types/src/rebase_context.d.ts +1 -1
  25. package/dist/types/src/types/auth_adapter.d.ts +5 -60
  26. package/dist/types/src/types/backend.d.ts +2 -2
  27. package/dist/types/src/types/backend_hooks.d.ts +2 -17
  28. package/dist/types/src/types/collections.d.ts +0 -4
  29. package/dist/types/src/types/component_ref.d.ts +1 -1
  30. package/dist/types/src/types/cron.d.ts +1 -1
  31. package/dist/types/src/types/entity_views.d.ts +1 -0
  32. package/dist/types/src/types/export_import.d.ts +1 -1
  33. package/dist/types/src/types/formex.d.ts +2 -2
  34. package/dist/types/src/types/properties.d.ts +9 -7
  35. package/dist/types/src/types/translations.d.ts +28 -12
  36. package/dist/types/src/types/user_management_delegate.d.ts +22 -57
  37. package/dist/types/src/users/index.d.ts +0 -1
  38. package/dist/types/src/users/user.d.ts +0 -1
  39. package/package.json +6 -6
  40. package/src/PostgresBackendDriver.ts +14 -2
  41. package/src/PostgresBootstrapper.ts +30 -20
  42. package/src/auth/ensure-tables.ts +116 -103
  43. package/src/auth/services.ts +347 -177
  44. package/src/connection.ts +77 -0
  45. package/src/data-transformer.ts +2 -2
  46. package/src/schema/auth-schema.ts +85 -75
  47. package/src/schema/doctor.ts +44 -3
  48. package/src/schema/generate-drizzle-schema-logic.ts +33 -3
  49. package/src/schema/generate-drizzle-schema.ts +6 -6
  50. package/src/schema/introspect-db-logic.ts +7 -0
  51. package/src/services/EntityFetchService.ts +69 -10
  52. package/src/services/EntityPersistService.ts +9 -0
  53. package/src/services/entityService.ts +9 -0
  54. package/src/services/realtimeService.ts +214 -2
  55. package/src/utils/drizzle-conditions.ts +74 -2
  56. package/src/websocket.ts +10 -2
  57. package/test/auth-services.test.ts +10 -166
  58. package/test/doctor.test.ts +6 -2
  59. package/test/drizzle-conditions.test.ts +168 -0
  60. package/vite.config.ts +1 -1
  61. package/dist/server-postgresql/src/schema/default-collections.d.ts +0 -2
  62. package/dist/types/src/users/roles.d.ts +0 -22
  63. package/src/schema/default-collections.ts +0 -69
@@ -45,12 +45,13 @@ export declare class PostgresBackendDriver implements DataDriver {
45
45
  */
46
46
  get restFetchService(): import("./services").EntityFetchService;
47
47
  private resolveCollectionCallbacks;
48
- fetchCollection<M extends Record<string, unknown>>({ path, collection, filter, limit, offset, startAfter, orderBy, searchString, order }: FetchCollectionProps<M>): Promise<Entity<M>[]>;
48
+ fetchCollection<M extends Record<string, unknown>>({ path, collection, filter, limit, offset, startAfter, orderBy, searchString, order, vectorSearch }: FetchCollectionProps<M>): Promise<Entity<M>[]>;
49
49
  listenCollection<M extends Record<string, unknown>>({ path, collection, filter, limit, offset, startAfter, orderBy, searchString, order, onUpdate, onError }: ListenCollectionProps<M>): () => void;
50
50
  fetchEntity<M extends Record<string, unknown>>({ path, entityId, databaseId, collection }: FetchEntityProps<M>): Promise<Entity<M> | undefined>;
51
51
  listenEntity<M extends Record<string, unknown>>({ path, entityId, collection, onUpdate, onError }: ListenEntityProps<M>): () => void;
52
52
  saveEntity<M extends Record<string, unknown>>({ path, entityId, values, collection, status }: SaveEntityProps<M>): Promise<Entity<M>>;
53
53
  deleteEntity<M extends Record<string, unknown>>({ entity, collection }: DeleteEntityProps<M>): Promise<void>;
54
+ deleteAll(path: string): Promise<void>;
54
55
  checkUniqueField(path: string, name: string, value: unknown, entityId?: string, collection?: EntityCollection): Promise<boolean>;
55
56
  countEntities<M extends Record<string, unknown>>({ path, collection, filter, searchString }: FetchCollectionProps<M>): Promise<number>;
56
57
  private getTargetDb;
@@ -103,6 +104,7 @@ export declare class AuthenticatedPostgresBackendDriver implements DataDriver {
103
104
  listenEntity<M extends Record<string, unknown>>(props: ListenEntityProps<M>): () => void;
104
105
  saveEntity<M extends Record<string, unknown>>(props: SaveEntityProps<M>): Promise<Entity<M>>;
105
106
  deleteEntity<M extends Record<string, unknown>>(props: DeleteEntityProps<M>): Promise<void>;
107
+ deleteAll(path: string): Promise<void>;
106
108
  checkUniqueField(path: string, name: string, value: unknown, entityId?: string, collection?: EntityCollection): Promise<boolean>;
107
109
  countEntities<M extends Record<string, unknown>>(props: FetchCollectionProps<M>): Promise<number>;
108
110
  }
@@ -16,6 +16,7 @@ import type { PostgresDriverConfig } from "@rebasepro/server-core";
16
16
  */
17
17
  export interface PostgresDriverInternals {
18
18
  db: NodePgDatabase<any>;
19
+ readDb?: NodePgDatabase<any>;
19
20
  registry: PostgresCollectionRegistry;
20
21
  realtimeService: RealtimeService;
21
22
  driver: PostgresBackendDriver;
@@ -1,11 +1,9 @@
1
1
  import { NodePgDatabase } from "drizzle-orm/node-postgres";
2
2
  import { PgTable, AnyPgColumn } from "drizzle-orm/pg-core";
3
- import { UserRepository, RoleRepository, TokenRepository, AuthRepository, UserData, CreateUserData, RoleData, CreateRoleData, RefreshTokenInfo, PasswordResetTokenInfo, UserIdentityData, ListUsersOptions, PaginatedUsersResult, RoleData as Role } from "@rebasepro/server-core";
3
+ import { UserRepository, TokenRepository, MfaRepository, AuthRepository, UserData, CreateUserData, RoleData, CreateRoleData, RefreshTokenInfo, PasswordResetTokenInfo, UserIdentityData, ListUsersOptions, PaginatedUsersResult, MfaFactor, MfaChallengeInfo, RoleData as Role } from "@rebasepro/server-core";
4
4
  export type { Role };
5
5
  export interface AuthSchemaTables {
6
6
  users: PgTable & Record<string, AnyPgColumn>;
7
- roles: PgTable & Record<string, AnyPgColumn>;
8
- userRoles: PgTable & Record<string, AnyPgColumn>;
9
7
  refreshTokens: PgTable & Record<string, AnyPgColumn>;
10
8
  passwordResetTokens: PgTable & Record<string, AnyPgColumn>;
11
9
  appConfig: PgTable & Record<string, AnyPgColumn>;
@@ -19,8 +17,6 @@ export declare class UserService implements UserRepository {
19
17
  private db;
20
18
  private usersTable;
21
19
  private userIdentitiesTable;
22
- private userRolesTable;
23
- private rolesTable;
24
20
  constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
25
21
  private getQualifiedUsersTableName;
26
22
  private mapRowToUser;
@@ -52,7 +48,7 @@ export declare class UserService implements UserRepository {
52
48
  */
53
49
  getUserByVerificationToken(token: string): Promise<UserData | null>;
54
50
  /**
55
- * Get roles for a user from database
51
+ * Get roles for a user from database (inline TEXT[] column)
56
52
  */
57
53
  getUserRoles(userId: string): Promise<Role[]>;
58
54
  /**
@@ -60,11 +56,11 @@ export declare class UserService implements UserRepository {
60
56
  */
61
57
  getUserRoleIds(userId: string): Promise<string[]>;
62
58
  /**
63
- * Set roles for a user
59
+ * Set roles for a user (replaces existing roles)
64
60
  */
65
61
  setUserRoles(userId: string, roleIds: string[]): Promise<void>;
66
62
  /**
67
- * Assign a specific role to new user
63
+ * Assign a specific role to new user (appends if not present)
68
64
  */
69
65
  assignDefaultRole(userId: string, roleId: string): Promise<void>;
70
66
  /**
@@ -75,24 +71,6 @@ export declare class UserService implements UserRepository {
75
71
  roles: Role[];
76
72
  } | null>;
77
73
  }
78
- /**
79
- * PostgreSQL implementation of RoleRepository.
80
- * Handles all role-related database operations using Drizzle ORM.
81
- */
82
- export declare class RoleService implements RoleRepository {
83
- private db;
84
- private rolesTable;
85
- constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
86
- private getQualifiedRolesTableName;
87
- getRoleById(id: string): Promise<Role | null>;
88
- listRoles(): Promise<Role[]>;
89
- createRole(data: Omit<Role, "isAdmin" | "collectionPermissions"> & {
90
- isAdmin?: boolean;
91
- collectionPermissions?: Role["collectionPermissions"];
92
- }): Promise<Role>;
93
- updateRole(id: string, data: Partial<Omit<Role, "id">>): Promise<Role | null>;
94
- deleteRole(id: string): Promise<void>;
95
- }
96
74
  export declare class RefreshTokenService {
97
75
  private db;
98
76
  private refreshTokensTable;
@@ -166,7 +144,6 @@ export declare class PostgresTokenRepository implements TokenRepository {
166
144
  export declare class PostgresAuthRepository implements AuthRepository {
167
145
  private db;
168
146
  private userService;
169
- private roleService;
170
147
  private tokenRepository;
171
148
  constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
172
149
  createUser(data: CreateUserData): Promise<UserData>;
@@ -193,9 +170,9 @@ export declare class PostgresAuthRepository implements AuthRepository {
193
170
  } | null>;
194
171
  getRoleById(id: string): Promise<RoleData | null>;
195
172
  listRoles(): Promise<RoleData[]>;
196
- createRole(data: CreateRoleData): Promise<RoleData>;
173
+ createRole(_data: CreateRoleData): Promise<RoleData>;
197
174
  updateRole(id: string, data: Partial<Omit<RoleData, "id">>): Promise<RoleData | null>;
198
- deleteRole(id: string): Promise<void>;
175
+ deleteRole(_id: string): Promise<void>;
199
176
  createRefreshToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void>;
200
177
  findRefreshTokenByHash(tokenHash: string): Promise<RefreshTokenInfo | null>;
201
178
  deleteRefreshToken(tokenHash: string): Promise<void>;
@@ -207,8 +184,48 @@ export declare class PostgresAuthRepository implements AuthRepository {
207
184
  markPasswordResetTokenUsed(tokenHash: string): Promise<void>;
208
185
  deleteAllPasswordResetTokensForUser(userId: string): Promise<void>;
209
186
  deleteExpiredTokens(): Promise<void>;
187
+ private _mfaService;
188
+ private getMfaService;
189
+ createMfaFactor(userId: string, factorType: "totp", secretEncrypted: string, friendlyName?: string): Promise<MfaFactor>;
190
+ getMfaFactors(userId: string): Promise<MfaFactor[]>;
191
+ getMfaFactorById(factorId: string): Promise<(MfaFactor & {
192
+ secretEncrypted: string;
193
+ }) | null>;
194
+ verifyMfaFactor(factorId: string): Promise<void>;
195
+ deleteMfaFactor(factorId: string, userId: string): Promise<void>;
196
+ createMfaChallenge(factorId: string, ipAddress?: string): Promise<MfaChallengeInfo>;
197
+ getMfaChallengeById(challengeId: string): Promise<MfaChallengeInfo | null>;
198
+ verifyMfaChallenge(challengeId: string): Promise<void>;
199
+ createRecoveryCodes(userId: string, codeHashes: string[]): Promise<void>;
200
+ useRecoveryCode(userId: string, codeHash: string): Promise<boolean>;
201
+ getUnusedRecoveryCodeCount(userId: string): Promise<number>;
202
+ deleteAllRecoveryCodes(userId: string): Promise<void>;
203
+ hasVerifiedMfaFactors(userId: string): Promise<boolean>;
204
+ }
205
+ /**
206
+ * PostgreSQL implementation of MfaRepository.
207
+ * Handles all MFA-related database operations.
208
+ */
209
+ export declare class MfaService implements MfaRepository {
210
+ private db;
211
+ private schemaName;
212
+ constructor(db: NodePgDatabase, schemaName?: string);
213
+ private qualify;
214
+ createMfaFactor(userId: string, factorType: "totp", secretEncrypted: string, friendlyName?: string): Promise<MfaFactor>;
215
+ getMfaFactors(userId: string): Promise<MfaFactor[]>;
216
+ getMfaFactorById(factorId: string): Promise<(MfaFactor & {
217
+ secretEncrypted: string;
218
+ }) | null>;
219
+ verifyMfaFactor(factorId: string): Promise<void>;
220
+ deleteMfaFactor(factorId: string, userId: string): Promise<void>;
221
+ createMfaChallenge(factorId: string, ipAddress?: string): Promise<MfaChallengeInfo>;
222
+ getMfaChallengeById(challengeId: string): Promise<MfaChallengeInfo | null>;
223
+ verifyMfaChallenge(challengeId: string): Promise<void>;
224
+ createRecoveryCodes(userId: string, codeHashes: string[]): Promise<void>;
225
+ useRecoveryCode(userId: string, codeHash: string): Promise<boolean>;
226
+ getUnusedRecoveryCodeCount(userId: string): Promise<number>;
227
+ deleteAllRecoveryCodes(userId: string): Promise<void>;
228
+ hasVerifiedMfaFactors(userId: string): Promise<boolean>;
210
229
  }
211
230
  /** PostgreSQL user repository implementation */
212
231
  export type PostgresUserRepository = UserService;
213
- /** PostgreSQL role repository implementation */
214
- export type PostgresRoleRepository = RoleService;
@@ -38,3 +38,28 @@ export declare function createPostgresDatabaseConnection(connectionString: strin
38
38
  pool: Pool;
39
39
  connectionString: string;
40
40
  };
41
+ /**
42
+ * Create a direct (non-pooled) connection for operations that require
43
+ * session-level features incompatible with PgBouncer transaction mode,
44
+ * such as LISTEN/NOTIFY, prepared statements, or advisory locks.
45
+ *
46
+ * Uses a smaller pool since this is only for specific use cases.
47
+ */
48
+ export declare function createDirectDatabaseConnection(connectionString: string, schema?: Record<string, unknown>, poolConfig?: PostgresPoolConfig): {
49
+ db: import("drizzle-orm/node-postgres").NodePgDatabase<Record<string, unknown>> & {
50
+ $client: Pool;
51
+ };
52
+ pool: Pool;
53
+ connectionString: string;
54
+ };
55
+ /**
56
+ * Create a read-only connection for routing read queries to replicas.
57
+ * Uses a moderate pool size since reads are distributed across replicas.
58
+ */
59
+ export declare function createReadReplicaConnection(connectionString: string, schema?: Record<string, unknown>, poolConfig?: PostgresPoolConfig): {
60
+ db: import("drizzle-orm/node-postgres").NodePgDatabase<Record<string, unknown>> & {
61
+ $client: Pool;
62
+ };
63
+ pool: Pool;
64
+ connectionString: string;
65
+ };