@rebasepro/server-mongo 0.0.1-canary.4829d6e
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 -0
- package/README.md +86 -0
- package/dist/MongoBootstrapper.d.ts +18 -0
- package/dist/MongoBootstrapper.d.ts.map +1 -0
- package/dist/auth/ensure-collections.d.ts +3 -0
- package/dist/auth/ensure-collections.d.ts.map +1 -0
- package/dist/auth/services.d.ts +156 -0
- package/dist/auth/services.d.ts.map +1 -0
- package/dist/connection.d.ts +35 -0
- package/dist/connection.d.ts.map +1 -0
- package/dist/db/MongoConditionBuilder.d.ts +64 -0
- package/dist/db/MongoConditionBuilder.d.ts.map +1 -0
- package/dist/db/MongoDataService.d.ts +101 -0
- package/dist/db/MongoDataService.d.ts.map +1 -0
- package/dist/ensure-collections-Bkx_O5CQ.js +94 -0
- package/dist/ensure-collections-Bkx_O5CQ.js.map +1 -0
- package/dist/ensure-history-collection-yajOt2dv.js +21 -0
- package/dist/ensure-history-collection-yajOt2dv.js.map +1 -0
- package/dist/factory.d.ts +151 -0
- package/dist/factory.d.ts.map +1 -0
- package/dist/history/ensure-history-collection.d.ts +3 -0
- package/dist/history/ensure-history-collection.d.ts.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.es.js +2508 -0
- package/dist/index.es.js.map +1 -0
- package/dist/index.umd.js +2925 -0
- package/dist/index.umd.js.map +1 -0
- package/dist/services/MongoDriver.d.ts +125 -0
- package/dist/services/MongoDriver.d.ts.map +1 -0
- package/dist/services/MongoHistoryService.d.ts +37 -0
- package/dist/services/MongoHistoryService.d.ts.map +1 -0
- package/dist/services/MongoRealtimeService.d.ts +103 -0
- package/dist/services/MongoRealtimeService.d.ts.map +1 -0
- package/dist/websocket-DQlwCHFq.js +281 -0
- package/dist/websocket-DQlwCHFq.js.map +1 -0
- package/dist/websocket.d.ts +7 -0
- package/dist/websocket.d.ts.map +1 -0
- package/package.json +81 -0
- package/src/MongoBootstrapper.ts +196 -0
- package/src/auth/ensure-collections.ts +105 -0
- package/src/auth/services.ts +732 -0
- package/src/connection.ts +60 -0
- package/src/db/MongoConditionBuilder.ts +224 -0
- package/src/db/MongoDataService.ts +368 -0
- package/src/factory.ts +305 -0
- package/src/history/ensure-history-collection.ts +22 -0
- package/src/index.ts +25 -0
- package/src/services/MongoDriver.ts +1120 -0
- package/src/services/MongoHistoryService.ts +181 -0
- package/src/services/MongoRealtimeService.ts +446 -0
- package/src/websocket.ts +297 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Rebase
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
22
|
+
|
package/README.md
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# @rebasepro/server-mongo
|
|
2
|
+
|
|
3
|
+
MongoDB database driver for Rebase.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
pnpm add @rebasepro/server-mongo
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## What This Package Does
|
|
12
|
+
|
|
13
|
+
Implements the Rebase `BackendBootstrapper` and backend interfaces for MongoDB. Provides a complete data driver, change-stream-based realtime, snapshot history, auth repositories, and WebSocket support. Plug it into `@rebasepro/server` via `createMongoBootstrapper()`, or use the standalone `createMongoBackend()` factory for direct access.
|
|
14
|
+
|
|
15
|
+
## Key Exports
|
|
16
|
+
|
|
17
|
+
| Export | Description |
|
|
18
|
+
|--------|-------------|
|
|
19
|
+
| `createMongoBootstrapper(config)` | Creates a `BackendBootstrapper` for use with `initializeRebaseBackend({ bootstrappers: [...] })`. |
|
|
20
|
+
| `createMongoBackend(config)` | Standalone factory — returns a `MongoBackendInstance` with driver, snapshot service, realtime, admin, and lifecycle methods. |
|
|
21
|
+
| `createMongoDelegate(db)` | Convenience factory for just the `MongoDriver` (DataDriver). |
|
|
22
|
+
| `createMongoRealtimeService(db)` | Creates a MongoDB change-stream-based realtime provider. |
|
|
23
|
+
| `createMongoSnapshotRepository(db)` | Creates an `SnapshotRepository` for direct CRUD. |
|
|
24
|
+
| `createMongoDBConnection(url, dbName)` | Connects to MongoDB and returns a `MongoDBConnection` wrapper. |
|
|
25
|
+
| `MongoDBConnection` | `DatabaseConnection` implementation wrapping `MongoClient` + `Db`. |
|
|
26
|
+
| `MongoDriver` | The `DataDriver` implementation for MongoDB. |
|
|
27
|
+
| `MongoSnapshotService` | Low-level snapshot CRUD service. |
|
|
28
|
+
| `MongoRealtimeService` | Change-stream-based `RealtimeProvider`. |
|
|
29
|
+
| `MongoCollectionRegistry` | In-memory collection registry. |
|
|
30
|
+
| `isMongoBackendConfig(config)` | Type guard for `MongoBackendConfig`. |
|
|
31
|
+
|
|
32
|
+
## Quick Start
|
|
33
|
+
|
|
34
|
+
### With server (recommended)
|
|
35
|
+
|
|
36
|
+
```typescript
|
|
37
|
+
import { MongoClient } from "mongodb";
|
|
38
|
+
import { createMongoBootstrapper } from "@rebasepro/server-mongo";
|
|
39
|
+
import { initializeRebaseBackend } from "@rebasepro/server";
|
|
40
|
+
|
|
41
|
+
const client = new MongoClient("mongodb://localhost:27017");
|
|
42
|
+
await client.connect();
|
|
43
|
+
const db = client.db("my_database");
|
|
44
|
+
|
|
45
|
+
const backend = await initializeRebaseBackend({
|
|
46
|
+
app,
|
|
47
|
+
server,
|
|
48
|
+
bootstrappers: [
|
|
49
|
+
createMongoBootstrapper({ connection: db, client }),
|
|
50
|
+
],
|
|
51
|
+
collections,
|
|
52
|
+
auth: { /* ... */ },
|
|
53
|
+
});
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Standalone (without server)
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { MongoClient } from "mongodb";
|
|
60
|
+
import { createMongoBackend } from "@rebasepro/server-mongo";
|
|
61
|
+
|
|
62
|
+
const client = new MongoClient("mongodb://localhost:27017");
|
|
63
|
+
await client.connect();
|
|
64
|
+
|
|
65
|
+
const backend = createMongoBackend({
|
|
66
|
+
type: "mongodb",
|
|
67
|
+
connection: client.db("my_database"),
|
|
68
|
+
client,
|
|
69
|
+
collections: myCollections,
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
// Use directly
|
|
73
|
+
const health = await backend.healthCheck();
|
|
74
|
+
const snapshots = await backend.snapshotService.fetchCollection("users", {});
|
|
75
|
+
|
|
76
|
+
// Cleanup
|
|
77
|
+
await backend.destroy();
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Related Packages
|
|
81
|
+
|
|
82
|
+
| Package | Role |
|
|
83
|
+
|---------|------|
|
|
84
|
+
| `@rebasepro/server` | Backend orchestrator (peer dependency, optional) |
|
|
85
|
+
| `@rebasepro/types` | Shared interfaces (`BackendBootstrapper`, `DataDriver`, `RealtimeProvider`) |
|
|
86
|
+
| `@rebasepro/common` | Default collections and shared utilities |
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Db, MongoClient } from "mongodb";
|
|
2
|
+
import type { BackendBootstrapper } from "@rebasepro/types";
|
|
3
|
+
import { MongoDriver } from "./services/MongoDriver";
|
|
4
|
+
import { MongoRealtimeService } from "./services/MongoRealtimeService";
|
|
5
|
+
import { MongoCollectionRegistry } from "./factory";
|
|
6
|
+
export interface MongoDriverConfig {
|
|
7
|
+
connection: Db;
|
|
8
|
+
client: MongoClient;
|
|
9
|
+
}
|
|
10
|
+
export interface MongoDriverInternals {
|
|
11
|
+
db: Db;
|
|
12
|
+
client: MongoClient;
|
|
13
|
+
registry: MongoCollectionRegistry;
|
|
14
|
+
realtimeService: MongoRealtimeService;
|
|
15
|
+
driver: MongoDriver;
|
|
16
|
+
}
|
|
17
|
+
export declare function createMongoBootstrapper(mongoConfig: MongoDriverConfig): BackendBootstrapper;
|
|
18
|
+
//# sourceMappingURL=MongoBootstrapper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoBootstrapper.d.ts","sourceRoot":"","sources":["../src/MongoBootstrapper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EACR,mBAAmB,EAQtB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iCAAiC,CAAC;AACvE,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAIpD,MAAM,WAAW,iBAAiB;IAC9B,UAAU,EAAE,EAAE,CAAC;IACf,MAAM,EAAE,WAAW,CAAC;CACvB;AAED,MAAM,WAAW,oBAAoB;IACjC,EAAE,EAAE,EAAE,CAAC;IACP,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,EAAE,uBAAuB,CAAC;IAClC,eAAe,EAAE,oBAAoB,CAAC;IACtC,MAAM,EAAE,WAAW,CAAC;CACvB;AAcD,wBAAgB,uBAAuB,CAAC,WAAW,EAAE,iBAAiB,GAAG,mBAAmB,CAyJ3F"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-collections.d.ts","sourceRoot":"","sources":["../../src/auth/ensure-collections.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AA0C7B,wBAAsB,0BAA0B,CAAC,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCtE"}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import { Db } from "mongodb";
|
|
2
|
+
/** Loose document type that allows string _id values (Rebase convention). */
|
|
3
|
+
export interface MongoDoc {
|
|
4
|
+
_id?: string;
|
|
5
|
+
[key: string]: any;
|
|
6
|
+
}
|
|
7
|
+
import { UserRepository, RoleRepository, TokenRepository, AuthRepository, UserData, CreateUserData, RoleData, CreateRoleData, RefreshTokenInfo, PasswordResetTokenInfo, MagicLinkTokenInfo, UserIdentityData, ListUsersOptions, PaginatedUsersResult, MfaFactor, MfaChallengeInfo } from "@rebasepro/server";
|
|
8
|
+
export type Role = RoleData;
|
|
9
|
+
export declare class MongoUserService implements UserRepository {
|
|
10
|
+
private db;
|
|
11
|
+
constructor(db: Db);
|
|
12
|
+
private get collection();
|
|
13
|
+
private get identitiesCollection();
|
|
14
|
+
private get userRolesCollection();
|
|
15
|
+
private get rolesCollection();
|
|
16
|
+
createUser(data: CreateUserData): Promise<UserData>;
|
|
17
|
+
getUserById(id: string): Promise<UserData | null>;
|
|
18
|
+
getUserByEmail(email: string): Promise<UserData | null>;
|
|
19
|
+
getUserByIdentity(provider: string, providerId: string): Promise<UserData | null>;
|
|
20
|
+
getUserIdentities(userId: string): Promise<UserIdentityData[]>;
|
|
21
|
+
linkUserIdentity(userId: string, provider: string, providerId: string, profileData?: Record<string, unknown>): Promise<void>;
|
|
22
|
+
updateUser(id: string, data: Partial<Omit<CreateUserData, "id">>): Promise<UserData | null>;
|
|
23
|
+
deleteUser(id: string): Promise<void>;
|
|
24
|
+
listUsers(): Promise<UserData[]>;
|
|
25
|
+
listUsersPaginated(options?: ListUsersOptions): Promise<PaginatedUsersResult>;
|
|
26
|
+
updatePassword(id: string, passwordHash: string): Promise<void>;
|
|
27
|
+
setEmailVerified(id: string, verified: boolean): Promise<void>;
|
|
28
|
+
setVerificationToken(id: string, token: string | null): Promise<void>;
|
|
29
|
+
getUserByVerificationToken(token: string): Promise<UserData | null>;
|
|
30
|
+
getUserRoles(userId: string): Promise<RoleData[]>;
|
|
31
|
+
getUserRoleIds(userId: string): Promise<string[]>;
|
|
32
|
+
setUserRoles(userId: string, roleIds: string[]): Promise<void>;
|
|
33
|
+
assignDefaultRole(userId: string, roleId: string): Promise<void>;
|
|
34
|
+
getUserWithRoles(userId: string): Promise<{
|
|
35
|
+
user: UserData;
|
|
36
|
+
roles: RoleData[];
|
|
37
|
+
} | null>;
|
|
38
|
+
}
|
|
39
|
+
export declare class MongoRoleService implements RoleRepository {
|
|
40
|
+
private db;
|
|
41
|
+
constructor(db: Db);
|
|
42
|
+
private get collection();
|
|
43
|
+
getRoleById(id: string): Promise<RoleData | null>;
|
|
44
|
+
listRoles(): Promise<RoleData[]>;
|
|
45
|
+
createRole(data: CreateRoleData): Promise<RoleData>;
|
|
46
|
+
updateRole(id: string, data: Partial<Omit<RoleData, "id">>): Promise<RoleData | null>;
|
|
47
|
+
deleteRole(id: string): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
export declare class MongoRefreshTokenService {
|
|
50
|
+
private db;
|
|
51
|
+
constructor(db: Db);
|
|
52
|
+
private get collection();
|
|
53
|
+
createToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void>;
|
|
54
|
+
findByHash(tokenHash: string): Promise<RefreshTokenInfo | null>;
|
|
55
|
+
deleteByHash(tokenHash: string): Promise<void>;
|
|
56
|
+
deleteAllForUser(userId: string): Promise<void>;
|
|
57
|
+
listForUser(userId: string): Promise<RefreshTokenInfo[]>;
|
|
58
|
+
deleteById(id: string, userId: string): Promise<void>;
|
|
59
|
+
}
|
|
60
|
+
export declare class MongoPasswordResetTokenService {
|
|
61
|
+
private db;
|
|
62
|
+
constructor(db: Db);
|
|
63
|
+
private get collection();
|
|
64
|
+
createToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
|
|
65
|
+
findValidByHash(tokenHash: string): Promise<{
|
|
66
|
+
userId: string;
|
|
67
|
+
expiresAt: Date;
|
|
68
|
+
} | null>;
|
|
69
|
+
markAsUsed(tokenHash: string): Promise<void>;
|
|
70
|
+
deleteAllForUser(userId: string): Promise<void>;
|
|
71
|
+
deleteExpired(): Promise<void>;
|
|
72
|
+
}
|
|
73
|
+
export declare class MongoTokenRepository implements TokenRepository {
|
|
74
|
+
private db;
|
|
75
|
+
private refreshTokenService;
|
|
76
|
+
private passwordResetTokenService;
|
|
77
|
+
constructor(db: Db);
|
|
78
|
+
createRefreshToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void>;
|
|
79
|
+
findRefreshTokenByHash(tokenHash: string): Promise<RefreshTokenInfo | null>;
|
|
80
|
+
deleteRefreshToken(tokenHash: string): Promise<void>;
|
|
81
|
+
deleteAllRefreshTokensForUser(userId: string): Promise<void>;
|
|
82
|
+
listRefreshTokensForUser(userId: string): Promise<RefreshTokenInfo[]>;
|
|
83
|
+
deleteRefreshTokenById(id: string, userId: string): Promise<void>;
|
|
84
|
+
createPasswordResetToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
|
|
85
|
+
findValidPasswordResetToken(tokenHash: string): Promise<PasswordResetTokenInfo | null>;
|
|
86
|
+
markPasswordResetTokenUsed(tokenHash: string): Promise<void>;
|
|
87
|
+
deleteAllPasswordResetTokensForUser(userId: string): Promise<void>;
|
|
88
|
+
deleteExpiredTokens(): Promise<void>;
|
|
89
|
+
createMagicLinkToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
|
|
90
|
+
findValidMagicLinkToken(tokenHash: string): Promise<MagicLinkTokenInfo | null>;
|
|
91
|
+
markMagicLinkTokenUsed(tokenHash: string): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
export declare class MongoAuthRepository implements AuthRepository {
|
|
94
|
+
private db;
|
|
95
|
+
private userService;
|
|
96
|
+
private roleService;
|
|
97
|
+
private tokenRepository;
|
|
98
|
+
constructor(db: Db);
|
|
99
|
+
createUser(data: CreateUserData): Promise<UserData>;
|
|
100
|
+
getUserById(id: string): Promise<UserData | null>;
|
|
101
|
+
getUserByEmail(email: string): Promise<UserData | null>;
|
|
102
|
+
getUserByIdentity(provider: string, providerId: string): Promise<UserData | null>;
|
|
103
|
+
getUserIdentities(userId: string): Promise<UserIdentityData[]>;
|
|
104
|
+
linkUserIdentity(userId: string, provider: string, providerId: string, profileData?: Record<string, unknown>): Promise<void>;
|
|
105
|
+
updateUser(id: string, data: Partial<Omit<CreateUserData, "id">>): Promise<UserData | null>;
|
|
106
|
+
deleteUser(id: string): Promise<void>;
|
|
107
|
+
listUsers(): Promise<UserData[]>;
|
|
108
|
+
listUsersPaginated(options?: ListUsersOptions): Promise<PaginatedUsersResult>;
|
|
109
|
+
updatePassword(id: string, passwordHash: string): Promise<void>;
|
|
110
|
+
setEmailVerified(id: string, verified: boolean): Promise<void>;
|
|
111
|
+
setVerificationToken(id: string, token: string | null): Promise<void>;
|
|
112
|
+
getUserByVerificationToken(token: string): Promise<UserData | null>;
|
|
113
|
+
getUserRoles(userId: string): Promise<RoleData[]>;
|
|
114
|
+
getUserRoleIds(userId: string): Promise<string[]>;
|
|
115
|
+
setUserRoles(userId: string, roleIds: string[]): Promise<void>;
|
|
116
|
+
assignDefaultRole(userId: string, roleId: string): Promise<void>;
|
|
117
|
+
getUserWithRoles(userId: string): Promise<{
|
|
118
|
+
user: UserData;
|
|
119
|
+
roles: RoleData[];
|
|
120
|
+
} | null>;
|
|
121
|
+
getRoleById(id: string): Promise<RoleData | null>;
|
|
122
|
+
listRoles(): Promise<RoleData[]>;
|
|
123
|
+
createRole(data: CreateRoleData): Promise<RoleData>;
|
|
124
|
+
updateRole(id: string, data: Partial<Omit<RoleData, "id">>): Promise<RoleData | null>;
|
|
125
|
+
deleteRole(id: string): Promise<void>;
|
|
126
|
+
createRefreshToken(userId: string, tokenHash: string, expiresAt: Date, userAgent?: string, ipAddress?: string): Promise<void>;
|
|
127
|
+
findRefreshTokenByHash(tokenHash: string): Promise<RefreshTokenInfo | null>;
|
|
128
|
+
deleteRefreshToken(tokenHash: string): Promise<void>;
|
|
129
|
+
deleteAllRefreshTokensForUser(userId: string): Promise<void>;
|
|
130
|
+
listRefreshTokensForUser(userId: string): Promise<RefreshTokenInfo[]>;
|
|
131
|
+
deleteRefreshTokenById(id: string, userId: string): Promise<void>;
|
|
132
|
+
createPasswordResetToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
|
|
133
|
+
findValidPasswordResetToken(tokenHash: string): Promise<PasswordResetTokenInfo | null>;
|
|
134
|
+
markPasswordResetTokenUsed(tokenHash: string): Promise<void>;
|
|
135
|
+
deleteAllPasswordResetTokensForUser(userId: string): Promise<void>;
|
|
136
|
+
deleteExpiredTokens(): Promise<void>;
|
|
137
|
+
createMagicLinkToken(userId: string, tokenHash: string, expiresAt: Date): Promise<void>;
|
|
138
|
+
findValidMagicLinkToken(tokenHash: string): Promise<MagicLinkTokenInfo | null>;
|
|
139
|
+
markMagicLinkTokenUsed(tokenHash: string): Promise<void>;
|
|
140
|
+
createMfaFactor(userId: string, factorType: "totp", secretEncrypted: string, friendlyName?: string): Promise<MfaFactor>;
|
|
141
|
+
getMfaFactors(userId: string): Promise<MfaFactor[]>;
|
|
142
|
+
getMfaFactorById(factorId: string): Promise<(MfaFactor & {
|
|
143
|
+
secretEncrypted: string;
|
|
144
|
+
}) | null>;
|
|
145
|
+
verifyMfaFactor(factorId: string): Promise<void>;
|
|
146
|
+
deleteMfaFactor(factorId: string, userId: string): Promise<void>;
|
|
147
|
+
createMfaChallenge(factorId: string, ipAddress?: string): Promise<MfaChallengeInfo>;
|
|
148
|
+
getMfaChallengeById(challengeId: string): Promise<MfaChallengeInfo | null>;
|
|
149
|
+
verifyMfaChallenge(challengeId: string): Promise<void>;
|
|
150
|
+
createRecoveryCodes(userId: string, codeHashes: string[]): Promise<void>;
|
|
151
|
+
useRecoveryCode(userId: string, codeHash: string): Promise<boolean>;
|
|
152
|
+
getUnusedRecoveryCodeCount(userId: string): Promise<number>;
|
|
153
|
+
deleteAllRecoveryCodes(userId: string): Promise<void>;
|
|
154
|
+
hasVerifiedMfaFactors(userId: string): Promise<boolean>;
|
|
155
|
+
}
|
|
156
|
+
//# sourceMappingURL=services.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"services.d.ts","sourceRoot":"","sources":["../../src/auth/services.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Connection
|
|
3
|
+
*
|
|
4
|
+
* Wraps MongoDB connection to implement the DatabaseConnection interface.
|
|
5
|
+
*/
|
|
6
|
+
import { Db, MongoClient } from "mongodb";
|
|
7
|
+
import { DatabaseConnection } from "@rebasepro/types";
|
|
8
|
+
/**
|
|
9
|
+
* MongoDB database connection wrapper that implements DatabaseConnection interface.
|
|
10
|
+
*/
|
|
11
|
+
export declare class MongoDBConnection implements DatabaseConnection {
|
|
12
|
+
readonly db: Db;
|
|
13
|
+
readonly client: MongoClient;
|
|
14
|
+
readonly type = "mongodb";
|
|
15
|
+
constructor(db: Db, client: MongoClient);
|
|
16
|
+
get isConnected(): boolean;
|
|
17
|
+
close(): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Create a MongoDB database connection from a connection string.
|
|
21
|
+
*
|
|
22
|
+
* @param connectionString - MongoDB connection string (e.g., mongodb://localhost:27017)
|
|
23
|
+
* @param databaseName - Name of the database to use
|
|
24
|
+
* @returns Promise resolving to MongoDBConnection
|
|
25
|
+
*
|
|
26
|
+
* @example
|
|
27
|
+
* ```typescript
|
|
28
|
+
* const connection = await createMongoDBConnection(
|
|
29
|
+
* "mongodb://localhost:27017",
|
|
30
|
+
* "my_database"
|
|
31
|
+
* );
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export declare function createMongoDBConnection(connectionString: string, databaseName: string): Promise<MongoDBConnection>;
|
|
35
|
+
//# sourceMappingURL=connection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"connection.d.ts","sourceRoot":"","sources":["../src/connection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEtD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;aAIpC,EAAE,EAAE,EAAE;aACN,MAAM,EAAE,WAAW;IAJvC,QAAQ,CAAC,IAAI,aAAa;gBAGN,EAAE,EAAE,EAAE,EACN,MAAM,EAAE,WAAW;IAGvC,IAAI,WAAW,IAAI,OAAO,CASzB;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,uBAAuB,CACzC,gBAAgB,EAAE,MAAM,EACxB,YAAY,EAAE,MAAM,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAK5B"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Condition Builder
|
|
3
|
+
*
|
|
4
|
+
* Translates Rebase filter conditions to MongoDB query operators.
|
|
5
|
+
*/
|
|
6
|
+
import { FilterValues } from "@rebasepro/types";
|
|
7
|
+
import { Filter, Document } from "mongodb";
|
|
8
|
+
/**
|
|
9
|
+
* MongoDB Condition Builder
|
|
10
|
+
*
|
|
11
|
+
* Provides static methods to translate Rebase filter conditions
|
|
12
|
+
* to MongoDB query filters.
|
|
13
|
+
*/
|
|
14
|
+
export declare class MongoConditionBuilder {
|
|
15
|
+
/**
|
|
16
|
+
* Build MongoDB filter conditions from Rebase FilterValues
|
|
17
|
+
*
|
|
18
|
+
* @param filter - Rebase filter values
|
|
19
|
+
* @returns Array of MongoDB filter objects
|
|
20
|
+
*/
|
|
21
|
+
static buildFilterConditions<M extends Record<string, any>>(filter: FilterValues<Extract<keyof M, string>>): Filter<Document>[];
|
|
22
|
+
/**
|
|
23
|
+
* Build search conditions for text search
|
|
24
|
+
*
|
|
25
|
+
* @param searchString - Text to search for
|
|
26
|
+
* @param properties - Properties to search in
|
|
27
|
+
* @returns Array of MongoDB filter objects for text search
|
|
28
|
+
*/
|
|
29
|
+
static buildSearchConditions(searchString: string, properties: Record<string, any>): Filter<Document>[];
|
|
30
|
+
/**
|
|
31
|
+
* Combine multiple conditions with AND operator
|
|
32
|
+
*
|
|
33
|
+
* @param conditions - Array of filter conditions
|
|
34
|
+
* @returns Combined filter or undefined if empty
|
|
35
|
+
*/
|
|
36
|
+
static combineConditionsWithAnd(conditions: Filter<Document>[]): Filter<Document> | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* Combine multiple conditions with OR operator
|
|
39
|
+
*
|
|
40
|
+
* @param conditions - Array of filter conditions
|
|
41
|
+
* @returns Combined filter or undefined if empty
|
|
42
|
+
*/
|
|
43
|
+
static combineConditionsWithOr(conditions: Filter<Document>[]): Filter<Document> | undefined;
|
|
44
|
+
/**
|
|
45
|
+
* Build a complete MongoDB query from Rebase options
|
|
46
|
+
*
|
|
47
|
+
* @param options - Rebase fetch options
|
|
48
|
+
* @returns MongoDB filter object
|
|
49
|
+
*/
|
|
50
|
+
static buildQuery<M extends Record<string, any>>(options: {
|
|
51
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
52
|
+
searchString?: string;
|
|
53
|
+
properties?: Record<string, any>;
|
|
54
|
+
}): Filter<Document>;
|
|
55
|
+
/**
|
|
56
|
+
* Build MongoDB sort options from Rebase options
|
|
57
|
+
*
|
|
58
|
+
* @param orderBy - Field to order by
|
|
59
|
+
* @param order - Sort direction
|
|
60
|
+
* @returns MongoDB sort object
|
|
61
|
+
*/
|
|
62
|
+
static buildSort(orderBy?: string, order?: "asc" | "desc"): Record<string, 1 | -1> | undefined;
|
|
63
|
+
}
|
|
64
|
+
//# sourceMappingURL=MongoConditionBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoConditionBuilder.d.ts","sourceRoot":"","sources":["../../src/db/MongoConditionBuilder.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAiB,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAsC3C;;;;;GAKG;AACH,qBAAa,qBAAqB;IAC9B;;;;;OAKG;IACH,MAAM,CAAC,qBAAqB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EACtD,MAAM,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAC/C,MAAM,CAAC,QAAQ,CAAC,EAAE;IAqDrB;;;;;;OAMG;IACH,MAAM,CAAC,qBAAqB,CACxB,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAChC,MAAM,CAAC,QAAQ,CAAC,EAAE;IAyBrB;;;;;OAKG;IACH,MAAM,CAAC,wBAAwB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAM7F;;;;;OAKG;IACH,MAAM,CAAC,uBAAuB,CAAC,UAAU,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,SAAS;IAM5F;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE;QACtD,MAAM,CAAC,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;QAChD,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;KACpC,GAAG,MAAM,CAAC,QAAQ,CAAC;IA2BpB;;;;;;OAMG;IACH,MAAM,CAAC,SAAS,CACZ,OAAO,CAAC,EAAE,MAAM,EAChB,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,GACvB,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS;CAIxC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MongoDB Row Service
|
|
3
|
+
*
|
|
4
|
+
* Implements DataRepository interface for MongoDB.
|
|
5
|
+
* Provides all CRUD operations for rows.
|
|
6
|
+
*/
|
|
7
|
+
import { Db, Document, Filter } from "mongodb";
|
|
8
|
+
import { FilterValues, DataRepository, CollectionConfig } from "@rebasepro/types";
|
|
9
|
+
/**
|
|
10
|
+
* MongoDB Row Service
|
|
11
|
+
*
|
|
12
|
+
* Implements the DataRepository interface for MongoDB.
|
|
13
|
+
* Provides all CRUD operations for rows stored in MongoDB collections.
|
|
14
|
+
*/
|
|
15
|
+
export declare class MongoDataService implements DataRepository {
|
|
16
|
+
private db;
|
|
17
|
+
constructor(db: Db);
|
|
18
|
+
/**
|
|
19
|
+
* Get a MongoDB collection by its path
|
|
20
|
+
*/
|
|
21
|
+
private getCollection;
|
|
22
|
+
/**
|
|
23
|
+
* Convert a string ID to ObjectId if it's a valid ObjectId string
|
|
24
|
+
*/
|
|
25
|
+
private toObjectId;
|
|
26
|
+
/**
|
|
27
|
+
* Convert a MongoDB document to a flat row (`{ id, ...fields }`)
|
|
28
|
+
*/
|
|
29
|
+
private documentToRow;
|
|
30
|
+
/**
|
|
31
|
+
* Convert values from MongoDB format to Rebase format
|
|
32
|
+
*/
|
|
33
|
+
private convertFromMongoValues;
|
|
34
|
+
/**
|
|
35
|
+
* Convert a single value from MongoDB format
|
|
36
|
+
*/
|
|
37
|
+
private convertFromMongoValue;
|
|
38
|
+
/**
|
|
39
|
+
* Convert values to MongoDB format for storage
|
|
40
|
+
*/
|
|
41
|
+
private convertToMongoValues;
|
|
42
|
+
/**
|
|
43
|
+
* Convert a single value to MongoDB format
|
|
44
|
+
*/
|
|
45
|
+
private convertToMongoValue;
|
|
46
|
+
/**
|
|
47
|
+
* Fetch a single row by ID
|
|
48
|
+
*/
|
|
49
|
+
fetchOne<M extends Record<string, any>>(collectionPath: string, id: string | number, _databaseId?: string): Promise<Record<string, unknown> | undefined>;
|
|
50
|
+
/**
|
|
51
|
+
* Fetch a collection of rows with optional filtering, ordering, and pagination
|
|
52
|
+
*/
|
|
53
|
+
fetchCollection<M extends Record<string, any>>(collectionPath: string, options?: {
|
|
54
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
55
|
+
orderBy?: string;
|
|
56
|
+
order?: "desc" | "asc";
|
|
57
|
+
limit?: number;
|
|
58
|
+
startAfter?: any;
|
|
59
|
+
searchString?: string;
|
|
60
|
+
databaseId?: string;
|
|
61
|
+
collection?: CollectionConfig;
|
|
62
|
+
rawQuery?: Filter<Document>;
|
|
63
|
+
}): Promise<Record<string, unknown>[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Search rows by text
|
|
66
|
+
*/
|
|
67
|
+
searchRows<M extends Record<string, any>>(collectionPath: string, searchString: string, options?: {
|
|
68
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
69
|
+
orderBy?: string;
|
|
70
|
+
order?: "desc" | "asc";
|
|
71
|
+
limit?: number;
|
|
72
|
+
databaseId?: string;
|
|
73
|
+
collection?: CollectionConfig;
|
|
74
|
+
rawQuery?: Filter<Document>;
|
|
75
|
+
}): Promise<Record<string, unknown>[]>;
|
|
76
|
+
/**
|
|
77
|
+
* Count rows in a collection
|
|
78
|
+
*/
|
|
79
|
+
count<M extends Record<string, any>>(collectionPath: string, options?: {
|
|
80
|
+
filter?: FilterValues<Extract<keyof M, string>>;
|
|
81
|
+
databaseId?: string;
|
|
82
|
+
rawQuery?: Filter<Document>;
|
|
83
|
+
}): Promise<number>;
|
|
84
|
+
/**
|
|
85
|
+
* Save an row (create or update)
|
|
86
|
+
*/
|
|
87
|
+
save<M extends Record<string, any>>(collectionPath: string, values: Partial<M>, id?: string | number, _databaseId?: string): Promise<Record<string, unknown>>;
|
|
88
|
+
/**
|
|
89
|
+
* Delete an row by ID
|
|
90
|
+
*/
|
|
91
|
+
delete(collectionPath: string, id: string | number, _databaseId?: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Check if a field value is unique in a collection
|
|
94
|
+
*/
|
|
95
|
+
checkUniqueField(collectionPath: string, fieldName: string, value: any, excludeEntityId?: string, _databaseId?: string): Promise<boolean>;
|
|
96
|
+
/**
|
|
97
|
+
* Generate a new row ID
|
|
98
|
+
*/
|
|
99
|
+
generateId(): string;
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=MongoDataService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MongoDataService.d.ts","sourceRoot":"","sources":["../../src/db/MongoDataService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { logger } from "@rebasepro/server";
|
|
2
|
+
//#region src/auth/ensure-collections.ts
|
|
3
|
+
/**
|
|
4
|
+
* Default roles to seed on first run
|
|
5
|
+
*/
|
|
6
|
+
var DEFAULT_ROLES = [
|
|
7
|
+
{
|
|
8
|
+
_id: "admin",
|
|
9
|
+
id: "admin",
|
|
10
|
+
name: "Admin",
|
|
11
|
+
isAdmin: true,
|
|
12
|
+
defaultPermissions: {
|
|
13
|
+
read: true,
|
|
14
|
+
create: true,
|
|
15
|
+
edit: true,
|
|
16
|
+
delete: true
|
|
17
|
+
},
|
|
18
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
_id: "editor",
|
|
22
|
+
id: "editor",
|
|
23
|
+
name: "Editor",
|
|
24
|
+
isAdmin: false,
|
|
25
|
+
defaultPermissions: {
|
|
26
|
+
read: true,
|
|
27
|
+
create: true,
|
|
28
|
+
edit: true,
|
|
29
|
+
delete: true
|
|
30
|
+
},
|
|
31
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
_id: "viewer",
|
|
35
|
+
id: "viewer",
|
|
36
|
+
name: "Viewer",
|
|
37
|
+
isAdmin: false,
|
|
38
|
+
defaultPermissions: {
|
|
39
|
+
read: true,
|
|
40
|
+
create: false,
|
|
41
|
+
edit: false,
|
|
42
|
+
delete: false
|
|
43
|
+
},
|
|
44
|
+
createdAt: /* @__PURE__ */ new Date()
|
|
45
|
+
}
|
|
46
|
+
];
|
|
47
|
+
async function ensureAuthCollectionsExist(db) {
|
|
48
|
+
logger.info("🔍 Checking MongoDB auth collections and indexes...");
|
|
49
|
+
try {
|
|
50
|
+
await db.collection("rebase_users").createIndex({ email: 1 }, { unique: true });
|
|
51
|
+
const identities = db.collection("rebase_user_identities");
|
|
52
|
+
await identities.createIndex({
|
|
53
|
+
provider: 1,
|
|
54
|
+
provider_id: 1
|
|
55
|
+
}, { unique: true });
|
|
56
|
+
await identities.createIndex({ user_id: 1 });
|
|
57
|
+
const userRoles = db.collection("rebase_user_roles");
|
|
58
|
+
await userRoles.createIndex({
|
|
59
|
+
user_id: 1,
|
|
60
|
+
role_id: 1
|
|
61
|
+
}, { unique: true });
|
|
62
|
+
await userRoles.createIndex({ user_id: 1 });
|
|
63
|
+
const refreshTokens = db.collection("rebase_refresh_tokens");
|
|
64
|
+
await refreshTokens.createIndex({ token_hash: 1 }, { unique: true });
|
|
65
|
+
await refreshTokens.createIndex({
|
|
66
|
+
user_id: 1,
|
|
67
|
+
user_agent: 1,
|
|
68
|
+
ip_address: 1
|
|
69
|
+
}, { unique: true });
|
|
70
|
+
await refreshTokens.createIndex({ user_id: 1 });
|
|
71
|
+
const resetTokens = db.collection("rebase_password_reset_tokens");
|
|
72
|
+
await resetTokens.createIndex({ token_hash: 1 }, { unique: true });
|
|
73
|
+
await resetTokens.createIndex({ user_id: 1 });
|
|
74
|
+
await seedDefaultRoles(db);
|
|
75
|
+
logger.info("✅ MongoDB Auth collections ready");
|
|
76
|
+
} catch (error) {
|
|
77
|
+
logger.error("❌ Failed to set up MongoDB auth collections", { error });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
async function seedDefaultRoles(db) {
|
|
81
|
+
const roles = db.collection("rebase_roles");
|
|
82
|
+
const count = await roles.countDocuments();
|
|
83
|
+
if (count > 0) {
|
|
84
|
+
logger.info(`📋 Found ${count} existing roles`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
logger.info("🌱 Seeding default roles...");
|
|
88
|
+
for (const role of DEFAULT_ROLES) await roles.updateOne({ id: role.id }, { $setOnInsert: role }, { upsert: true });
|
|
89
|
+
logger.info("✅ Default roles created: admin, editor, viewer");
|
|
90
|
+
}
|
|
91
|
+
//#endregion
|
|
92
|
+
export { ensureAuthCollectionsExist };
|
|
93
|
+
|
|
94
|
+
//# sourceMappingURL=ensure-collections-Bkx_O5CQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-collections-Bkx_O5CQ.js","names":[],"sources":["../src/auth/ensure-collections.ts"],"sourcesContent":["import { Db } from \"mongodb\";\nimport { logger } from \"@rebasepro/server\";\n\n/**\n * Default roles to seed on first run\n */\nconst DEFAULT_ROLES = [\n {\n _id: \"admin\",\n id: \"admin\",\n name: \"Admin\",\n isAdmin: true,\n defaultPermissions: { read: true,\ncreate: true,\nedit: true,\ndelete: true },\n createdAt: new Date()\n },\n {\n _id: \"editor\",\n id: \"editor\",\n name: \"Editor\",\n isAdmin: false,\n defaultPermissions: { read: true,\ncreate: true,\nedit: true,\ndelete: true },\n createdAt: new Date()\n },\n {\n _id: \"viewer\",\n id: \"viewer\",\n name: \"Viewer\",\n isAdmin: false,\n defaultPermissions: { read: true,\ncreate: false,\nedit: false,\ndelete: false },\n createdAt: new Date()\n }\n];\n\nexport async function ensureAuthCollectionsExist(db: Db): Promise<void> {\n logger.info(\"🔍 Checking MongoDB auth collections and indexes...\");\n\n try {\n // Users\n const users = db.collection(\"rebase_users\");\n await users.createIndex({ email: 1 }, { unique: true });\n\n // User Identities\n const identities = db.collection(\"rebase_user_identities\");\n await identities.createIndex({ provider: 1,\nprovider_id: 1 }, { unique: true });\n await identities.createIndex({ user_id: 1 });\n\n // User Roles (junction collection)\n const userRoles = db.collection(\"rebase_user_roles\");\n await userRoles.createIndex({ user_id: 1,\nrole_id: 1 }, { unique: true });\n await userRoles.createIndex({ user_id: 1 });\n\n // Refresh Tokens\n const refreshTokens = db.collection(\"rebase_refresh_tokens\");\n await refreshTokens.createIndex({ token_hash: 1 }, { unique: true });\n await refreshTokens.createIndex({ user_id: 1,\nuser_agent: 1,\nip_address: 1 }, { unique: true });\n await refreshTokens.createIndex({ user_id: 1 });\n\n // Password Reset Tokens\n const resetTokens = db.collection(\"rebase_password_reset_tokens\");\n await resetTokens.createIndex({ token_hash: 1 }, { unique: true });\n await resetTokens.createIndex({ user_id: 1 });\n\n // Seed roles\n await seedDefaultRoles(db);\n\n logger.info(\"✅ MongoDB Auth collections ready\");\n } catch (error) {\n logger.error(\"❌ Failed to set up MongoDB auth collections\", { error: error });\n }\n}\n\nasync function seedDefaultRoles(db: Db): Promise<void> {\n const roles = db.collection(\"rebase_roles\");\n const count = await roles.countDocuments();\n\n if (count > 0) {\n logger.info(`📋 Found ${count} existing roles`);\n return;\n }\n\n logger.info(\"🌱 Seeding default roles...\");\n\n for (const role of DEFAULT_ROLES) {\n await roles.updateOne(\n { id: role.id },\n { $setOnInsert: role },\n { upsert: true }\n );\n }\n\n logger.info(\"✅ Default roles created: admin, editor, viewer\");\n}\n"],"mappings":";;;;;AAMA,IAAM,gBAAgB;CAClB;EACI,KAAK;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACT,oBAAoB;GAAE,MAAM;GACpC,QAAQ;GACR,MAAM;GACN,QAAQ;EAAK;EACL,2BAAW,IAAI,KAAK;CACxB;CACA;EACI,KAAK;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACT,oBAAoB;GAAE,MAAM;GACpC,QAAQ;GACR,MAAM;GACN,QAAQ;EAAK;EACL,2BAAW,IAAI,KAAK;CACxB;CACA;EACI,KAAK;EACL,IAAI;EACJ,MAAM;EACN,SAAS;EACT,oBAAoB;GAAE,MAAM;GACpC,QAAQ;GACR,MAAM;GACN,QAAQ;EAAM;EACN,2BAAW,IAAI,KAAK;CACxB;AACJ;AAEA,eAAsB,2BAA2B,IAAuB;CACpE,OAAO,KAAK,qDAAqD;CAEjE,IAAI;EAGA,MADc,GAAG,WAAW,cACtB,EAAM,YAAY,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;EAGtD,MAAM,aAAa,GAAG,WAAW,wBAAwB;EACzD,MAAM,WAAW,YAAY;GAAE,UAAU;GACjD,aAAa;EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;EAC1B,MAAM,WAAW,YAAY,EAAE,SAAS,EAAE,CAAC;EAG3C,MAAM,YAAY,GAAG,WAAW,mBAAmB;EACnD,MAAM,UAAU,YAAY;GAAE,SAAS;GAC/C,SAAS;EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;EACtB,MAAM,UAAU,YAAY,EAAE,SAAS,EAAE,CAAC;EAG1C,MAAM,gBAAgB,GAAG,WAAW,uBAAuB;EAC3D,MAAM,cAAc,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;EACnE,MAAM,cAAc,YAAY;GAAE,SAAS;GACnD,YAAY;GACZ,YAAY;EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;EACzB,MAAM,cAAc,YAAY,EAAE,SAAS,EAAE,CAAC;EAG9C,MAAM,cAAc,GAAG,WAAW,8BAA8B;EAChE,MAAM,YAAY,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,QAAQ,KAAK,CAAC;EACjE,MAAM,YAAY,YAAY,EAAE,SAAS,EAAE,CAAC;EAG5C,MAAM,iBAAiB,EAAE;EAEzB,OAAO,KAAK,kCAAkC;CAClD,SAAS,OAAO;EACZ,OAAO,MAAM,+CAA+C,EAAS,MAAM,CAAC;CAChF;AACJ;AAEA,eAAe,iBAAiB,IAAuB;CACnD,MAAM,QAAQ,GAAG,WAAW,cAAc;CAC1C,MAAM,QAAQ,MAAM,MAAM,eAAe;CAEzC,IAAI,QAAQ,GAAG;EACX,OAAO,KAAK,YAAY,MAAM,gBAAgB;EAC9C;CACJ;CAEA,OAAO,KAAK,6BAA6B;CAEzC,KAAK,MAAM,QAAQ,eACf,MAAM,MAAM,UACR,EAAE,IAAI,KAAK,GAAG,GACd,EAAE,cAAc,KAAK,GACrB,EAAE,QAAQ,KAAK,CACnB;CAGJ,OAAO,KAAK,gDAAgD;AAChE"}
|