@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.
- package/dist/common/src/collections/default-collections.d.ts +9 -0
- package/dist/common/src/collections/index.d.ts +1 -0
- package/dist/common/src/util/permissions.d.ts +1 -0
- package/dist/index.es.js +1075 -470
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1071 -466
- package/dist/index.umd.js.map +1 -1
- package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +3 -1
- package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +1 -0
- package/dist/server-postgresql/src/auth/services.d.ts +48 -31
- package/dist/server-postgresql/src/connection.d.ts +25 -0
- package/dist/server-postgresql/src/schema/auth-schema.d.ts +2135 -41
- package/dist/server-postgresql/src/services/EntityFetchService.d.ts +4 -0
- package/dist/server-postgresql/src/services/EntityPersistService.d.ts +4 -0
- package/dist/server-postgresql/src/services/entityService.d.ts +6 -0
- package/dist/server-postgresql/src/services/realtimeService.d.ts +20 -0
- package/dist/server-postgresql/src/utils/drizzle-conditions.d.ts +18 -0
- package/dist/types/src/controllers/auth.d.ts +4 -26
- package/dist/types/src/controllers/client.d.ts +25 -43
- package/dist/types/src/controllers/collection_registry.d.ts +1 -1
- package/dist/types/src/controllers/data.d.ts +4 -0
- package/dist/types/src/controllers/data_driver.d.ts +23 -0
- package/dist/types/src/controllers/registry.d.ts +5 -4
- package/dist/types/src/rebase_context.d.ts +1 -1
- package/dist/types/src/types/auth_adapter.d.ts +5 -60
- package/dist/types/src/types/backend.d.ts +2 -2
- package/dist/types/src/types/backend_hooks.d.ts +2 -17
- package/dist/types/src/types/collections.d.ts +0 -4
- package/dist/types/src/types/component_ref.d.ts +1 -1
- package/dist/types/src/types/cron.d.ts +1 -1
- package/dist/types/src/types/entity_views.d.ts +1 -0
- package/dist/types/src/types/export_import.d.ts +1 -1
- package/dist/types/src/types/formex.d.ts +2 -2
- package/dist/types/src/types/properties.d.ts +9 -7
- package/dist/types/src/types/translations.d.ts +28 -12
- package/dist/types/src/types/user_management_delegate.d.ts +22 -57
- package/dist/types/src/users/index.d.ts +0 -1
- package/dist/types/src/users/user.d.ts +0 -1
- package/package.json +6 -6
- package/src/PostgresBackendDriver.ts +14 -2
- package/src/PostgresBootstrapper.ts +30 -20
- package/src/auth/ensure-tables.ts +116 -103
- package/src/auth/services.ts +347 -177
- package/src/connection.ts +77 -0
- package/src/data-transformer.ts +2 -2
- package/src/schema/auth-schema.ts +85 -75
- package/src/schema/doctor.ts +44 -3
- package/src/schema/generate-drizzle-schema-logic.ts +33 -3
- package/src/schema/generate-drizzle-schema.ts +6 -6
- package/src/schema/introspect-db-logic.ts +7 -0
- package/src/services/EntityFetchService.ts +69 -10
- package/src/services/EntityPersistService.ts +9 -0
- package/src/services/entityService.ts +9 -0
- package/src/services/realtimeService.ts +214 -2
- package/src/utils/drizzle-conditions.ts +74 -2
- package/src/websocket.ts +10 -2
- package/test/auth-services.test.ts +10 -166
- package/test/doctor.test.ts +6 -2
- package/test/drizzle-conditions.test.ts +168 -0
- package/vite.config.ts +1 -1
- package/dist/server-postgresql/src/schema/default-collections.d.ts +0 -2
- package/dist/types/src/users/roles.d.ts +0 -22
- 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,
|
|
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(
|
|
173
|
+
createRole(_data: CreateRoleData): Promise<RoleData>;
|
|
197
174
|
updateRole(id: string, data: Partial<Omit<RoleData, "id">>): Promise<RoleData | null>;
|
|
198
|
-
deleteRole(
|
|
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
|
+
};
|