@samanhappy/mcphub 0.11.0 → 0.11.2

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 (64) hide show
  1. package/dist/controllers/configController.js +32 -5
  2. package/dist/controllers/configController.js.map +1 -1
  3. package/dist/controllers/oauthClientController.js +13 -13
  4. package/dist/controllers/oauthClientController.js.map +1 -1
  5. package/dist/controllers/oauthDynamicRegistrationController.js +9 -9
  6. package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
  7. package/dist/controllers/oauthServerController.js +1 -1
  8. package/dist/controllers/oauthServerController.js.map +1 -1
  9. package/dist/controllers/serverController.js +64 -36
  10. package/dist/controllers/serverController.js.map +1 -1
  11. package/dist/dao/DaoFactory.js +24 -0
  12. package/dist/dao/DaoFactory.js.map +1 -1
  13. package/dist/dao/DatabaseDaoFactory.js +18 -0
  14. package/dist/dao/DatabaseDaoFactory.js.map +1 -1
  15. package/dist/dao/OAuthClientDao.js +100 -0
  16. package/dist/dao/OAuthClientDao.js.map +1 -0
  17. package/dist/dao/OAuthClientDaoDbImpl.js +83 -0
  18. package/dist/dao/OAuthClientDaoDbImpl.js.map +1 -0
  19. package/dist/dao/OAuthTokenDao.js +161 -0
  20. package/dist/dao/OAuthTokenDao.js.map +1 -0
  21. package/dist/dao/OAuthTokenDaoDbImpl.js +92 -0
  22. package/dist/dao/OAuthTokenDaoDbImpl.js.map +1 -0
  23. package/dist/dao/index.js +4 -0
  24. package/dist/dao/index.js.map +1 -1
  25. package/dist/db/entities/OAuthClient.js +66 -0
  26. package/dist/db/entities/OAuthClient.js.map +1 -0
  27. package/dist/db/entities/OAuthToken.js +66 -0
  28. package/dist/db/entities/OAuthToken.js.map +1 -0
  29. package/dist/db/entities/index.js +13 -2
  30. package/dist/db/entities/index.js.map +1 -1
  31. package/dist/db/repositories/GroupRepository.js +2 -2
  32. package/dist/db/repositories/GroupRepository.js.map +1 -1
  33. package/dist/db/repositories/OAuthClientRepository.js +68 -0
  34. package/dist/db/repositories/OAuthClientRepository.js.map +1 -0
  35. package/dist/db/repositories/OAuthTokenRepository.js +159 -0
  36. package/dist/db/repositories/OAuthTokenRepository.js.map +1 -0
  37. package/dist/db/repositories/ServerRepository.js +3 -3
  38. package/dist/db/repositories/ServerRepository.js.map +1 -1
  39. package/dist/db/repositories/UserRepository.js +2 -2
  40. package/dist/db/repositories/UserRepository.js.map +1 -1
  41. package/dist/db/repositories/index.js +3 -1
  42. package/dist/db/repositories/index.js.map +1 -1
  43. package/dist/middlewares/auth.js +1 -1
  44. package/dist/middlewares/auth.js.map +1 -1
  45. package/dist/models/OAuth.js +90 -122
  46. package/dist/models/OAuth.js.map +1 -1
  47. package/dist/routes/index.js +2 -1
  48. package/dist/routes/index.js.map +1 -1
  49. package/dist/services/mcpService.js +32 -28
  50. package/dist/services/mcpService.js.map +1 -1
  51. package/dist/services/oauthServerService.js +8 -8
  52. package/dist/services/oauthServerService.js.map +1 -1
  53. package/dist/utils/migration.js +51 -0
  54. package/dist/utils/migration.js.map +1 -1
  55. package/dist/utils/oauthBearer.js +1 -1
  56. package/dist/utils/oauthBearer.js.map +1 -1
  57. package/frontend/dist/assets/index-1q8Sx-0q.js +251 -0
  58. package/frontend/dist/assets/index-1q8Sx-0q.js.map +1 -0
  59. package/frontend/dist/assets/index-DiAK1DFj.css +1 -0
  60. package/frontend/dist/index.html +2 -2
  61. package/package.json +3 -3
  62. package/frontend/dist/assets/index-CHCrTZNY.css +0 -1
  63. package/frontend/dist/assets/index-Dno2pywv.js +0 -251
  64. package/frontend/dist/assets/index-Dno2pywv.js.map +0 -1
@@ -0,0 +1,92 @@
1
+ import { OAuthTokenRepository } from '../db/repositories/OAuthTokenRepository.js';
2
+ /**
3
+ * Database-backed implementation of OAuthTokenDao
4
+ */
5
+ export class OAuthTokenDaoDbImpl {
6
+ constructor() {
7
+ this.repository = new OAuthTokenRepository();
8
+ }
9
+ async findAll() {
10
+ const tokens = await this.repository.findAll();
11
+ return tokens.map((t) => this.mapToOAuthToken(t));
12
+ }
13
+ async findById(accessToken) {
14
+ const token = await this.repository.findByAccessToken(accessToken);
15
+ return token ? this.mapToOAuthToken(token) : null;
16
+ }
17
+ async findByAccessToken(accessToken) {
18
+ return this.findById(accessToken);
19
+ }
20
+ async findByRefreshToken(refreshToken) {
21
+ const token = await this.repository.findByRefreshToken(refreshToken);
22
+ return token ? this.mapToOAuthToken(token) : null;
23
+ }
24
+ async findByClientId(clientId) {
25
+ const tokens = await this.repository.findByClientId(clientId);
26
+ return tokens.map((t) => this.mapToOAuthToken(t));
27
+ }
28
+ async findByUsername(username) {
29
+ const tokens = await this.repository.findByUsername(username);
30
+ return tokens.map((t) => this.mapToOAuthToken(t));
31
+ }
32
+ async create(entity) {
33
+ const token = await this.repository.create({
34
+ accessToken: entity.accessToken,
35
+ accessTokenExpiresAt: entity.accessTokenExpiresAt,
36
+ refreshToken: entity.refreshToken,
37
+ refreshTokenExpiresAt: entity.refreshTokenExpiresAt,
38
+ scope: entity.scope,
39
+ clientId: entity.clientId,
40
+ username: entity.username,
41
+ });
42
+ return this.mapToOAuthToken(token);
43
+ }
44
+ async update(accessToken, entity) {
45
+ const token = await this.repository.update(accessToken, {
46
+ accessTokenExpiresAt: entity.accessTokenExpiresAt,
47
+ refreshToken: entity.refreshToken,
48
+ refreshTokenExpiresAt: entity.refreshTokenExpiresAt,
49
+ scope: entity.scope,
50
+ });
51
+ return token ? this.mapToOAuthToken(token) : null;
52
+ }
53
+ async delete(accessToken) {
54
+ return await this.repository.delete(accessToken);
55
+ }
56
+ async exists(accessToken) {
57
+ return await this.repository.exists(accessToken);
58
+ }
59
+ async count() {
60
+ return await this.repository.count();
61
+ }
62
+ async revokeToken(token) {
63
+ return await this.repository.revokeToken(token);
64
+ }
65
+ async revokeUserTokens(username) {
66
+ return await this.repository.revokeUserTokens(username);
67
+ }
68
+ async revokeClientTokens(clientId) {
69
+ return await this.repository.revokeClientTokens(clientId);
70
+ }
71
+ async cleanupExpired() {
72
+ return await this.repository.cleanupExpired();
73
+ }
74
+ async isAccessTokenValid(accessToken) {
75
+ return await this.repository.isAccessTokenValid(accessToken);
76
+ }
77
+ async isRefreshTokenValid(refreshToken) {
78
+ return await this.repository.isRefreshTokenValid(refreshToken);
79
+ }
80
+ mapToOAuthToken(token) {
81
+ return {
82
+ accessToken: token.accessToken,
83
+ accessTokenExpiresAt: token.accessTokenExpiresAt,
84
+ refreshToken: token.refreshToken,
85
+ refreshTokenExpiresAt: token.refreshTokenExpiresAt,
86
+ scope: token.scope,
87
+ clientId: token.clientId,
88
+ username: token.username,
89
+ };
90
+ }
91
+ }
92
+ //# sourceMappingURL=OAuthTokenDaoDbImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthTokenDaoDbImpl.js","sourceRoot":"","sources":["../../src/dao/OAuthTokenDaoDbImpl.ts"],"names":[],"mappings":"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"}
package/dist/dao/index.js CHANGED
@@ -6,12 +6,16 @@ export * from './ServerDao.js';
6
6
  export * from './GroupDao.js';
7
7
  export * from './SystemConfigDao.js';
8
8
  export * from './UserConfigDao.js';
9
+ export * from './OAuthClientDao.js';
10
+ export * from './OAuthTokenDao.js';
9
11
  // Export database implementations
10
12
  export * from './UserDaoDbImpl.js';
11
13
  export * from './ServerDaoDbImpl.js';
12
14
  export * from './GroupDaoDbImpl.js';
13
15
  export * from './SystemConfigDaoDbImpl.js';
14
16
  export * from './UserConfigDaoDbImpl.js';
17
+ export * from './OAuthClientDaoDbImpl.js';
18
+ export * from './OAuthTokenDaoDbImpl.js';
15
19
  // Export the DAO factory and convenience functions
16
20
  export * from './DaoFactory.js';
17
21
  export * from './DatabaseDaoFactory.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dao/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AAEnC,kCAAkC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAEzC,mDAAmD;AACnD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dao/index.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,cAAc,mBAAmB,CAAC;AAClC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,sBAAsB,CAAC;AACrC,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC;AAEnC,kCAAkC;AAClC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC;AACpC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AACzC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AAEzC,mDAAmD;AACnD,cAAc,iBAAiB,CAAC;AAChC,cAAc,yBAAyB,CAAC"}
@@ -0,0 +1,66 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, } from 'typeorm';
11
+ /**
12
+ * OAuth Client entity for database storage
13
+ * Represents OAuth clients registered with MCPHub's authorization server
14
+ */
15
+ let OAuthClient = class OAuthClient {
16
+ };
17
+ __decorate([
18
+ PrimaryGeneratedColumn('uuid'),
19
+ __metadata("design:type", String)
20
+ ], OAuthClient.prototype, "id", void 0);
21
+ __decorate([
22
+ Column({ name: 'client_id', type: 'varchar', length: 255, unique: true }),
23
+ __metadata("design:type", String)
24
+ ], OAuthClient.prototype, "clientId", void 0);
25
+ __decorate([
26
+ Column({ name: 'client_secret', type: 'varchar', length: 255, nullable: true }),
27
+ __metadata("design:type", String)
28
+ ], OAuthClient.prototype, "clientSecret", void 0);
29
+ __decorate([
30
+ Column({ type: 'varchar', length: 255 }),
31
+ __metadata("design:type", String)
32
+ ], OAuthClient.prototype, "name", void 0);
33
+ __decorate([
34
+ Column({ name: 'redirect_uris', type: 'simple-json' }),
35
+ __metadata("design:type", Array)
36
+ ], OAuthClient.prototype, "redirectUris", void 0);
37
+ __decorate([
38
+ Column({ type: 'simple-json' }),
39
+ __metadata("design:type", Array)
40
+ ], OAuthClient.prototype, "grants", void 0);
41
+ __decorate([
42
+ Column({ type: 'simple-json', nullable: true }),
43
+ __metadata("design:type", Array)
44
+ ], OAuthClient.prototype, "scopes", void 0);
45
+ __decorate([
46
+ Column({ type: 'varchar', length: 255, nullable: true }),
47
+ __metadata("design:type", String)
48
+ ], OAuthClient.prototype, "owner", void 0);
49
+ __decorate([
50
+ Column({ type: 'simple-json', nullable: true }),
51
+ __metadata("design:type", Object)
52
+ ], OAuthClient.prototype, "metadata", void 0);
53
+ __decorate([
54
+ CreateDateColumn({ name: 'created_at', type: 'timestamp' }),
55
+ __metadata("design:type", Date)
56
+ ], OAuthClient.prototype, "createdAt", void 0);
57
+ __decorate([
58
+ UpdateDateColumn({ name: 'updated_at', type: 'timestamp' }),
59
+ __metadata("design:type", Date)
60
+ ], OAuthClient.prototype, "updatedAt", void 0);
61
+ OAuthClient = __decorate([
62
+ Entity({ name: 'oauth_clients' })
63
+ ], OAuthClient);
64
+ export { OAuthClient };
65
+ export default OAuthClient;
66
+ //# sourceMappingURL=OAuthClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthClient.js","sourceRoot":"","sources":["../../../src/db/entities/OAuthClient.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AAEI,IAAM,WAAW,GAAjB,MAAM,WAAW;CA4CvB,CAAA;AA1CC;IADC,sBAAsB,CAAC,MAAM,CAAC;;uCACpB;AAGX;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;6CACzD;AAGjB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;iDAC1D;AAGtB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;yCAC5B;AAGb;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;iDAChC;AAGvB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;;2CACf;AAGjB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CAC9B;AAGlB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CAC1C;AAGf;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;6CAY9C;AAGF;IADC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACjD,IAAI;8CAAC;AAGhB;IADC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACjD,IAAI;8CAAC;AA3CL,WAAW;IADvB,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,CAAC;GACrB,WAAW,CA4CvB;;AAED,eAAe,WAAW,CAAC"}
@@ -0,0 +1,66 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ var __metadata = (this && this.__metadata) || function (k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ };
10
+ import { Entity, Column, PrimaryGeneratedColumn, CreateDateColumn, UpdateDateColumn, Index, } from 'typeorm';
11
+ /**
12
+ * OAuth Token entity for database storage
13
+ * Represents OAuth tokens issued by MCPHub's authorization server
14
+ */
15
+ let OAuthToken = class OAuthToken {
16
+ };
17
+ __decorate([
18
+ PrimaryGeneratedColumn('uuid'),
19
+ __metadata("design:type", String)
20
+ ], OAuthToken.prototype, "id", void 0);
21
+ __decorate([
22
+ Index(),
23
+ Column({ name: 'access_token', type: 'varchar', length: 512, unique: true }),
24
+ __metadata("design:type", String)
25
+ ], OAuthToken.prototype, "accessToken", void 0);
26
+ __decorate([
27
+ Column({ name: 'access_token_expires_at', type: 'timestamp' }),
28
+ __metadata("design:type", Date)
29
+ ], OAuthToken.prototype, "accessTokenExpiresAt", void 0);
30
+ __decorate([
31
+ Index(),
32
+ Column({ name: 'refresh_token', type: 'varchar', length: 512, nullable: true, unique: true }),
33
+ __metadata("design:type", String)
34
+ ], OAuthToken.prototype, "refreshToken", void 0);
35
+ __decorate([
36
+ Column({ name: 'refresh_token_expires_at', type: 'timestamp', nullable: true }),
37
+ __metadata("design:type", Date)
38
+ ], OAuthToken.prototype, "refreshTokenExpiresAt", void 0);
39
+ __decorate([
40
+ Column({ type: 'varchar', length: 512, nullable: true }),
41
+ __metadata("design:type", String)
42
+ ], OAuthToken.prototype, "scope", void 0);
43
+ __decorate([
44
+ Index(),
45
+ Column({ name: 'client_id', type: 'varchar', length: 255 }),
46
+ __metadata("design:type", String)
47
+ ], OAuthToken.prototype, "clientId", void 0);
48
+ __decorate([
49
+ Index(),
50
+ Column({ type: 'varchar', length: 255 }),
51
+ __metadata("design:type", String)
52
+ ], OAuthToken.prototype, "username", void 0);
53
+ __decorate([
54
+ CreateDateColumn({ name: 'created_at', type: 'timestamp' }),
55
+ __metadata("design:type", Date)
56
+ ], OAuthToken.prototype, "createdAt", void 0);
57
+ __decorate([
58
+ UpdateDateColumn({ name: 'updated_at', type: 'timestamp' }),
59
+ __metadata("design:type", Date)
60
+ ], OAuthToken.prototype, "updatedAt", void 0);
61
+ OAuthToken = __decorate([
62
+ Entity({ name: 'oauth_tokens' })
63
+ ], OAuthToken);
64
+ export { OAuthToken };
65
+ export default OAuthToken;
66
+ //# sourceMappingURL=OAuthToken.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthToken.js","sourceRoot":"","sources":["../../../src/db/entities/OAuthToken.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EACL,MAAM,EACN,MAAM,EACN,sBAAsB,EACtB,gBAAgB,EAChB,gBAAgB,EAChB,KAAK,GACN,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AAEI,IAAM,UAAU,GAAhB,MAAM,UAAU;CAkCtB,CAAA;AAhCC;IADC,sBAAsB,CAAC,MAAM,CAAC;;sCACpB;AAIX;IAFC,KAAK,EAAE;IACP,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;+CACzD;AAGpB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,yBAAyB,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACzC,IAAI;wDAAC;AAI3B;IAFC,KAAK,EAAE;IACP,MAAM,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;gDACxE;AAGtB;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,0BAA0B,EAAE,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;8BACxD,IAAI;yDAAC;AAG7B;IADC,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCAC1C;AAIf;IAFC,KAAK,EAAE;IACP,MAAM,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CAC3C;AAIjB;IAFC,KAAK,EAAE;IACP,MAAM,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;;4CACxB;AAGjB;IADC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACjD,IAAI;6CAAC;AAGhB;IADC,gBAAgB,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC;8BACjD,IAAI;6CAAC;AAjCL,UAAU;IADtB,MAAM,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,CAAC;GACpB,UAAU,CAkCtB;;AAED,eAAe,UAAU,CAAC"}
@@ -4,8 +4,19 @@ import Server from './Server.js';
4
4
  import Group from './Group.js';
5
5
  import SystemConfig from './SystemConfig.js';
6
6
  import UserConfig from './UserConfig.js';
7
+ import OAuthClient from './OAuthClient.js';
8
+ import OAuthToken from './OAuthToken.js';
7
9
  // Export all entities
8
- export default [VectorEmbedding, User, Server, Group, SystemConfig, UserConfig];
10
+ export default [
11
+ VectorEmbedding,
12
+ User,
13
+ Server,
14
+ Group,
15
+ SystemConfig,
16
+ UserConfig,
17
+ OAuthClient,
18
+ OAuthToken,
19
+ ];
9
20
  // Export individual entities for direct use
10
- export { VectorEmbedding, User, Server, Group, SystemConfig, UserConfig };
21
+ export { VectorEmbedding, User, Server, Group, SystemConfig, UserConfig, OAuthClient, OAuthToken };
11
22
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,sBAAsB;AACtB,eAAe,CAAC,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,CAAC,CAAC;AAEhF,4CAA4C;AAC5C,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/entities/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,KAAK,MAAM,YAAY,CAAC;AAC/B,OAAO,YAAY,MAAM,mBAAmB,CAAC;AAC7C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AACzC,OAAO,WAAW,MAAM,kBAAkB,CAAC;AAC3C,OAAO,UAAU,MAAM,iBAAiB,CAAC;AAEzC,sBAAsB;AACtB,eAAe;IACb,eAAe;IACf,IAAI;IACJ,MAAM;IACN,KAAK;IACL,YAAY;IACZ,UAAU;IACV,WAAW;IACX,UAAU;CACX,CAAC;AAEF,4CAA4C;AAC5C,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,CAAC"}
@@ -11,7 +11,7 @@ export class GroupRepository {
11
11
  * Find all groups
12
12
  */
13
13
  async findAll() {
14
- return await this.repository.find();
14
+ return await this.repository.find({ order: { createdAt: 'ASC' } });
15
15
  }
16
16
  /**
17
17
  * Find group by ID
@@ -74,7 +74,7 @@ export class GroupRepository {
74
74
  * Find groups by owner
75
75
  */
76
76
  async findByOwner(owner) {
77
- return await this.repository.find({ where: { owner } });
77
+ return await this.repository.find({ where: { owner }, order: { createdAt: 'ASC' } });
78
78
  }
79
79
  }
80
80
  export default GroupRepository;
@@ -1 +1 @@
1
- {"version":3,"file":"GroupRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/GroupRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,eAAe;IAG1B;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAoD;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,SAAyB;QAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;CACF;AAED,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"GroupRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/GroupRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC7C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,eAAe;IAG1B;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAoD;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU,EAAE,SAAyB;QAChD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;QACtC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpD,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,EAAU;QACrB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC7D,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,YAAY,CAAC,IAAY;QAC7B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;CACF;AAED,eAAe,eAAe,CAAC"}
@@ -0,0 +1,68 @@
1
+ import { OAuthClient } from '../entities/OAuthClient.js';
2
+ import { getAppDataSource } from '../connection.js';
3
+ /**
4
+ * Repository for OAuthClient entity
5
+ */
6
+ export class OAuthClientRepository {
7
+ constructor() {
8
+ this.repository = getAppDataSource().getRepository(OAuthClient);
9
+ }
10
+ /**
11
+ * Find all OAuth clients
12
+ */
13
+ async findAll() {
14
+ return await this.repository.find();
15
+ }
16
+ /**
17
+ * Find OAuth client by client ID
18
+ */
19
+ async findByClientId(clientId) {
20
+ return await this.repository.findOne({ where: { clientId } });
21
+ }
22
+ /**
23
+ * Find OAuth clients by owner
24
+ */
25
+ async findByOwner(owner) {
26
+ return await this.repository.find({ where: { owner } });
27
+ }
28
+ /**
29
+ * Create a new OAuth client
30
+ */
31
+ async create(client) {
32
+ const newClient = this.repository.create(client);
33
+ return await this.repository.save(newClient);
34
+ }
35
+ /**
36
+ * Update an existing OAuth client
37
+ */
38
+ async update(clientId, clientData) {
39
+ const client = await this.findByClientId(clientId);
40
+ if (!client) {
41
+ return null;
42
+ }
43
+ const updated = this.repository.merge(client, clientData);
44
+ return await this.repository.save(updated);
45
+ }
46
+ /**
47
+ * Delete an OAuth client
48
+ */
49
+ async delete(clientId) {
50
+ const result = await this.repository.delete({ clientId });
51
+ return (result.affected ?? 0) > 0;
52
+ }
53
+ /**
54
+ * Check if OAuth client exists
55
+ */
56
+ async exists(clientId) {
57
+ const count = await this.repository.count({ where: { clientId } });
58
+ return count > 0;
59
+ }
60
+ /**
61
+ * Count total OAuth clients
62
+ */
63
+ async count() {
64
+ return await this.repository.count();
65
+ }
66
+ }
67
+ export default OAuthClientRepository;
68
+ //# sourceMappingURL=OAuthClientRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthClientRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/OAuthClientRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,qBAAqB;IAGhC;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAA2D;QACtE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,UAAgC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;CACF;AAED,eAAe,qBAAqB,CAAC"}
@@ -0,0 +1,159 @@
1
+ import { MoreThan } from 'typeorm';
2
+ import { OAuthToken } from '../entities/OAuthToken.js';
3
+ import { getAppDataSource } from '../connection.js';
4
+ /**
5
+ * Repository for OAuthToken entity
6
+ */
7
+ export class OAuthTokenRepository {
8
+ constructor() {
9
+ this.repository = getAppDataSource().getRepository(OAuthToken);
10
+ }
11
+ /**
12
+ * Find all OAuth tokens
13
+ */
14
+ async findAll() {
15
+ return await this.repository.find();
16
+ }
17
+ /**
18
+ * Find OAuth token by access token
19
+ */
20
+ async findByAccessToken(accessToken) {
21
+ return await this.repository.findOne({ where: { accessToken } });
22
+ }
23
+ /**
24
+ * Find OAuth token by refresh token
25
+ */
26
+ async findByRefreshToken(refreshToken) {
27
+ return await this.repository.findOne({ where: { refreshToken } });
28
+ }
29
+ /**
30
+ * Find OAuth tokens by client ID
31
+ */
32
+ async findByClientId(clientId) {
33
+ return await this.repository.find({ where: { clientId } });
34
+ }
35
+ /**
36
+ * Find OAuth tokens by username
37
+ */
38
+ async findByUsername(username) {
39
+ return await this.repository.find({ where: { username } });
40
+ }
41
+ /**
42
+ * Create a new OAuth token
43
+ */
44
+ async create(token) {
45
+ // Remove any existing tokens with the same access token or refresh token
46
+ if (token.accessToken) {
47
+ await this.repository.delete({ accessToken: token.accessToken });
48
+ }
49
+ if (token.refreshToken) {
50
+ await this.repository.delete({ refreshToken: token.refreshToken });
51
+ }
52
+ const newToken = this.repository.create(token);
53
+ return await this.repository.save(newToken);
54
+ }
55
+ /**
56
+ * Update an existing OAuth token
57
+ */
58
+ async update(accessToken, tokenData) {
59
+ const token = await this.findByAccessToken(accessToken);
60
+ if (!token) {
61
+ return null;
62
+ }
63
+ const updated = this.repository.merge(token, tokenData);
64
+ return await this.repository.save(updated);
65
+ }
66
+ /**
67
+ * Delete an OAuth token by access token
68
+ */
69
+ async delete(accessToken) {
70
+ const result = await this.repository.delete({ accessToken });
71
+ return (result.affected ?? 0) > 0;
72
+ }
73
+ /**
74
+ * Check if OAuth token exists by access token
75
+ */
76
+ async exists(accessToken) {
77
+ const count = await this.repository.count({ where: { accessToken } });
78
+ return count > 0;
79
+ }
80
+ /**
81
+ * Count total OAuth tokens
82
+ */
83
+ async count() {
84
+ return await this.repository.count();
85
+ }
86
+ /**
87
+ * Revoke token by access token or refresh token
88
+ */
89
+ async revokeToken(token) {
90
+ // Try to find by access token first
91
+ let tokenEntity = await this.findByAccessToken(token);
92
+ if (!tokenEntity) {
93
+ // Try to find by refresh token
94
+ tokenEntity = await this.findByRefreshToken(token);
95
+ }
96
+ if (!tokenEntity) {
97
+ return false;
98
+ }
99
+ const result = await this.repository.delete({ id: tokenEntity.id });
100
+ return (result.affected ?? 0) > 0;
101
+ }
102
+ /**
103
+ * Revoke all tokens for a user
104
+ */
105
+ async revokeUserTokens(username) {
106
+ const result = await this.repository.delete({ username });
107
+ return result.affected ?? 0;
108
+ }
109
+ /**
110
+ * Revoke all tokens for a client
111
+ */
112
+ async revokeClientTokens(clientId) {
113
+ const result = await this.repository.delete({ clientId });
114
+ return result.affected ?? 0;
115
+ }
116
+ /**
117
+ * Clean up expired tokens
118
+ */
119
+ async cleanupExpired() {
120
+ const now = new Date();
121
+ // Delete tokens where both access token and refresh token are expired
122
+ // (or refresh token doesn't exist)
123
+ const result = await this.repository
124
+ .createQueryBuilder()
125
+ .delete()
126
+ .from(OAuthToken)
127
+ .where('access_token_expires_at < :now', { now })
128
+ .andWhere('(refresh_token_expires_at IS NULL OR refresh_token_expires_at < :now)', { now })
129
+ .execute();
130
+ return result.affected ?? 0;
131
+ }
132
+ /**
133
+ * Check if access token is valid (exists and not expired)
134
+ */
135
+ async isAccessTokenValid(accessToken) {
136
+ const count = await this.repository.count({
137
+ where: {
138
+ accessToken,
139
+ accessTokenExpiresAt: MoreThan(new Date()),
140
+ },
141
+ });
142
+ return count > 0;
143
+ }
144
+ /**
145
+ * Check if refresh token is valid (exists and not expired)
146
+ */
147
+ async isRefreshTokenValid(refreshToken) {
148
+ const token = await this.findByRefreshToken(refreshToken);
149
+ if (!token) {
150
+ return false;
151
+ }
152
+ if (!token.refreshTokenExpiresAt) {
153
+ return true; // No expiration means always valid
154
+ }
155
+ return token.refreshTokenExpiresAt > new Date();
156
+ }
157
+ }
158
+ export default OAuthTokenRepository;
159
+ //# sourceMappingURL=OAuthTokenRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OAuthTokenRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/OAuthTokenRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,oBAAoB;IAG/B;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACjE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;IACnE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,YAAoB;QAC3C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;IACpE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,KAAyD;QACpE,yEAAyE;QACzE,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,KAAK,CAAC,YAAY,EAAE,CAAC;YACvB,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACrE,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB,EAAE,SAA8B;QAC9D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACxD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACxD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;QAC7D,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,WAAmB;QAC9B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;QACtE,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,oCAAoC;QACpC,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACtD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,+BAA+B;YAC/B,WAAW,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;QACrD,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,WAAW,CAAC,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAAC,QAAgB;QACrC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,QAAgB;QACvC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1D,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc;QAClB,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QAEvB,sEAAsE;QACtE,mCAAmC;QACnC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU;aACjC,kBAAkB,EAAE;aACpB,MAAM,EAAE;aACR,IAAI,CAAC,UAAU,CAAC;aAChB,KAAK,CAAC,gCAAgC,EAAE,EAAE,GAAG,EAAE,CAAC;aAChD,QAAQ,CAAC,uEAAuE,EAAE,EAAE,GAAG,EAAE,CAAC;aAC1F,OAAO,EAAE,CAAC;QAEb,OAAO,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC;IAC9B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,WAAmB;QAC1C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;YACxC,KAAK,EAAE;gBACL,WAAW;gBACX,oBAAoB,EAAE,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;aAC3C;SACF,CAAC,CAAC;QACH,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,mBAAmB,CAAC,YAAoB;QAC5C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,YAAY,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC;YACjC,OAAO,IAAI,CAAC,CAAC,mCAAmC;QAClD,CAAC;QACD,OAAO,KAAK,CAAC,qBAAqB,GAAG,IAAI,IAAI,EAAE,CAAC;IAClD,CAAC;CACF;AAED,eAAe,oBAAoB,CAAC"}
@@ -11,7 +11,7 @@ export class ServerRepository {
11
11
  * Find all servers
12
12
  */
13
13
  async findAll() {
14
- return await this.repository.find();
14
+ return await this.repository.find({ order: { createdAt: 'ASC' } });
15
15
  }
16
16
  /**
17
17
  * Find server by name
@@ -61,13 +61,13 @@ export class ServerRepository {
61
61
  * Find servers by owner
62
62
  */
63
63
  async findByOwner(owner) {
64
- return await this.repository.find({ where: { owner } });
64
+ return await this.repository.find({ where: { owner }, order: { createdAt: 'ASC' } });
65
65
  }
66
66
  /**
67
67
  * Find enabled servers
68
68
  */
69
69
  async findEnabled() {
70
- return await this.repository.find({ where: { enabled: true } });
70
+ return await this.repository.find({ where: { enabled: true }, order: { createdAt: 'ASC' } });
71
71
  }
72
72
  /**
73
73
  * Set server enabled status
@@ -1 +1 @@
1
- {"version":3,"file":"ServerRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/ServerRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAG3B;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAsD;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,UAA2B;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAgB;QAC7C,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"ServerRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/ServerRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,gBAAgB;IAG3B;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY;QAC3B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,MAAsD;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACjD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY,EAAE,UAA2B;QACpD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC3C,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC1D,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAY;QACvB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/D,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,KAAa;QAC7B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW;QACf,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU,CAAC,IAAY,EAAE,OAAgB;QAC7C,OAAO,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;CACF;AAED,eAAe,gBAAgB,CAAC"}
@@ -11,7 +11,7 @@ export class UserRepository {
11
11
  * Find all users
12
12
  */
13
13
  async findAll() {
14
- return await this.repository.find();
14
+ return await this.repository.find({ order: { createdAt: 'ASC' } });
15
15
  }
16
16
  /**
17
17
  * Find user by username
@@ -61,7 +61,7 @@ export class UserRepository {
61
61
  * Find all admin users
62
62
  */
63
63
  async findAdmins() {
64
- return await this.repository.find({ where: { isAdmin: true } });
64
+ return await this.repository.find({ where: { isAdmin: true }, order: { createdAt: 'ASC' } });
65
65
  }
66
66
  }
67
67
  export default UserRepository;
@@ -1 +1 @@
1
- {"version":3,"file":"UserRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/UserRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,cAAc;IAGzB;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAkD;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,QAAuB;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;IAClE,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"UserRepository.js","sourceRoot":"","sources":["../../../src/db/repositories/UserRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEpD;;GAEG;AACH,MAAM,OAAO,cAAc;IAGzB;QACE,IAAI,CAAC,UAAU,GAAG,gBAAgB,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC3D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,OAAO;QACX,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IACrE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;IAChE,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,IAAkD;QAC7D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB,EAAE,QAAuB;QACpD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtD,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;QAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,MAAM,CAAC,QAAgB;QAC3B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC;QACnE,OAAO,KAAK,GAAG,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;IAC/F,CAAC;CACF;AAED,eAAe,cAAc,CAAC"}
@@ -4,6 +4,8 @@ import { ServerRepository } from './ServerRepository.js';
4
4
  import { GroupRepository } from './GroupRepository.js';
5
5
  import { SystemConfigRepository } from './SystemConfigRepository.js';
6
6
  import { UserConfigRepository } from './UserConfigRepository.js';
7
+ import { OAuthClientRepository } from './OAuthClientRepository.js';
8
+ import { OAuthTokenRepository } from './OAuthTokenRepository.js';
7
9
  // Export all repositories
8
- export { VectorEmbeddingRepository, UserRepository, ServerRepository, GroupRepository, SystemConfigRepository, UserConfigRepository, };
10
+ export { VectorEmbeddingRepository, UserRepository, ServerRepository, GroupRepository, SystemConfigRepository, UserConfigRepository, OAuthClientRepository, OAuthTokenRepository, };
9
11
  //# sourceMappingURL=index.js.map