@rebasepro/server-postgresql 0.1.2 → 0.2.1
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/LICENSE +22 -6
- package/dist/common/src/util/entities.d.ts +2 -2
- package/dist/common/src/util/relations.d.ts +1 -1
- package/dist/index.es.js +1160 -612
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1158 -610
- package/dist/index.umd.js.map +1 -1
- package/dist/server-postgresql/src/PostgresAdapter.d.ts +6 -0
- package/dist/server-postgresql/src/PostgresBackendDriver.d.ts +2 -1
- package/dist/server-postgresql/src/PostgresBootstrapper.d.ts +0 -5
- package/dist/server-postgresql/src/auth/ensure-tables.d.ts +2 -1
- package/dist/server-postgresql/src/auth/services.d.ts +37 -15
- package/dist/server-postgresql/src/index.d.ts +1 -0
- package/dist/server-postgresql/src/schema/auth-schema.d.ts +43 -856
- package/dist/server-postgresql/src/schema/default-collections.d.ts +2 -0
- package/dist/server-postgresql/src/schema/doctor.d.ts +10 -1
- package/dist/server-postgresql/src/schema/introspect-db-logic.d.ts +1 -0
- package/dist/server-postgresql/src/services/entity-helpers.d.ts +1 -1
- package/dist/server-postgresql/src/services/realtimeService.d.ts +12 -0
- package/dist/server-postgresql/src/websocket.d.ts +2 -1
- package/dist/types/src/controllers/auth.d.ts +9 -8
- package/dist/types/src/controllers/client.d.ts +3 -0
- package/dist/types/src/types/auth_adapter.d.ts +356 -0
- package/dist/types/src/types/collections.d.ts +67 -2
- package/dist/types/src/types/database_adapter.d.ts +94 -0
- package/dist/types/src/types/entity_actions.d.ts +7 -1
- package/dist/types/src/types/entity_callbacks.d.ts +1 -1
- package/dist/types/src/types/entity_views.d.ts +36 -1
- package/dist/types/src/types/index.d.ts +2 -0
- package/dist/types/src/types/plugins.d.ts +1 -1
- package/dist/types/src/types/properties.d.ts +24 -5
- package/dist/types/src/types/property_config.d.ts +6 -2
- package/dist/types/src/types/relations.d.ts +1 -1
- package/dist/types/src/types/translations.d.ts +8 -0
- package/dist/types/src/users/user.d.ts +5 -0
- package/package.json +21 -15
- package/src/PostgresAdapter.ts +59 -0
- package/src/PostgresBackendDriver.ts +57 -8
- package/src/PostgresBootstrapper.ts +35 -15
- package/src/auth/ensure-tables.ts +82 -189
- package/src/auth/services.ts +421 -170
- package/src/cli.ts +44 -13
- package/src/data-transformer.ts +78 -8
- package/src/history/HistoryService.ts +25 -2
- package/src/index.ts +1 -0
- package/src/schema/auth-schema.ts +130 -98
- package/src/schema/default-collections.ts +68 -0
- package/src/schema/doctor-cli.ts +5 -1
- package/src/schema/doctor.ts +85 -8
- package/src/schema/generate-drizzle-schema-logic.ts +74 -27
- package/src/schema/generate-drizzle-schema.ts +13 -3
- package/src/schema/introspect-db-inference.ts +5 -5
- package/src/schema/introspect-db-logic.ts +9 -2
- package/src/schema/introspect-db.ts +14 -3
- package/src/services/EntityFetchService.ts +5 -5
- package/src/services/RelationService.ts +2 -2
- package/src/services/entity-helpers.ts +1 -1
- package/src/services/realtimeService.ts +145 -136
- package/src/utils/drizzle-conditions.ts +16 -2
- package/src/websocket.ts +113 -37
- package/test/auth-services.test.ts +163 -74
- package/test/data-transformer-hardening.test.ts +57 -0
- package/test/data-transformer.test.ts +43 -0
- package/test/generate-drizzle-schema.test.ts +7 -5
- package/test/introspect-db-utils.test.ts +4 -1
- package/test/postgresDataDriver.test.ts +17 -0
- package/test/realtimeService.test.ts +7 -7
- package/test/websocket.test.ts +139 -0
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DatabaseAdapter } from "@rebasepro/types";
|
|
2
|
+
import type { PostgresDriverConfig } from "@rebasepro/server-core";
|
|
3
|
+
/**
|
|
4
|
+
* Creates a Postgres database adapter for Rebase.
|
|
5
|
+
*/
|
|
6
|
+
export declare function createPostgresAdapter(pgConfig: PostgresDriverConfig): DatabaseAdapter;
|
|
@@ -5,7 +5,7 @@ import { DatabasePoolManager } from "./databasePoolManager";
|
|
|
5
5
|
import { DrizzleClient } from "./interfaces";
|
|
6
6
|
import { User, RebaseClient } from "@rebasepro/types";
|
|
7
7
|
import { PostgresCollectionRegistry } from "./collections/PostgresCollectionRegistry";
|
|
8
|
-
import { DataDriver, DeleteEntityProps, Entity, EntityCollection, FetchCollectionProps, FetchEntityProps, ListenCollectionProps, ListenEntityProps, SaveEntityProps, RebaseData, TableMetadata, DatabaseAdmin } from "@rebasepro/types";
|
|
8
|
+
import { DataDriver, DeleteEntityProps, Entity, EntityCollection, FetchCollectionProps, FetchEntityProps, ListenCollectionProps, ListenEntityProps, SaveEntityProps, RebaseData, TableMetadata, DatabaseAdmin, RestFetchService } from "@rebasepro/types";
|
|
9
9
|
import { HistoryService } from "./history/HistoryService";
|
|
10
10
|
export declare class PostgresBackendDriver implements DataDriver {
|
|
11
11
|
db: DrizzleClient;
|
|
@@ -90,6 +90,7 @@ export declare class AuthenticatedPostgresBackendDriver implements DataDriver {
|
|
|
90
90
|
* Typed admin capabilities — delegates to the base driver.
|
|
91
91
|
*/
|
|
92
92
|
admin: DatabaseAdmin;
|
|
93
|
+
get restFetchService(): RestFetchService | undefined;
|
|
93
94
|
private withTransaction;
|
|
94
95
|
fetchCollection<M extends Record<string, unknown>>(props: FetchCollectionProps<M>): Promise<Entity<M>[]>;
|
|
95
96
|
/**
|
|
@@ -2,11 +2,6 @@
|
|
|
2
2
|
* PostgresBootstrapper
|
|
3
3
|
*
|
|
4
4
|
* Implements the `BackendBootstrapper` interface for PostgreSQL.
|
|
5
|
-
* Encapsulates all Postgres-specific initialization logic that was previously
|
|
6
|
-
* hardcoded inside `initializeRebaseBackend()`.
|
|
7
|
-
*
|
|
8
|
-
* Third-party drivers (MongoDB, MySQL, etc.) can implement their own
|
|
9
|
-
* bootstrapper following this pattern and pass it to the coordinator.
|
|
10
5
|
*/
|
|
11
6
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
12
7
|
import { BackendBootstrapper } from "@rebasepro/types";
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
2
|
+
import { PostgresCollectionRegistry } from "../collections/PostgresCollectionRegistry";
|
|
2
3
|
/**
|
|
3
4
|
* Auto-create auth tables if they don't exist
|
|
4
5
|
* This runs on startup to ensure the database is ready for auth
|
|
5
6
|
*/
|
|
6
|
-
export declare function ensureAuthTablesExist(db: NodePgDatabase): Promise<void>;
|
|
7
|
+
export declare function ensureAuthTablesExist(db: NodePgDatabase, registry?: PostgresCollectionRegistry): Promise<void>;
|
|
@@ -1,23 +1,39 @@
|
|
|
1
1
|
import { NodePgDatabase } from "drizzle-orm/node-postgres";
|
|
2
|
-
import {
|
|
2
|
+
import { PgTable, AnyPgColumn } from "drizzle-orm/pg-core";
|
|
3
3
|
import { UserRepository, RoleRepository, TokenRepository, AuthRepository, UserData, CreateUserData, RoleData, CreateRoleData, RefreshTokenInfo, PasswordResetTokenInfo, UserIdentityData, ListUsersOptions, PaginatedUsersResult, RoleData as Role } from "@rebasepro/server-core";
|
|
4
4
|
export type { Role };
|
|
5
|
+
export interface AuthSchemaTables {
|
|
6
|
+
users: PgTable & Record<string, AnyPgColumn>;
|
|
7
|
+
roles: PgTable & Record<string, AnyPgColumn>;
|
|
8
|
+
userRoles: PgTable & Record<string, AnyPgColumn>;
|
|
9
|
+
refreshTokens: PgTable & Record<string, AnyPgColumn>;
|
|
10
|
+
passwordResetTokens: PgTable & Record<string, AnyPgColumn>;
|
|
11
|
+
appConfig: PgTable & Record<string, AnyPgColumn>;
|
|
12
|
+
userIdentities: PgTable & Record<string, AnyPgColumn>;
|
|
13
|
+
}
|
|
5
14
|
/**
|
|
6
15
|
* PostgreSQL implementation of UserRepository.
|
|
7
16
|
* Handles all user-related database operations using Drizzle ORM.
|
|
8
17
|
*/
|
|
9
18
|
export declare class UserService implements UserRepository {
|
|
10
19
|
private db;
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
20
|
+
private usersTable;
|
|
21
|
+
private userIdentitiesTable;
|
|
22
|
+
private userRolesTable;
|
|
23
|
+
private rolesTable;
|
|
24
|
+
constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
|
|
25
|
+
private getQualifiedUsersTableName;
|
|
26
|
+
private mapRowToUser;
|
|
27
|
+
private mapPayload;
|
|
28
|
+
createUser(data: CreateUserData): Promise<UserData>;
|
|
29
|
+
getUserById(id: string): Promise<UserData | null>;
|
|
30
|
+
getUserByEmail(email: string): Promise<UserData | null>;
|
|
31
|
+
getUserByIdentity(provider: string, providerId: string): Promise<UserData | null>;
|
|
16
32
|
getUserIdentities(userId: string): Promise<UserIdentityData[]>;
|
|
17
33
|
linkUserIdentity(userId: string, provider: string, providerId: string, profileData?: Record<string, unknown>): Promise<void>;
|
|
18
|
-
updateUser(id: string, data: Partial<Omit<
|
|
34
|
+
updateUser(id: string, data: Partial<Omit<CreateUserData, "id">>): Promise<UserData | null>;
|
|
19
35
|
deleteUser(id: string): Promise<void>;
|
|
20
|
-
listUsers(): Promise<
|
|
36
|
+
listUsers(): Promise<UserData[]>;
|
|
21
37
|
listUsersPaginated(options?: ListUsersOptions): Promise<PaginatedUsersResult>;
|
|
22
38
|
/**
|
|
23
39
|
* Update user's password hash
|
|
@@ -34,7 +50,7 @@ export declare class UserService implements UserRepository {
|
|
|
34
50
|
/**
|
|
35
51
|
* Find user by email verification token
|
|
36
52
|
*/
|
|
37
|
-
getUserByVerificationToken(token: string): Promise<
|
|
53
|
+
getUserByVerificationToken(token: string): Promise<UserData | null>;
|
|
38
54
|
/**
|
|
39
55
|
* Get roles for a user from database
|
|
40
56
|
*/
|
|
@@ -55,7 +71,7 @@ export declare class UserService implements UserRepository {
|
|
|
55
71
|
* Get user with their roles
|
|
56
72
|
*/
|
|
57
73
|
getUserWithRoles(userId: string): Promise<{
|
|
58
|
-
user:
|
|
74
|
+
user: UserData;
|
|
59
75
|
roles: Role[];
|
|
60
76
|
} | null>;
|
|
61
77
|
}
|
|
@@ -65,7 +81,9 @@ export declare class UserService implements UserRepository {
|
|
|
65
81
|
*/
|
|
66
82
|
export declare class RoleService implements RoleRepository {
|
|
67
83
|
private db;
|
|
68
|
-
|
|
84
|
+
private rolesTable;
|
|
85
|
+
constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
|
|
86
|
+
private getQualifiedRolesTableName;
|
|
69
87
|
getRoleById(id: string): Promise<Role | null>;
|
|
70
88
|
listRoles(): Promise<Role[]>;
|
|
71
89
|
createRole(data: Omit<Role, "isAdmin" | "collectionPermissions"> & {
|
|
@@ -77,7 +95,9 @@ export declare class RoleService implements RoleRepository {
|
|
|
77
95
|
}
|
|
78
96
|
export declare class RefreshTokenService {
|
|
79
97
|
private db;
|
|
80
|
-
|
|
98
|
+
private refreshTokensTable;
|
|
99
|
+
constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
|
|
100
|
+
private getQualifiedRefreshTokensTableName;
|
|
81
101
|
createToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void>;
|
|
82
102
|
findByHash(tokenHash: string): Promise<RefreshTokenInfo | null>;
|
|
83
103
|
deleteByHash(tokenHash: string): Promise<void>;
|
|
@@ -90,7 +110,9 @@ export declare class RefreshTokenService {
|
|
|
90
110
|
*/
|
|
91
111
|
export declare class PasswordResetTokenService {
|
|
92
112
|
private db;
|
|
93
|
-
|
|
113
|
+
private passwordResetTokensTable;
|
|
114
|
+
constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
|
|
115
|
+
private getQualifiedPasswordResetTokensTableName;
|
|
94
116
|
/**
|
|
95
117
|
* Create a password reset token
|
|
96
118
|
*/
|
|
@@ -123,7 +145,7 @@ export declare class PostgresTokenRepository implements TokenRepository {
|
|
|
123
145
|
private db;
|
|
124
146
|
private refreshTokenService;
|
|
125
147
|
private passwordResetTokenService;
|
|
126
|
-
constructor(db: NodePgDatabase);
|
|
148
|
+
constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
|
|
127
149
|
createRefreshToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void>;
|
|
128
150
|
findRefreshTokenByHash(tokenHash: string): Promise<RefreshTokenInfo | null>;
|
|
129
151
|
deleteRefreshToken(tokenHash: string): Promise<void>;
|
|
@@ -146,7 +168,7 @@ export declare class PostgresAuthRepository implements AuthRepository {
|
|
|
146
168
|
private userService;
|
|
147
169
|
private roleService;
|
|
148
170
|
private tokenRepository;
|
|
149
|
-
constructor(db: NodePgDatabase);
|
|
171
|
+
constructor(db: NodePgDatabase, tableOrTables?: (PgTable & Record<string, AnyPgColumn>) | Partial<AuthSchemaTables>);
|
|
150
172
|
createUser(data: CreateUserData): Promise<UserData>;
|
|
151
173
|
getUserById(id: string): Promise<UserData | null>;
|
|
152
174
|
getUserByEmail(email: string): Promise<UserData | null>;
|