@drax/identity-back 3.13.0 → 3.14.0

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.
@@ -1,129 +1,18 @@
1
1
  import { AbstractFastifyController } from "@drax/crud-back";
2
- import { ValidationError, UnauthorizedError } from "@drax/common-back";
3
2
  import UserApiKeyServiceFactory from "../factory/UserApiKeyServiceFactory.js";
4
3
  import UserApiKeyPermissions from "../permissions/UserApiKeyPermissions.js";
5
4
  class UserApiKeyController extends AbstractFastifyController {
6
5
  constructor() {
7
6
  super(UserApiKeyServiceFactory(), UserApiKeyPermissions);
7
+ this.userField = 'user';
8
+ this.userFilter = true;
9
+ this.userSetter = true;
10
+ this.userAssert = true;
8
11
  }
9
- async paginate(request, reply) {
10
- try {
11
- request.rbac.assertAuthenticated();
12
- request.rbac.assertOrPermissions([
13
- UserApiKeyPermissions.View,
14
- UserApiKeyPermissions.ViewMy
15
- ]);
16
- const filters = [];
17
- if (!request.rbac.hasPermission(UserApiKeyPermissions.View)) {
18
- filters.push({ field: "user", operator: "eq", value: request.rbac.userId });
19
- }
20
- const page = request.query.page;
21
- const limit = request.query.limit;
22
- const orderBy = request.query.orderBy;
23
- const order = request.query.order;
24
- const search = request.query.search;
25
- const userApiKeyService = UserApiKeyServiceFactory();
26
- let paginateResult = await userApiKeyService.paginate({ page, limit, orderBy, order, search, filters });
27
- return paginateResult;
28
- }
29
- catch (e) {
30
- console.log("/api/user-api-keys", e);
31
- if (e instanceof ValidationError) {
32
- reply.statusCode = e.statusCode;
33
- reply.send({ error: e.message, inputErrors: e.errors });
34
- }
35
- else if (e instanceof UnauthorizedError) {
36
- reply.statusCode = e.statusCode;
37
- reply.send({ error: e.message });
38
- }
39
- else {
40
- reply.statusCode = 500;
41
- reply.send({ error: 'error.server' });
42
- }
43
- }
44
- }
45
- async create(request, reply) {
46
- try {
47
- request.rbac.assertOrPermissions([UserApiKeyPermissions.Create, UserApiKeyPermissions.CreateMy]);
48
- const payload = request.body;
49
- if (!request.rbac.hasPermission(UserApiKeyPermissions.Create) || !payload.user) {
50
- payload.user = request.rbac.userId;
51
- }
52
- payload.createdBy = request.rbac.userId;
53
- const userApiKeyService = UserApiKeyServiceFactory();
54
- let userApiKey = await userApiKeyService.create(payload);
55
- return userApiKey;
56
- }
57
- catch (e) {
58
- if (e instanceof ValidationError) {
59
- reply.statusCode = e.statusCode;
60
- reply.send({ error: e.message, inputErrors: e.errors });
61
- }
62
- else if (e instanceof UnauthorizedError) {
63
- reply.statusCode = e.statusCode;
64
- reply.send({ error: e.message });
65
- }
66
- else {
67
- reply.statusCode = 500;
68
- reply.send({ error: 'error.server' });
69
- }
70
- }
71
- }
72
- async update(request, reply) {
73
- try {
74
- request.rbac.assertPermission(UserApiKeyPermissions.Update);
75
- const id = request.params.id;
76
- const payload = request.body;
77
- const userApiKeyService = UserApiKeyServiceFactory();
78
- let userApiKey = await userApiKeyService.update(id, payload);
79
- return userApiKey;
80
- }
81
- catch (e) {
82
- if (e instanceof ValidationError) {
83
- reply.statusCode = e.statusCode;
84
- reply.send({ error: e.message, inputErrors: e.errors });
85
- }
86
- if (e instanceof UnauthorizedError) {
87
- reply.statusCode = e.statusCode;
88
- reply.send({ error: e.message });
89
- }
90
- else if (e instanceof UnauthorizedError) {
91
- reply.statusCode = e.statusCode;
92
- reply.send({ error: e.message });
93
- }
94
- else {
95
- reply.statusCode = 500;
96
- reply.send({ error: 'error.server' });
97
- }
98
- }
99
- }
100
- async delete(request, reply) {
101
- try {
102
- request.rbac.assertPermission(UserApiKeyPermissions.Delete);
103
- const id = request.params.id;
104
- const userApiKeyService = UserApiKeyServiceFactory();
105
- let r = await userApiKeyService.delete(id);
106
- if (r) {
107
- reply.send({ message: 'Deleted successfully' });
108
- }
109
- else {
110
- reply.statusCode(400).send({ message: 'Not deleted' });
111
- }
112
- }
113
- catch (e) {
114
- if (e instanceof ValidationError) {
115
- reply.statusCode = e.statusCode;
116
- reply.send({ error: e.message, inputErrors: e.errors });
117
- }
118
- else if (e instanceof UnauthorizedError) {
119
- reply.statusCode = e.statusCode;
120
- reply.send({ error: e.message });
121
- }
122
- else {
123
- reply.statusCode = 500;
124
- reply.send({ error: 'error.server' });
125
- }
126
- }
12
+ async preCreate(request, payload) {
13
+ request.rbac.assertAuthenticated();
14
+ payload.createdBy = request.rbac.userId;
15
+ return payload;
127
16
  }
128
17
  }
129
18
  export default UserApiKeyController;
@@ -9,13 +9,12 @@ export default {
9
9
  try {
10
10
  rbac.assertAuthenticated();
11
11
  rbac.assertOrPermissions([
12
- UserApiKeyPermissions.View,
13
- UserApiKeyPermissions.ViewMy
12
+ UserApiKeyPermissions.View
14
13
  ]);
15
14
  if (!Array.isArray(options.filters)) {
16
15
  options.filters = [];
17
16
  }
18
- if (!rbac.hasPermission(UserApiKeyPermissions.View)) {
17
+ if (!rbac.hasPermission(UserApiKeyPermissions.ViewAll)) {
19
18
  options.filters.push({ field: "user", operator: "eq", value: rbac.userId });
20
19
  }
21
20
  const userApiKeyService = UserApiKeyServiceFactory();
@@ -3,7 +3,7 @@ import UserApiKeyServiceFactory from "../factory/UserApiKeyServiceFactory.js";
3
3
  import IdentityConfig from "../config/IdentityConfig.js";
4
4
  const verifyIp = DraxConfig.getOrLoad(IdentityConfig.VerifyIP, 'boolean', true);
5
5
  const cacheTTL = DraxConfig.getOrLoad(IdentityConfig.ApiKeyCacheTTL, 'number', 10000);
6
- const draxCache = new DraxCache(cacheTTL);
6
+ const draxCache = new DraxCache({ ttl: cacheTTL, namespace: 'identity:api-key' });
7
7
  async function userApiKeyLoader(k) {
8
8
  const userApiKeyService = UserApiKeyServiceFactory();
9
9
  const userApiKey = await userApiKeyService.findBySecret(k);
@@ -3,7 +3,7 @@ import RoleServiceFactory from "../factory/RoleServiceFactory.js";
3
3
  import Rbac from "../rbac/Rbac.js";
4
4
  import IdentityConfig from "../config/IdentityConfig.js";
5
5
  const cacheTTL = DraxConfig.getOrLoad(IdentityConfig.RbacCacheTTL, 'number', 10000);
6
- const draxCache = new DraxCache(cacheTTL);
6
+ const draxCache = new DraxCache({ ttl: cacheTTL, namespace: 'identity:role' });
7
7
  async function roleLoader(k) {
8
8
  const roleService = RoleServiceFactory();
9
9
  const role = await roleService.findById(k);
@@ -1,11 +1,10 @@
1
1
  var UserApiKeyPermissions;
2
2
  (function (UserApiKeyPermissions) {
3
3
  UserApiKeyPermissions["Create"] = "userApiKey:create";
4
- UserApiKeyPermissions["CreateMy"] = "userApiKey:createMy";
5
4
  UserApiKeyPermissions["Update"] = "userApiKey:update";
6
5
  UserApiKeyPermissions["Delete"] = "userApiKey:delete";
7
6
  UserApiKeyPermissions["View"] = "userApiKey:view";
8
- UserApiKeyPermissions["ViewMy"] = "userApiKey:viewMy";
7
+ UserApiKeyPermissions["ViewAll"] = "userApiKey:viewAll";
9
8
  UserApiKeyPermissions["Manage"] = "userApiKey:manage";
10
9
  })(UserApiKeyPermissions || (UserApiKeyPermissions = {}));
11
10
  export default UserApiKeyPermissions;
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "3.13.0",
6
+ "version": "3.14.0",
7
7
  "description": "Identity module for user management, authentication and authorization.",
8
8
  "main": "dist/index.js",
9
9
  "types": "types/index.d.ts",
@@ -28,9 +28,9 @@
28
28
  "author": "Cristian Incarnato & Drax Team",
29
29
  "license": "ISC",
30
30
  "dependencies": {
31
- "@drax/common-back": "^3.10.0",
32
- "@drax/crud-back": "^3.13.0",
33
- "@drax/crud-share": "^3.13.0",
31
+ "@drax/common-back": "^3.14.0",
32
+ "@drax/crud-back": "^3.14.0",
33
+ "@drax/crud-share": "^3.14.0",
34
34
  "@drax/email-back": "^3.1.0",
35
35
  "@drax/identity-share": "^3.0.0",
36
36
  "bcryptjs": "^2.4.3",
@@ -63,5 +63,5 @@
63
63
  "debug": "0"
64
64
  }
65
65
  },
66
- "gitHead": "5f68eefbcb01c876471e387a815fee1040489c2c"
66
+ "gitHead": "cec0f824be0bfff0965d7bc7b95241406c53c04d"
67
67
  }
@@ -1,149 +1,35 @@
1
1
  import type {IUserApiKey, IUserApiKeyBase} from "@drax/identity-share";
2
- import {AbstractFastifyController} from "@drax/crud-back";
3
- import {ValidationError, UnauthorizedError} from "@drax/common-back";
2
+ import {AbstractFastifyController, CustomRequest} from "@drax/crud-back";
4
3
 
5
4
  import UserApiKeyServiceFactory from "../factory/UserApiKeyServiceFactory.js";
6
5
  import UserApiKeyService from "../services/UserApiKeyService.js";
7
6
  import UserApiKeyPermissions from "../permissions/UserApiKeyPermissions.js";
8
7
 
9
- class UserApiKeyController extends AbstractFastifyController<IUserApiKey, IUserApiKeyBase, IUserApiKeyBase> {
8
+ type UserApiKeyPayload = IUserApiKeyBase & {
9
+ user?: string
10
+ }
11
+
12
+ class UserApiKeyController extends AbstractFastifyController<IUserApiKey, UserApiKeyPayload, UserApiKeyPayload> {
10
13
 
11
14
  protected service: UserApiKeyService
12
15
 
16
+ protected userField: string = 'user'
17
+ protected userFilter: boolean = true
18
+ protected userSetter: boolean = true
19
+ protected userAssert: boolean = true
20
+
13
21
  constructor() {
14
22
  super(UserApiKeyServiceFactory(), UserApiKeyPermissions)
15
23
  }
16
24
 
17
-
18
- async paginate(request, reply) {
19
- try {
20
- request.rbac.assertAuthenticated()
21
-
22
- request.rbac.assertOrPermissions([
23
- UserApiKeyPermissions.View,
24
- UserApiKeyPermissions.ViewMy
25
- ])
26
-
27
- const filters = []
28
-
29
- if(!request.rbac.hasPermission(UserApiKeyPermissions.View)){
30
- filters.push({field: "user", operator: "eq", value: request.rbac.userId})
31
- }
32
-
33
- const page = request.query.page
34
- const limit = request.query.limit
35
- const orderBy = request.query.orderBy
36
- const order = request.query.order
37
- const search = request.query.search
38
- const userApiKeyService = UserApiKeyServiceFactory()
39
-
40
-
41
- let paginateResult = await userApiKeyService.paginate({page, limit, orderBy, order, search, filters})
42
- return paginateResult
43
- } catch (e) {
44
- console.log("/api/user-api-keys",e)
45
- if (e instanceof ValidationError) {
46
- reply.statusCode = e.statusCode
47
- reply.send({error: e.message, inputErrors: e.errors})
48
- } else if (e instanceof UnauthorizedError) {
49
- reply.statusCode = e.statusCode
50
- reply.send({error: e.message})
51
- } else {
52
- reply.statusCode = 500
53
- reply.send({error: 'error.server'})
54
- }
55
- }
56
-
25
+ async preCreate(request: CustomRequest, payload: UserApiKeyPayload): Promise<UserApiKeyPayload> {
26
+ request.rbac.assertAuthenticated()
27
+ payload.createdBy = request.rbac.userId
28
+ return payload
57
29
  }
58
-
59
- async create(request, reply) {
60
- try {
61
- request.rbac.assertOrPermissions([UserApiKeyPermissions.Create, UserApiKeyPermissions.CreateMy])
62
- const payload = request.body
63
-
64
- if(!request.rbac.hasPermission(UserApiKeyPermissions.Create) || !payload.user){
65
- payload.user = request.rbac.userId
66
- }
67
-
68
- payload.createdBy = request.rbac.userId
69
-
70
- const userApiKeyService = UserApiKeyServiceFactory()
71
-
72
- let userApiKey = await userApiKeyService.create(payload)
73
- return userApiKey
74
- } catch (e) {
75
- if (e instanceof ValidationError) {
76
- reply.statusCode = e.statusCode
77
- reply.send({error: e.message, inputErrors: e.errors})
78
- } else if (e instanceof UnauthorizedError) {
79
- reply.statusCode = e.statusCode
80
- reply.send({error: e.message})
81
- } else {
82
- reply.statusCode = 500
83
- reply.send({error: 'error.server'})
84
- }
85
- }
86
-
87
- }
88
-
89
-
90
- async update(request, reply) {
91
- try {
92
- request.rbac.assertPermission(UserApiKeyPermissions.Update)
93
- const id = request.params.id
94
- const payload = request.body
95
- const userApiKeyService = UserApiKeyServiceFactory()
96
- let userApiKey = await userApiKeyService.update(id, payload)
97
- return userApiKey
98
- } catch (e) {
99
- if (e instanceof ValidationError) {
100
- reply.statusCode = e.statusCode
101
- reply.send({error: e.message, inputErrors: e.errors})
102
- }
103
- if (e instanceof UnauthorizedError) {
104
- reply.statusCode = e.statusCode
105
- reply.send({error: e.message})
106
- } else if (e instanceof UnauthorizedError) {
107
- reply.statusCode = e.statusCode
108
- reply.send({error: e.message})
109
- } else {
110
- reply.statusCode = 500
111
- reply.send({error: 'error.server'})
112
- }
113
- }
114
-
115
- }
116
-
117
- async delete(request, reply) : Promise<void> {
118
- try {
119
- request.rbac.assertPermission(UserApiKeyPermissions.Delete)
120
- const id = request.params.id
121
- const userApiKeyService = UserApiKeyServiceFactory()
122
- let r = await userApiKeyService.delete(id)
123
- if(r){
124
- reply.send({message: 'Deleted successfully'})
125
- }else{
126
- reply.statusCode(400).send({message: 'Not deleted'})
127
- }
128
- } catch (e) {
129
- if (e instanceof ValidationError) {
130
- reply.statusCode = e.statusCode
131
- reply.send({error: e.message, inputErrors: e.errors})
132
- } else if (e instanceof UnauthorizedError) {
133
- reply.statusCode = e.statusCode
134
- reply.send({error: e.message})
135
- } else {
136
- reply.statusCode = 500
137
- reply.send({error: 'error.server'})
138
- }
139
- }
140
-
141
- }
142
-
143
30
  }
144
31
 
145
32
  export default UserApiKeyController;
146
33
  export {
147
34
  UserApiKeyController
148
35
  }
149
-
@@ -14,15 +14,14 @@ export default {
14
14
 
15
15
 
16
16
  rbac.assertOrPermissions([
17
- UserApiKeyPermissions.View,
18
- UserApiKeyPermissions.ViewMy
17
+ UserApiKeyPermissions.View
19
18
  ])
20
19
 
21
20
  if(!Array.isArray(options.filters)){
22
21
  options.filters = []
23
22
  }
24
23
 
25
- if(!rbac.hasPermission(UserApiKeyPermissions.View)){
24
+ if(!rbac.hasPermission(UserApiKeyPermissions.ViewAll)){
26
25
  options.filters.push({field: "user", operator: "eq", value: rbac.userId})
27
26
  }
28
27
 
@@ -6,7 +6,7 @@ import IdentityConfig from "../config/IdentityConfig.js";
6
6
  const verifyIp = DraxConfig.getOrLoad(IdentityConfig.VerifyIP, 'boolean', true);
7
7
  const cacheTTL = DraxConfig.getOrLoad(IdentityConfig.ApiKeyCacheTTL, 'number',10000)
8
8
 
9
- const draxCache = new DraxCache<IUserApiKey>(cacheTTL);
9
+ const draxCache = new DraxCache<IUserApiKey>({ ttl: cacheTTL, namespace: 'identity:api-key' });
10
10
 
11
11
 
12
12
  async function userApiKeyLoader(k): Promise<IUserApiKey | null> {
@@ -5,7 +5,7 @@ import Rbac from "../rbac/Rbac.js";
5
5
  import IdentityConfig from "../config/IdentityConfig.js";
6
6
 
7
7
  const cacheTTL = DraxConfig.getOrLoad(IdentityConfig.RbacCacheTTL, 'number',10000) ;
8
- const draxCache = new DraxCache<IRole>(cacheTTL);
8
+ const draxCache = new DraxCache<IRole>({ ttl: cacheTTL, namespace: 'identity:role' });
9
9
 
10
10
 
11
11
  async function roleLoader(k):Promise<IRole | null> {
@@ -1,10 +1,9 @@
1
1
  enum UserApiKeyPermissions {
2
2
  Create = "userApiKey:create",
3
- CreateMy = "userApiKey:createMy",
4
3
  Update = "userApiKey:update",
5
4
  Delete = "userApiKey:delete",
6
5
  View = "userApiKey:view",
7
- ViewMy = "userApiKey:viewMy",
6
+ ViewAll = "userApiKey:viewAll",
8
7
  Manage = "userApiKey:manage",
9
8
 
10
9
  }