@drax/identity-back 0.5.1 → 0.5.3
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/TenantController.js +66 -0
- package/dist/graphql/resolvers/role.resolvers.js +1 -2
- package/dist/graphql/resolvers/tenant.resolvers.js +1 -2
- package/dist/graphql/resolvers/user-api-key.resolvers.js +1 -2
- package/dist/graphql/resolvers/user.resolvers.js +1 -1
- package/dist/index.js +7 -4
- package/dist/permissions/RolePermissions.js +11 -0
- package/dist/permissions/TenantPermissions.js +10 -0
- package/dist/permissions/UserApiKeyPermissions.js +11 -0
- package/dist/permissions/UserPermissions.js +10 -0
- package/dist/permissions/index.js +12 -0
- package/dist/rbac/Rbac.js +1 -1
- package/dist/repository/mongo/TenantMongoRepository.js +12 -0
- package/dist/repository/sqlite/TenantSqliteRepository.js +11 -0
- package/dist/routes/RoleRoutes.js +1 -2
- package/dist/routes/TenantRoutes.js +10 -181
- package/dist/routes/UserApiKeyRoutes.js +1 -2
- package/dist/routes/UserAvatarRoutes.js +1 -2
- package/dist/routes/UserRoutes.js +1 -2
- package/dist/services/TenantService.js +3 -1
- package/package.json +6 -5
- package/src/controllers/TenantController.ts +73 -0
- package/src/graphql/resolvers/role.resolvers.ts +1 -2
- package/src/graphql/resolvers/tenant.resolvers.ts +1 -2
- package/src/graphql/resolvers/user-api-key.resolvers.ts +1 -2
- package/src/graphql/resolvers/user.resolvers.ts +1 -1
- package/src/index.ts +12 -3
- package/src/permissions/IdentityPermissions.ts +1 -0
- package/src/permissions/RolePermissions.ts +12 -0
- package/src/permissions/TenantPermissions.ts +11 -0
- package/src/permissions/UserApiKeyPermissions.ts +12 -0
- package/src/permissions/UserPermissions.ts +11 -0
- package/src/permissions/index.ts +15 -0
- package/src/rbac/Rbac.ts +1 -1
- package/src/repository/mongo/TenantMongoRepository.ts +41 -16
- package/src/repository/sqlite/TenantSqliteRepository.ts +24 -1
- package/src/routes/RoleRoutes.ts +1 -2
- package/src/routes/TenantRoutes.ts +10 -164
- package/src/routes/UserApiKeyRoutes.ts +1 -2
- package/src/routes/UserAvatarRoutes.ts +1 -2
- package/src/routes/UserRoutes.ts +1 -2
- package/src/services/TenantService.ts +3 -1
- package/tsconfig.json +2 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/types/controllers/TenantController.d.ts +12 -0
- package/types/controllers/TenantController.d.ts.map +1 -0
- package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
- package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
- package/types/index.d.ts +6 -3
- package/types/index.d.ts.map +1 -1
- package/types/permissions/IdentityPermissions.d.ts.map +1 -1
- package/types/permissions/RolePermissions.d.ts +11 -0
- package/types/permissions/RolePermissions.d.ts.map +1 -0
- package/types/permissions/TenantPermissions.d.ts +10 -0
- package/types/permissions/TenantPermissions.d.ts.map +1 -0
- package/types/permissions/UserApiKeyPermissions.d.ts +11 -0
- package/types/permissions/UserApiKeyPermissions.d.ts.map +1 -0
- package/types/permissions/UserPermissions.d.ts +10 -0
- package/types/permissions/UserPermissions.d.ts.map +1 -0
- package/types/permissions/index.d.ts +14 -0
- package/types/permissions/index.d.ts.map +1 -0
- package/types/repository/mongo/TenantMongoRepository.d.ts +2 -1
- package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
- package/types/repository/sqlite/TenantSqliteRepository.d.ts +2 -1
- package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
- package/types/routes/RoleRoutes.d.ts.map +1 -1
- package/types/routes/TenantRoutes.d.ts.map +1 -1
- package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
- package/types/routes/UserAvatarRoutes.d.ts.map +1 -1
- package/types/routes/UserRoutes.d.ts.map +1 -1
- package/types/services/TenantService.d.ts +2 -1
- package/types/services/TenantService.d.ts.map +1 -1
- package/types/zod/UserZod.d.ts +6 -6
- package/dist/errors/UnauthorizedError.js +0 -10
- package/src/errors/UnauthorizedError.ts +0 -13
- package/types/errors/UnauthorizedError.d.ts +0 -6
- package/types/errors/UnauthorizedError.d.ts.map +0 -1
package/src/index.ts
CHANGED
|
@@ -21,9 +21,7 @@ import {jwtMiddleware} from "./middleware/jwtMiddleware.js";
|
|
|
21
21
|
import {rbacMiddleware} from "./middleware/rbacMiddleware.js";
|
|
22
22
|
import {apiKeyMiddleware} from "./middleware/apiKeyMiddleware.js";
|
|
23
23
|
|
|
24
|
-
import IdentityPermissions from "./permissions/IdentityPermissions.js";
|
|
25
24
|
import IdentityConfig from "./config/IdentityConfig.js";
|
|
26
|
-
import UnauthorizedError from "./errors/UnauthorizedError.js";
|
|
27
25
|
import BadCredentialsError from "./errors/BadCredentialsError.js";
|
|
28
26
|
|
|
29
27
|
import CreateUserIfNotExist from "./setup/CreateUserIfNotExist.js";
|
|
@@ -38,6 +36,14 @@ import type {IUserRepository} from "./interfaces/IUserRepository";
|
|
|
38
36
|
import type {IUserApiKeyRepository} from "./interfaces/IUserApiKeyRepository";
|
|
39
37
|
|
|
40
38
|
|
|
39
|
+
import IdentityPermissions from "./permissions/IdentityPermissions.js";
|
|
40
|
+
|
|
41
|
+
import {RolePermissions} from "./permissions/RolePermissions.js";
|
|
42
|
+
import {TenantPermissions} from "./permissions/TenantPermissions.js";
|
|
43
|
+
import {UserPermissions} from "./permissions/UserPermissions.js";
|
|
44
|
+
import {UserApiKeyPermissions} from "./permissions/UserApiKeyPermissions.js";
|
|
45
|
+
|
|
46
|
+
|
|
41
47
|
const graphqlMergeResult = await GraphqlMerge()
|
|
42
48
|
const identityTypeDefs = await graphqlMergeResult.typeDefs;
|
|
43
49
|
const identityResolvers = await graphqlMergeResult.resolvers;
|
|
@@ -83,12 +89,15 @@ export {
|
|
|
83
89
|
|
|
84
90
|
//Permissions
|
|
85
91
|
IdentityPermissions,
|
|
92
|
+
RolePermissions,
|
|
93
|
+
TenantPermissions,
|
|
94
|
+
UserPermissions,
|
|
95
|
+
UserApiKeyPermissions,
|
|
86
96
|
|
|
87
97
|
//Config
|
|
88
98
|
IdentityConfig,
|
|
89
99
|
|
|
90
100
|
//Errors
|
|
91
|
-
UnauthorizedError,
|
|
92
101
|
BadCredentialsError,
|
|
93
102
|
|
|
94
103
|
//Setup
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
enum RolePermissions {
|
|
2
|
+
Create = "role:create",
|
|
3
|
+
Update = "role:update",
|
|
4
|
+
Delete = "role:delete",
|
|
5
|
+
View = "role:view",
|
|
6
|
+
Manage = "role:manage",
|
|
7
|
+
Permissions = "role:permissions",
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default RolePermissions;
|
|
12
|
+
export {RolePermissions};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
enum UserApiKeyPermissions {
|
|
2
|
+
Create = "userApiKey:create",
|
|
3
|
+
Update = "userApiKey:update",
|
|
4
|
+
Delete = "userApiKey:delete",
|
|
5
|
+
View = "userApiKey:view",
|
|
6
|
+
ViewMy = "userApiKey:myView",
|
|
7
|
+
Manage = "userApiKey:manage",
|
|
8
|
+
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export default UserApiKeyPermissions;
|
|
12
|
+
export {UserApiKeyPermissions};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import TenantPermissions from './TenantPermissions';
|
|
2
|
+
import UserPermissions from './UserPermissions';
|
|
3
|
+
import RolePermissions from './RolePermissions';
|
|
4
|
+
import UserApiKeyPermissions from './UserApiKeyPermissions';
|
|
5
|
+
|
|
6
|
+
const permissions = {
|
|
7
|
+
...TenantPermissions,
|
|
8
|
+
...UserPermissions,
|
|
9
|
+
...RolePermissions,
|
|
10
|
+
...UserApiKeyPermissions
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export default permissions;
|
|
15
|
+
export {permissions};
|
package/src/rbac/Rbac.ts
CHANGED
|
@@ -1,55 +1,56 @@
|
|
|
1
1
|
import {TenantModel} from "../../models/TenantModel.js";
|
|
2
2
|
import {ITenantRepository} from '../../interfaces/ITenantRepository'
|
|
3
3
|
import {mongoose, MongooseSort, MongooseQueryFilter} from "@drax/common-back";
|
|
4
|
-
import {
|
|
4
|
+
import {PaginateOptions, PaginateResult} from "mongoose";
|
|
5
5
|
import {DeleteResult} from "mongodb";
|
|
6
|
-
import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
|
|
6
|
+
import {IDraxFindOptions, IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
|
|
7
7
|
import {ITenant, ITenantBase} from "@drax/identity-share";
|
|
8
8
|
|
|
9
|
-
class TenantMongoRepository implements ITenantRepository{
|
|
9
|
+
class TenantMongoRepository implements ITenantRepository {
|
|
10
10
|
|
|
11
11
|
async create(tenantData: ITenantBase): Promise<ITenant> {
|
|
12
|
-
const tenant
|
|
12
|
+
const tenant: mongoose.HydratedDocument<ITenant> = new TenantModel(tenantData)
|
|
13
13
|
await tenant.save()
|
|
14
14
|
return tenant
|
|
15
15
|
}
|
|
16
16
|
|
|
17
17
|
async update(id: string, tenantData: ITenantBase): Promise<ITenant> {
|
|
18
|
-
const tenant
|
|
18
|
+
const tenant: mongoose.HydratedDocument<ITenant> = await TenantModel.findOneAndUpdate({_id: id}, tenantData, {new: true}).exec()
|
|
19
19
|
return tenant
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
async delete(id: string): Promise<boolean> {
|
|
23
|
-
const result
|
|
23
|
+
const result: DeleteResult = await TenantModel.deleteOne({_id: id}).exec()
|
|
24
24
|
return result.deletedCount == 1
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
async findById(id: string): Promise<ITenant | null>{
|
|
27
|
+
async findById(id: string): Promise<ITenant | null> {
|
|
28
28
|
const tenant: mongoose.HydratedDocument<ITenant> | null = await TenantModel.findById(id).exec()
|
|
29
29
|
return tenant
|
|
30
30
|
}
|
|
31
31
|
|
|
32
|
-
async findByName(name: string): Promise<ITenant | null>{
|
|
32
|
+
async findByName(name: string): Promise<ITenant | null> {
|
|
33
33
|
const tenant: mongoose.HydratedDocument<ITenant> | null = await TenantModel.findOne({name}).exec()
|
|
34
34
|
return tenant
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
-
async fetchAll(): Promise<ITenant[]>{
|
|
37
|
+
async fetchAll(): Promise<ITenant[]> {
|
|
38
38
|
const tenants: mongoose.HydratedDocument<ITenant>[] = await TenantModel.find().exec()
|
|
39
39
|
return tenants
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
async paginate({
|
|
43
|
-
page= 1,
|
|
44
|
-
limit= 5,
|
|
45
|
-
orderBy= '',
|
|
46
|
-
order= false,
|
|
47
|
-
search= '',
|
|
48
|
-
filters= []
|
|
43
|
+
page = 1,
|
|
44
|
+
limit = 5,
|
|
45
|
+
orderBy = '',
|
|
46
|
+
order = false,
|
|
47
|
+
search = '',
|
|
48
|
+
filters = []
|
|
49
|
+
}: IDraxPaginateOptions): Promise<IDraxPaginateResult<ITenant>> {
|
|
49
50
|
|
|
50
51
|
const query = {}
|
|
51
52
|
|
|
52
|
-
if(search){
|
|
53
|
+
if (search) {
|
|
53
54
|
query['$or'] = [
|
|
54
55
|
{name: new RegExp(search, 'i')},
|
|
55
56
|
]
|
|
@@ -68,6 +69,30 @@ class TenantMongoRepository implements ITenantRepository{
|
|
|
68
69
|
items: tenants.docs
|
|
69
70
|
}
|
|
70
71
|
}
|
|
72
|
+
|
|
73
|
+
async find({
|
|
74
|
+
cursor = false,
|
|
75
|
+
limit = 0,
|
|
76
|
+
orderBy = '',
|
|
77
|
+
order = false,
|
|
78
|
+
search = '',
|
|
79
|
+
filters = []
|
|
80
|
+
}: IDraxFindOptions): Promise<ITenant[]> {
|
|
81
|
+
|
|
82
|
+
const query = {}
|
|
83
|
+
|
|
84
|
+
if (search) {
|
|
85
|
+
query['$or'] = [
|
|
86
|
+
{name: new RegExp(search, 'i')},
|
|
87
|
+
]
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
MongooseQueryFilter.applyFilters(query, filters)
|
|
91
|
+
|
|
92
|
+
const sort = MongooseSort.applySort(orderBy, order)
|
|
93
|
+
const items: ITenant[] = await TenantModel.find(query).sort(sort)
|
|
94
|
+
return items
|
|
95
|
+
}
|
|
71
96
|
}
|
|
72
97
|
|
|
73
98
|
export default TenantMongoRepository
|
|
@@ -3,7 +3,7 @@ import {ITenantRepository} from '../../interfaces/ITenantRepository'
|
|
|
3
3
|
import {UUID} from "crypto";
|
|
4
4
|
import sqlite from "better-sqlite3";
|
|
5
5
|
import {randomUUID} from "node:crypto";
|
|
6
|
-
import {IDraxPaginateResult, IDraxPaginateOptions} from "@drax/crud-share";
|
|
6
|
+
import {IDraxPaginateResult, IDraxPaginateOptions, IDraxFindOptions} from "@drax/crud-share";
|
|
7
7
|
import {SqliteErrorToValidationError, SqliteTableBuilder, SqlQueryFilter, SqlSort} from "@drax/common-back";
|
|
8
8
|
import type {SqliteTableField} from "@drax/common-back";
|
|
9
9
|
|
|
@@ -143,6 +143,29 @@ class TenantSqliteRepository implements ITenantRepository{
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
+
async find({
|
|
147
|
+
cursor = false,
|
|
148
|
+
limit = 0,
|
|
149
|
+
orderBy = '',
|
|
150
|
+
order = false,
|
|
151
|
+
search = '',
|
|
152
|
+
filters = []
|
|
153
|
+
}: IDraxFindOptions): Promise<ITenant[]>{
|
|
154
|
+
|
|
155
|
+
let where=""
|
|
156
|
+
if (search) {
|
|
157
|
+
where = ` WHERE name LIKE '%${search}%'`
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
where = SqlQueryFilter.applyFilters(where, filters)
|
|
161
|
+
const sort = SqlSort.applySort(orderBy, order)
|
|
162
|
+
|
|
163
|
+
where += sort
|
|
164
|
+
const tenants = this.db.prepare('SELECT * FROM tenants ' + where).all();
|
|
165
|
+
|
|
166
|
+
return tenants
|
|
167
|
+
}
|
|
168
|
+
|
|
146
169
|
|
|
147
170
|
}
|
|
148
171
|
|
package/src/routes/RoleRoutes.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import { ValidationError} from "@drax/common-back";
|
|
1
|
+
import { ValidationError, UnauthorizedError} from "@drax/common-back";
|
|
2
2
|
import RoleServiceFactory from "../factory/RoleServiceFactory.js";
|
|
3
3
|
import {IRole} from "@drax/identity-share";
|
|
4
4
|
import {IdentityPermissions} from "../permissions/IdentityPermissions.js";
|
|
5
5
|
import {PermissionService} from "../services/PermissionService.js";
|
|
6
|
-
import UnauthorizedError from "../errors/UnauthorizedError.js";
|
|
7
6
|
import {IDraxPaginateResult} from "@drax/crud-share";
|
|
8
7
|
|
|
9
8
|
|
|
@@ -1,178 +1,24 @@
|
|
|
1
|
-
import
|
|
2
|
-
import TenantServiceFactory from "../factory/TenantServiceFactory.js";
|
|
3
|
-
import {ITenant} from "@drax/identity-share";
|
|
4
|
-
import {IdentityPermissions} from "../permissions/IdentityPermissions.js";
|
|
5
|
-
import UnauthorizedError from "../errors/UnauthorizedError.js";
|
|
6
|
-
import {IDraxPaginateResult} from "@drax/crud-share";
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import TenantController from '../controllers/TenantController.js'
|
|
9
2
|
|
|
10
3
|
async function TenantRoutes(fastify, options) {
|
|
11
4
|
|
|
12
|
-
|
|
13
|
-
try {
|
|
14
|
-
request.rbac.assertPermission(IdentityPermissions.ViewTenant)
|
|
15
|
-
const id = request.params.id
|
|
16
|
-
const tenantService = TenantServiceFactory()
|
|
17
|
-
let tenant = await tenantService.findById(id)
|
|
18
|
-
return tenant
|
|
19
|
-
} catch (e) {
|
|
20
|
-
console.error(e)
|
|
21
|
-
if (e instanceof ValidationError) {
|
|
22
|
-
reply.statusCode = e.statusCode
|
|
23
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
24
|
-
} else if (e instanceof UnauthorizedError) {
|
|
25
|
-
reply.statusCode = e.statusCode
|
|
26
|
-
reply.send({error: e.message})
|
|
27
|
-
} else {
|
|
28
|
-
reply.statusCode = 500
|
|
29
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
})
|
|
33
|
-
|
|
34
|
-
fastify.get('/api/tenants/name/:name', async (request, reply): Promise<ITenant> => {
|
|
35
|
-
try {
|
|
36
|
-
request.rbac.assertPermission(IdentityPermissions.ViewTenant)
|
|
37
|
-
const name = request.params.name
|
|
38
|
-
const tenantService = TenantServiceFactory()
|
|
39
|
-
let tenant = await tenantService.findByName(name)
|
|
40
|
-
return tenant
|
|
41
|
-
} catch (e) {
|
|
42
|
-
console.error(e)
|
|
43
|
-
if (e instanceof ValidationError) {
|
|
44
|
-
reply.statusCode = e.statusCode
|
|
45
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
46
|
-
} else if (e instanceof UnauthorizedError) {
|
|
47
|
-
reply.statusCode = e.statusCode
|
|
48
|
-
reply.send({error: e.message})
|
|
49
|
-
} else {
|
|
50
|
-
reply.statusCode = 500
|
|
51
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
})
|
|
5
|
+
const controller: TenantController = new TenantController()
|
|
55
6
|
|
|
56
|
-
fastify.get('/api/tenants/
|
|
57
|
-
try {
|
|
58
|
-
request.rbac.assertPermission(IdentityPermissions.ViewTenant)
|
|
59
|
-
const tenantService = TenantServiceFactory()
|
|
60
|
-
let tenants = await tenantService.fetchAll()
|
|
61
|
-
if(request.rbac.getAuthUser.tenantId){
|
|
62
|
-
return tenants.filter(t => t.id === request.rbac.getAuthUser.tenantId)
|
|
63
|
-
}else{
|
|
64
|
-
return tenants
|
|
65
|
-
}
|
|
66
|
-
} catch (e) {
|
|
67
|
-
console.error(e)
|
|
68
|
-
if (e instanceof ValidationError) {
|
|
69
|
-
reply.statusCode = e.statusCode
|
|
70
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
71
|
-
} else if (e instanceof UnauthorizedError) {
|
|
72
|
-
reply.statusCode = e.statusCode
|
|
73
|
-
reply.send({error: e.message})
|
|
74
|
-
} else {
|
|
75
|
-
reply.statusCode = 500
|
|
76
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
})
|
|
7
|
+
fastify.get('/api/tenants/export', (req,rep) => controller.export(req,rep) )
|
|
80
8
|
|
|
81
|
-
fastify.get('/api/tenants',
|
|
82
|
-
try {
|
|
83
|
-
request.rbac.assertPermission(IdentityPermissions.ViewTenant)
|
|
84
|
-
const page = request.query.page
|
|
85
|
-
const limit = request.query.limit
|
|
86
|
-
const orderBy = request.query.orderBy
|
|
87
|
-
const order = request.query.order
|
|
88
|
-
const search = request.query.search
|
|
89
|
-
const tenantService = TenantServiceFactory()
|
|
90
|
-
let paginateResult = await tenantService.paginate({page, limit,orderBy, order, search})
|
|
91
|
-
return paginateResult
|
|
92
|
-
} catch (e) {
|
|
93
|
-
console.error(e)
|
|
94
|
-
if (e instanceof ValidationError) {
|
|
95
|
-
reply.statusCode = e.statusCode
|
|
96
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
97
|
-
} else if (e instanceof UnauthorizedError) {
|
|
98
|
-
reply.statusCode = e.statusCode
|
|
99
|
-
reply.send({error: e.message})
|
|
100
|
-
} else {
|
|
101
|
-
reply.statusCode = 500
|
|
102
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
})
|
|
9
|
+
fastify.get('/api/tenants/:id', (req,rep) => controller.findById(req,rep) )
|
|
106
10
|
|
|
107
|
-
fastify.
|
|
108
|
-
try {
|
|
109
|
-
request.rbac.assertPermission(IdentityPermissions.CreateTenant)
|
|
110
|
-
const payload = request.body
|
|
111
|
-
const tenantService = TenantServiceFactory()
|
|
112
|
-
let tenant = await tenantService.create(payload)
|
|
113
|
-
return tenant
|
|
114
|
-
} catch (e) {
|
|
115
|
-
console.error(e)
|
|
116
|
-
if (e instanceof ValidationError) {
|
|
117
|
-
reply.statusCode = e.statusCode
|
|
118
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
119
|
-
} else if (e instanceof UnauthorizedError) {
|
|
120
|
-
reply.statusCode = e.statusCode
|
|
121
|
-
reply.send({error: e.message})
|
|
122
|
-
} else {
|
|
123
|
-
reply.statusCode = 500
|
|
124
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
125
|
-
}
|
|
126
|
-
}
|
|
11
|
+
fastify.get('/api/tenants/name/:name', (req,rep) => controller.findByName(req,rep))
|
|
127
12
|
|
|
128
|
-
|
|
13
|
+
fastify.get('/api/tenants/all', (req,rep) => controller.all(req,rep))
|
|
129
14
|
|
|
130
|
-
fastify.
|
|
131
|
-
try {
|
|
132
|
-
request.rbac.assertPermission(IdentityPermissions.UpdateTenant)
|
|
133
|
-
const id = request.params.id
|
|
134
|
-
const payload = request.body
|
|
135
|
-
const tenantService = TenantServiceFactory()
|
|
15
|
+
fastify.get('/api/tenants', (req,rep) => controller.paginate(req,rep))
|
|
136
16
|
|
|
137
|
-
|
|
138
|
-
return tenant
|
|
139
|
-
} catch (e) {
|
|
140
|
-
console.error(e)
|
|
141
|
-
if (e instanceof ValidationError) {
|
|
142
|
-
reply.statusCode = e.statusCode
|
|
143
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
144
|
-
} else if (e instanceof UnauthorizedError) {
|
|
145
|
-
reply.statusCode = e.statusCode
|
|
146
|
-
reply.send({error: e.message})
|
|
147
|
-
} else {
|
|
148
|
-
reply.statusCode = 500
|
|
149
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
150
|
-
}
|
|
151
|
-
}
|
|
17
|
+
fastify.post('/api/tenants', (req,rep) => controller.create(req,rep))
|
|
152
18
|
|
|
153
|
-
|
|
19
|
+
fastify.put('/api/tenants/:id', (req,rep) => controller.update(req,rep))
|
|
154
20
|
|
|
155
|
-
fastify.delete('/api/tenants/:id',
|
|
156
|
-
try {
|
|
157
|
-
request.rbac.assertPermission(IdentityPermissions.DeleteTenant)
|
|
158
|
-
const id = request.params.id
|
|
159
|
-
const tenantService = TenantServiceFactory()
|
|
160
|
-
let r = await tenantService.delete(id)
|
|
161
|
-
return r
|
|
162
|
-
} catch (e) {
|
|
163
|
-
console.error(e)
|
|
164
|
-
if (e instanceof ValidationError) {
|
|
165
|
-
reply.statusCode = e.statusCode
|
|
166
|
-
reply.send({error: e.message, inputErrors: e.errors})
|
|
167
|
-
} else if (e instanceof UnauthorizedError) {
|
|
168
|
-
reply.statusCode = e.statusCode
|
|
169
|
-
reply.send({error: e.message})
|
|
170
|
-
} else {
|
|
171
|
-
reply.statusCode = 500
|
|
172
|
-
reply.send({error: 'INTERNAL_SERVER_ERROR'})
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
})
|
|
21
|
+
fastify.delete('/api/tenants/:id', (req,rep) => controller.delete(req,rep))
|
|
176
22
|
|
|
177
23
|
}
|
|
178
24
|
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import UserApiKeyServiceFactory from "../factory/UserApiKeyServiceFactory.js";
|
|
2
2
|
import type {IUserApiKey} from "@drax/identity-share";
|
|
3
|
-
import {ValidationError} from "@drax/common-back";
|
|
3
|
+
import {ValidationError, UnauthorizedError} from "@drax/common-back";
|
|
4
4
|
import {IdentityPermissions} from "../permissions/IdentityPermissions.js";
|
|
5
|
-
import UnauthorizedError from "../errors/UnauthorizedError.js";
|
|
6
5
|
import {IDraxPaginateResult} from "@drax/crud-share";
|
|
7
6
|
|
|
8
7
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import {join} from "path";
|
|
2
|
-
import UnauthorizedError from "
|
|
3
|
-
import {StoreManager, UploadFileError, DraxConfig, CommonConfig} from "@drax/common-back";
|
|
2
|
+
import {StoreManager, UploadFileError, DraxConfig, CommonConfig, UnauthorizedError} from "@drax/common-back";
|
|
4
3
|
import UserServiceFactory from "../factory/UserServiceFactory.js";
|
|
5
4
|
import IdentityConfig from "../config/IdentityConfig.js";
|
|
6
5
|
|
package/src/routes/UserRoutes.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import UserServiceFactory from "../factory/UserServiceFactory.js";
|
|
2
2
|
import {IUser} from "@drax/identity-share";
|
|
3
|
-
import {ValidationError} from "@drax/common-back";
|
|
3
|
+
import {ValidationError, UnauthorizedError} from "@drax/common-back";
|
|
4
4
|
import {IdentityPermissions} from "../permissions/IdentityPermissions.js";
|
|
5
|
-
import UnauthorizedError from "../errors/UnauthorizedError.js";
|
|
6
5
|
import BadCredentialsError from "../errors/BadCredentialsError.js";
|
|
7
6
|
import {IDraxPaginateResult} from "@drax/crud-share";
|
|
8
7
|
|
|
@@ -4,12 +4,14 @@ import {tenantSchema} from "../zod/TenantZod.js";
|
|
|
4
4
|
import {ZodError} from "zod";
|
|
5
5
|
import {ITenantBase, ITenant} from "@drax/identity-share";
|
|
6
6
|
import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
|
|
7
|
+
import {AbstractService} from "@drax/crud-back";
|
|
7
8
|
|
|
8
|
-
class TenantService {
|
|
9
|
+
class TenantService extends AbstractService<ITenant,ITenantBase,ITenantBase> {
|
|
9
10
|
|
|
10
11
|
_repository: ITenantRepository
|
|
11
12
|
|
|
12
13
|
constructor(tenantRepostitory: ITenantRepository) {
|
|
14
|
+
super(tenantRepostitory, tenantSchema)
|
|
13
15
|
this._repository = tenantRepostitory
|
|
14
16
|
console.log("TenantService constructor")
|
|
15
17
|
}
|
package/tsconfig.json
CHANGED
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"compilerOptions": {
|
|
4
4
|
"rootDir": "src",
|
|
5
5
|
"outDir": "dist",
|
|
6
|
-
"declarationDir": "
|
|
6
|
+
"declarationDir": "types"
|
|
7
7
|
},
|
|
8
|
-
"exclude": ["types", "test", "dist","node_modules"],
|
|
8
|
+
"exclude": ["types", "test", "dist","node_modules","tmp"],
|
|
9
9
|
"ts-node": {
|
|
10
10
|
"esm": true
|
|
11
11
|
},
|