@drax/identity-back 0.4.0 → 0.5.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 (124) hide show
  1. package/dist/controllers/TenantController.js +66 -0
  2. package/dist/graphql/resolvers/role.resolvers.js +1 -2
  3. package/dist/graphql/resolvers/tenant.resolvers.js +1 -2
  4. package/dist/graphql/resolvers/user-api-key.resolvers.js +1 -2
  5. package/dist/graphql/resolvers/user.resolvers.js +1 -1
  6. package/dist/index.js +7 -4
  7. package/dist/permissions/RolePermissions.js +11 -0
  8. package/dist/permissions/TenantPermissions.js +10 -0
  9. package/dist/permissions/UserApiKeyPermissions.js +11 -0
  10. package/dist/permissions/UserPermissions.js +10 -0
  11. package/dist/permissions/index.js +12 -0
  12. package/dist/rbac/Rbac.js +1 -1
  13. package/dist/repository/mongo/TenantMongoRepository.js +12 -0
  14. package/dist/repository/sqlite/TenantSqliteRepository.js +11 -0
  15. package/dist/routes/RoleRoutes.js +1 -2
  16. package/dist/routes/TenantRoutes.js +10 -181
  17. package/dist/routes/UserApiKeyRoutes.js +1 -2
  18. package/dist/routes/UserAvatarRoutes.js +8 -8
  19. package/dist/routes/UserRoutes.js +1 -2
  20. package/dist/services/TenantService.js +3 -1
  21. package/package.json +7 -6
  22. package/src/controllers/TenantController.ts +73 -0
  23. package/src/graphql/resolvers/role.resolvers.ts +1 -2
  24. package/src/graphql/resolvers/tenant.resolvers.ts +1 -2
  25. package/src/graphql/resolvers/user-api-key.resolvers.ts +1 -2
  26. package/src/graphql/resolvers/user.resolvers.ts +1 -1
  27. package/src/index.ts +12 -3
  28. package/src/interfaces/IRoleRepository.ts +1 -1
  29. package/src/interfaces/ITenantRepository.ts +1 -1
  30. package/src/interfaces/IUserApiKeyRepository.ts +1 -1
  31. package/src/interfaces/IUserRepository.ts +1 -1
  32. package/src/permissions/IdentityPermissions.ts +1 -0
  33. package/src/permissions/RolePermissions.ts +12 -0
  34. package/src/permissions/TenantPermissions.ts +11 -0
  35. package/src/permissions/UserApiKeyPermissions.ts +12 -0
  36. package/src/permissions/UserPermissions.ts +11 -0
  37. package/src/permissions/index.ts +15 -0
  38. package/src/rbac/Rbac.ts +1 -1
  39. package/src/repository/mongo/RoleMongoRepository.ts +1 -1
  40. package/src/repository/mongo/TenantMongoRepository.ts +41 -16
  41. package/src/repository/mongo/UserApiKeyMongoRepository.ts +1 -1
  42. package/src/repository/mongo/UserMongoRepository.ts +1 -1
  43. package/src/repository/sqlite/RoleSqliteRepository.ts +1 -1
  44. package/src/repository/sqlite/TenantSqliteRepository.ts +24 -1
  45. package/src/repository/sqlite/UserApiKeySqliteRepository.ts +1 -1
  46. package/src/repository/sqlite/UserSqliteRepository.ts +1 -1
  47. package/src/routes/RoleRoutes.ts +2 -3
  48. package/src/routes/TenantRoutes.ts +10 -164
  49. package/src/routes/UserApiKeyRoutes.ts +2 -3
  50. package/src/routes/UserAvatarRoutes.ts +8 -8
  51. package/src/routes/UserRoutes.ts +2 -3
  52. package/src/services/RoleService.ts +1 -1
  53. package/src/services/TenantService.ts +4 -2
  54. package/src/services/UserApiKeyService.ts +1 -1
  55. package/src/services/UserService.ts +1 -1
  56. package/test/repository/mongo/role-mongo-repository.test.ts +1 -1
  57. package/test/repository/mongo/user-apikey-mongo-repository.test.ts +1 -1
  58. package/test/repository/mongo/user-mongo-repository.test.ts +1 -1
  59. package/test/repository/sqlite/role-sqlite-repository.test.ts +1 -1
  60. package/tsconfig.json +2 -2
  61. package/tsconfig.tsbuildinfo +1 -1
  62. package/types/controllers/TenantController.d.ts +12 -0
  63. package/types/controllers/TenantController.d.ts.map +1 -0
  64. package/types/graphql/resolvers/role.resolvers.d.ts +1 -1
  65. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -1
  66. package/types/graphql/resolvers/tenant.resolvers.d.ts +1 -1
  67. package/types/graphql/resolvers/tenant.resolvers.d.ts.map +1 -1
  68. package/types/graphql/resolvers/user-api-key.resolvers.d.ts +1 -1
  69. package/types/graphql/resolvers/user-api-key.resolvers.d.ts.map +1 -1
  70. package/types/graphql/resolvers/user.resolvers.d.ts +1 -1
  71. package/types/index.d.ts +6 -3
  72. package/types/index.d.ts.map +1 -1
  73. package/types/interfaces/IRoleRepository.d.ts +1 -1
  74. package/types/interfaces/IRoleRepository.d.ts.map +1 -1
  75. package/types/interfaces/ITenantRepository.d.ts +1 -1
  76. package/types/interfaces/ITenantRepository.d.ts.map +1 -1
  77. package/types/interfaces/IUserApiKeyRepository.d.ts +1 -1
  78. package/types/interfaces/IUserApiKeyRepository.d.ts.map +1 -1
  79. package/types/interfaces/IUserRepository.d.ts +1 -1
  80. package/types/interfaces/IUserRepository.d.ts.map +1 -1
  81. package/types/permissions/IdentityPermissions.d.ts.map +1 -1
  82. package/types/permissions/RolePermissions.d.ts +11 -0
  83. package/types/permissions/RolePermissions.d.ts.map +1 -0
  84. package/types/permissions/TenantPermissions.d.ts +10 -0
  85. package/types/permissions/TenantPermissions.d.ts.map +1 -0
  86. package/types/permissions/UserApiKeyPermissions.d.ts +11 -0
  87. package/types/permissions/UserApiKeyPermissions.d.ts.map +1 -0
  88. package/types/permissions/UserPermissions.d.ts +10 -0
  89. package/types/permissions/UserPermissions.d.ts.map +1 -0
  90. package/types/permissions/index.d.ts +14 -0
  91. package/types/permissions/index.d.ts.map +1 -0
  92. package/types/repository/mongo/RoleMongoRepository.d.ts +1 -1
  93. package/types/repository/mongo/RoleMongoRepository.d.ts.map +1 -1
  94. package/types/repository/mongo/TenantMongoRepository.d.ts +2 -1
  95. package/types/repository/mongo/TenantMongoRepository.d.ts.map +1 -1
  96. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts +1 -1
  97. package/types/repository/mongo/UserApiKeyMongoRepository.d.ts.map +1 -1
  98. package/types/repository/mongo/UserMongoRepository.d.ts +1 -1
  99. package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
  100. package/types/repository/sqlite/RoleSqliteRepository.d.ts +1 -1
  101. package/types/repository/sqlite/RoleSqliteRepository.d.ts.map +1 -1
  102. package/types/repository/sqlite/TenantSqliteRepository.d.ts +2 -1
  103. package/types/repository/sqlite/TenantSqliteRepository.d.ts.map +1 -1
  104. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts +1 -1
  105. package/types/repository/sqlite/UserApiKeySqliteRepository.d.ts.map +1 -1
  106. package/types/repository/sqlite/UserSqliteRepository.d.ts +1 -1
  107. package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
  108. package/types/routes/RoleRoutes.d.ts.map +1 -1
  109. package/types/routes/TenantRoutes.d.ts.map +1 -1
  110. package/types/routes/UserApiKeyRoutes.d.ts.map +1 -1
  111. package/types/routes/UserRoutes.d.ts.map +1 -1
  112. package/types/services/RoleService.d.ts +1 -1
  113. package/types/services/RoleService.d.ts.map +1 -1
  114. package/types/services/TenantService.d.ts +3 -2
  115. package/types/services/TenantService.d.ts.map +1 -1
  116. package/types/services/UserApiKeyService.d.ts +1 -1
  117. package/types/services/UserApiKeyService.d.ts.map +1 -1
  118. package/types/services/UserService.d.ts +1 -1
  119. package/types/services/UserService.d.ts.map +1 -1
  120. package/types/zod/UserZod.d.ts +6 -6
  121. package/dist/errors/UnauthorizedError.js +0 -10
  122. package/src/errors/UnauthorizedError.ts +0 -13
  123. package/types/errors/UnauthorizedError.d.ts +0 -6
  124. package/types/errors/UnauthorizedError.d.ts.map +0 -1
@@ -1,8 +1,7 @@
1
1
  import TenantServiceFactory from "../../factory/TenantServiceFactory.js";
2
2
  import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
3
- import {ValidationError, ValidationErrorToGraphQLError} from "@drax/common-back";
3
+ import {ValidationError, ValidationErrorToGraphQLError, UnauthorizedError} from "@drax/common-back";
4
4
  import {GraphQLError} from "graphql";
5
- import UnauthorizedError from "../../errors/UnauthorizedError.js";
6
5
 
7
6
 
8
7
  export default {
@@ -1,8 +1,7 @@
1
1
  import UserApiKeyServiceFactory from "../../factory/UserApiKeyServiceFactory.js";
2
2
  import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
3
- import {ValidationError, ValidationErrorToGraphQLError} from "@drax/common-back";
3
+ import {ValidationError, ValidationErrorToGraphQLError, UnauthorizedError} from "@drax/common-back";
4
4
  import {GraphQLError} from "graphql";
5
- import UnauthorizedError from "../../errors/UnauthorizedError.js";
6
5
  import * as crypto from "node:crypto";
7
6
 
8
7
 
@@ -8,7 +8,7 @@ import {
8
8
  CommonConfig
9
9
  } from "@drax/common-back";
10
10
  import {IdentityPermissions} from "../../permissions/IdentityPermissions.js";
11
- import UnauthorizedError from "../../errors/UnauthorizedError.js";
11
+ import {UnauthorizedError} from "@drax/common-back";
12
12
  import BadCredentialsError from "../../errors/BadCredentialsError.js";
13
13
  import {join} from "path";
14
14
  import IdentityConfig from "../../config/IdentityConfig.js";
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
@@ -1,5 +1,5 @@
1
1
  import {IRole, IRoleBase} from "@drax/identity-share";
2
- import {IDraxCrud} from "@drax/common-share";
2
+ import {IDraxCrud} from "@drax/crud-share";
3
3
 
4
4
  interface IRoleRepository extends IDraxCrud<IRole, IRoleBase, IRoleBase> {
5
5
  findById(id: string): Promise<IRole | null>;
@@ -1,5 +1,5 @@
1
1
  import {ITenant, ITenantBase} from '@drax/identity-share'
2
- import {IDraxCrud} from "@drax/common-share";
2
+ import {IDraxCrud} from "@drax/crud-share";
3
3
  interface ITenantRepository extends IDraxCrud<ITenant,ITenantBase,ITenantBase>{
4
4
  findById(id: string): Promise<ITenant | null>;
5
5
  findByName(name: string): Promise<ITenant | null>;
@@ -1,5 +1,5 @@
1
1
  import {IUserApiKey, IUserApiKeyBase} from '@drax/identity-share'
2
- import {IDraxCrud} from "@drax/common-share";
2
+ import {IDraxCrud} from "@drax/crud-share";
3
3
 
4
4
  interface IUserApiKeyRepository extends IDraxCrud<IUserApiKey, IUserApiKeyBase, IUserApiKeyBase>{
5
5
  findBySecret(username: string): Promise<IUserApiKey | null>;
@@ -1,5 +1,5 @@
1
1
  import {IUser, IUserCreate, IUserUpdate} from '@drax/identity-share'
2
- import {IDraxCrud} from "@drax/common-share";
2
+ import {IDraxCrud} from "@drax/crud-share";
3
3
 
4
4
  interface IUserRepository extends IDraxCrud<IUser, IUserCreate, IUserUpdate>{
5
5
  findById(id: string): Promise<IUser | null>;
@@ -1,3 +1,4 @@
1
+
1
2
  enum IdentityPermissions {
2
3
 
3
4
 
@@ -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,11 @@
1
+ enum TenantPermissions {
2
+ Create = "tenant:create",
3
+ Update = "tenant:update",
4
+ Delete= "tenant:delete",
5
+ View = "tenant:view",
6
+ Manage = "tenant:manage",
7
+
8
+ }
9
+
10
+ export default TenantPermissions;
11
+ export {TenantPermissions};
@@ -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,11 @@
1
+ enum UserPermissions {
2
+ Create = "user:create",
3
+ Update = "user:update",
4
+ Delete = "user:delete",
5
+ View = "user:view",
6
+ Manage = "user:manage",
7
+
8
+ }
9
+
10
+ export default UserPermissions;
11
+ export {UserPermissions};
@@ -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,5 +1,5 @@
1
1
  import {IJwtUser, IRole} from "@drax/identity-share";
2
- import UnauthorizedError from "../errors/UnauthorizedError.js";
2
+ import {UnauthorizedError} from "@drax/common-back";
3
3
 
4
4
  class Rbac {
5
5
  private role: IRole;
@@ -3,7 +3,7 @@ import {IRoleRepository} from '../../interfaces/IRoleRepository'
3
3
  import {mongoose, MongooseQueryFilter, MongooseSort} from "@drax/common-back";
4
4
  import {PaginateOptions, PaginateResult} from "mongoose";
5
5
  import {DeleteResult} from "mongodb";
6
- import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/common-share";
6
+ import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
7
7
  import {IRoleBase, IRole} from "@drax/identity-share";
8
8
 
9
9
  class RoleMongoRepository implements IRoleRepository{
@@ -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 { PaginateOptions, PaginateResult} from "mongoose";
4
+ import {PaginateOptions, PaginateResult} from "mongoose";
5
5
  import {DeleteResult} from "mongodb";
6
- import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/common-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 : mongoose.HydratedDocument<ITenant> = new TenantModel(tenantData)
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 : mongoose.HydratedDocument<ITenant> = await TenantModel.findOneAndUpdate({_id: id}, tenantData, {new: true}).exec()
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 : DeleteResult = await TenantModel.deleteOne({_id:id}).exec()
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= []} : IDraxPaginateOptions): Promise<IDraxPaginateResult<ITenant>> {
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
@@ -8,7 +8,7 @@ import {
8
8
  import type {IUserApiKey, IUserApiKeyBase, IUserApiKeySoftDelete} from "@drax/identity-share";
9
9
  import {DeleteResult, MongoServerError} from "mongodb";
10
10
  import {PaginateResult} from "mongoose";
11
- import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/common-share";
11
+ import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
12
12
  import {IUserApiKeyRepository} from "../../interfaces/IUserApiKeyRepository";
13
13
 
14
14
  class UserMongoRepository implements IUserApiKeyRepository {
@@ -11,7 +11,7 @@ import {DeleteResult, MongoServerError} from "mongodb";
11
11
  import type {IUserRepository} from "../../interfaces/IUserRepository";
12
12
  import {PaginateResult} from "mongoose";
13
13
  import RoleMongoRepository from "./RoleMongoRepository.js";
14
- import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/common-share";
14
+ import {IDraxPaginateOptions, IDraxPaginateResult} from "@drax/crud-share";
15
15
 
16
16
  class UserMongoRepository implements IUserRepository {
17
17
  private roleRepository: RoleMongoRepository;
@@ -2,7 +2,7 @@ import {IRoleRepository} from '../../interfaces/IRoleRepository'
2
2
  import {UUID} from "crypto";
3
3
  import sqlite from "better-sqlite3";
4
4
  import {randomUUID} from "node:crypto";
5
- import {IDraxPaginateResult, IDraxPaginateOptions} from "@drax/common-share";
5
+ import {IDraxPaginateResult, IDraxPaginateOptions} from "@drax/crud-share";
6
6
  import {IRole, IRoleBase} from "@drax/identity-share";
7
7
  import {
8
8
  SqliteErrorToValidationError,
@@ -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/common-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
 
@@ -3,7 +3,7 @@ import {IUserApiKeyRepository} from '../../interfaces/IUserApiKeyRepository'
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/common-share";
6
+ import {IDraxPaginateResult, IDraxPaginateOptions} 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
  import UserSqliteRepository from "./UserSqliteRepository.js";
@@ -3,7 +3,7 @@ import sqlite from "better-sqlite3";
3
3
  import {randomUUID} from "node:crypto";
4
4
  import {UUID} from "crypto";
5
5
  import {IUserRepository} from "../../interfaces/IUserRepository";
6
- import {IDraxPaginateResult, IDraxPaginateOptions} from "@drax/common-share";
6
+ import {IDraxPaginateResult, IDraxPaginateOptions} from "@drax/crud-share";
7
7
  import {
8
8
  SqliteErrorToValidationError,
9
9
  SqliteTableBuilder,
@@ -1,10 +1,9 @@
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
- import {IDraxPaginateResult} from "@drax/common-share";
6
+ import {IDraxPaginateResult} from "@drax/crud-share";
8
7
 
9
8
 
10
9
 
@@ -1,178 +1,24 @@
1
- import { ValidationError} from "@drax/common-back";
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/common-share";
7
-
8
-
1
+ import TenantController from '../controllers/TenantController.js'
9
2
 
10
3
  async function TenantRoutes(fastify, options) {
11
4
 
12
- fastify.get('/api/tenants/:id', async (request, reply): Promise<ITenant> => {
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/all', async (request, reply): Promise<ITenant[]> => {
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', async (request, reply): Promise<IDraxPaginateResult<ITenant>> => {
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.post('/api/tenants', async (request, reply): Promise<ITenant> => {
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.put('/api/tenants/:id', async (request, reply): Promise<ITenant> => {
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
- let tenant = await tenantService.update(id, payload)
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', async (request, reply): Promise<any> => {
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,9 +1,8 @@
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
- import {IDraxPaginateResult} from "@drax/common-share";
5
+ import {IDraxPaginateResult} from "@drax/crud-share";
7
6
 
8
7
 
9
8
  async function UserApiKeyRoutes(fastify, options) {