@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.
- package/dist/controllers/configController.js +32 -5
- package/dist/controllers/configController.js.map +1 -1
- package/dist/controllers/oauthClientController.js +13 -13
- package/dist/controllers/oauthClientController.js.map +1 -1
- package/dist/controllers/oauthDynamicRegistrationController.js +9 -9
- package/dist/controllers/oauthDynamicRegistrationController.js.map +1 -1
- package/dist/controllers/oauthServerController.js +1 -1
- package/dist/controllers/oauthServerController.js.map +1 -1
- package/dist/controllers/serverController.js +64 -36
- package/dist/controllers/serverController.js.map +1 -1
- package/dist/dao/DaoFactory.js +24 -0
- package/dist/dao/DaoFactory.js.map +1 -1
- package/dist/dao/DatabaseDaoFactory.js +18 -0
- package/dist/dao/DatabaseDaoFactory.js.map +1 -1
- package/dist/dao/OAuthClientDao.js +100 -0
- package/dist/dao/OAuthClientDao.js.map +1 -0
- package/dist/dao/OAuthClientDaoDbImpl.js +83 -0
- package/dist/dao/OAuthClientDaoDbImpl.js.map +1 -0
- package/dist/dao/OAuthTokenDao.js +161 -0
- package/dist/dao/OAuthTokenDao.js.map +1 -0
- package/dist/dao/OAuthTokenDaoDbImpl.js +92 -0
- package/dist/dao/OAuthTokenDaoDbImpl.js.map +1 -0
- package/dist/dao/index.js +4 -0
- package/dist/dao/index.js.map +1 -1
- package/dist/db/entities/OAuthClient.js +66 -0
- package/dist/db/entities/OAuthClient.js.map +1 -0
- package/dist/db/entities/OAuthToken.js +66 -0
- package/dist/db/entities/OAuthToken.js.map +1 -0
- package/dist/db/entities/index.js +13 -2
- package/dist/db/entities/index.js.map +1 -1
- package/dist/db/repositories/GroupRepository.js +2 -2
- package/dist/db/repositories/GroupRepository.js.map +1 -1
- package/dist/db/repositories/OAuthClientRepository.js +68 -0
- package/dist/db/repositories/OAuthClientRepository.js.map +1 -0
- package/dist/db/repositories/OAuthTokenRepository.js +159 -0
- package/dist/db/repositories/OAuthTokenRepository.js.map +1 -0
- package/dist/db/repositories/ServerRepository.js +3 -3
- package/dist/db/repositories/ServerRepository.js.map +1 -1
- package/dist/db/repositories/UserRepository.js +2 -2
- package/dist/db/repositories/UserRepository.js.map +1 -1
- package/dist/db/repositories/index.js +3 -1
- package/dist/db/repositories/index.js.map +1 -1
- package/dist/middlewares/auth.js +1 -1
- package/dist/middlewares/auth.js.map +1 -1
- package/dist/models/OAuth.js +90 -122
- package/dist/models/OAuth.js.map +1 -1
- package/dist/routes/index.js +2 -1
- package/dist/routes/index.js.map +1 -1
- package/dist/services/mcpService.js +32 -28
- package/dist/services/mcpService.js.map +1 -1
- package/dist/services/oauthServerService.js +8 -8
- package/dist/services/oauthServerService.js.map +1 -1
- package/dist/utils/migration.js +51 -0
- package/dist/utils/migration.js.map +1 -1
- package/dist/utils/oauthBearer.js +1 -1
- package/dist/utils/oauthBearer.js.map +1 -1
- package/frontend/dist/assets/index-1q8Sx-0q.js +251 -0
- package/frontend/dist/assets/index-1q8Sx-0q.js.map +1 -0
- package/frontend/dist/assets/index-DiAK1DFj.css +1 -0
- package/frontend/dist/index.html +2 -2
- package/package.json +3 -3
- package/frontend/dist/assets/index-CHCrTZNY.css +0 -1
- package/frontend/dist/assets/index-Dno2pywv.js +0 -251
- 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';
|
package/dist/dao/index.js.map
CHANGED
|
@@ -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 [
|
|
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,
|
|
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;
|
|
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":"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"}
|
|
@@ -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;
|
|
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;
|
|
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
|