@drax/identity-back 0.7.22 → 0.8.1

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.
@@ -135,6 +135,7 @@ class UserController extends AbstractFastifyController {
135
135
  else if (request.rbac.getAuthUser.tenantId) {
136
136
  payload.tenant = request.rbac.getAuthUser.tenantId;
137
137
  }
138
+ payload.origin ?? (payload.origin = 'Admin');
138
139
  const userService = UserServiceFactory();
139
140
  let user = await userService.create(payload);
140
141
  return user;
@@ -57,6 +57,7 @@ const UserSchema = new mongoose.Schema({
57
57
  required: false,
58
58
  index: false
59
59
  },
60
+ origin: { type: String, required: false, index: false },
60
61
  groups: [{
61
62
  type: mongoose.Schema.Types.ObjectId,
62
63
  ref: 'Group',
@@ -51,6 +51,10 @@ class UserMongoRepository {
51
51
  const user = await UserModel.findOne({ username: username }).populate(['role', 'tenant']).exec();
52
52
  return user;
53
53
  }
54
+ async findByEmail(email) {
55
+ const user = await UserModel.findOne({ email: email }).populate(['role', 'tenant']).exec();
56
+ return user;
57
+ }
54
58
  async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
55
59
  const query = {};
56
60
  if (search) {
@@ -15,6 +15,7 @@ const tableFields = [
15
15
  { name: "tenant", type: "TEXT", unique: false, primary: false },
16
16
  { name: "groups", type: "TEXT", unique: false, primary: false },
17
17
  { name: "avatar", type: "TEXT", unique: false, primary: false },
18
+ { name: "origin", type: "TEXT", unique: false, primary: false },
18
19
  { name: "createdAt", type: "TEXT", unique: false, primary: false },
19
20
  { name: "updatedAt", type: "TEXT", unique: false, primary: false }
20
21
  ];
@@ -110,6 +111,15 @@ class UserSqliteRepository {
110
111
  user.tenant = await this.findTenantById(user.tenant);
111
112
  return user;
112
113
  }
114
+ async findByEmail(email) {
115
+ const user = this.db.prepare('SELECT * FROM users WHERE email = ?').get(email);
116
+ if (!user) {
117
+ return null;
118
+ }
119
+ user.role = await this.findRoleById(user.role);
120
+ user.tenant = await this.findTenantById(user.tenant);
121
+ return user;
122
+ }
113
123
  async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
114
124
  const offset = page > 1 ? (page - 1) * limit : 0;
115
125
  let where = "";
@@ -25,6 +25,24 @@ class UserService extends AbstractService {
25
25
  throw new BadCredentialsError();
26
26
  }
27
27
  }
28
+ async authByEmail(email, createIfNotFound = false, userData) {
29
+ let user = null;
30
+ console.log("auth email", email);
31
+ user = await this.findByEmail(email);
32
+ if (!user && createIfNotFound) {
33
+ userData.password = userData.password ? userData.password : randomUUID();
34
+ userData.active = userData.active === undefined ? true : userData.active;
35
+ user = await this.create(userData);
36
+ }
37
+ if (user && user.active) {
38
+ const session = randomUUID();
39
+ const accessToken = AuthUtils.generateToken(user.id.toString(), user.username, user.role.id, user.tenant?.id, session);
40
+ return { accessToken: accessToken };
41
+ }
42
+ else {
43
+ throw new BadCredentialsError();
44
+ }
45
+ }
28
46
  async changeUserPassword(userId, newPassword) {
29
47
  const user = await this.findById(userId);
30
48
  if (user) {
@@ -135,6 +153,16 @@ class UserService extends AbstractService {
135
153
  throw e;
136
154
  }
137
155
  }
156
+ async findByEmail(email) {
157
+ try {
158
+ const user = await this._repository.findByEmail(email);
159
+ return user;
160
+ }
161
+ catch (e) {
162
+ console.error("Error finding user by username", e);
163
+ throw e;
164
+ }
165
+ }
138
166
  async paginate({ page = 1, limit = 5, orderBy = '', order = false, search = '', filters = [] }) {
139
167
  try {
140
168
  const pagination = await this._repository.paginate({ page, limit, orderBy, order, search, filters });
package/package.json CHANGED
@@ -3,10 +3,10 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "0.7.22",
6
+ "version": "0.8.1",
7
7
  "description": "Identity module for user management, authentication and authorization.",
8
8
  "main": "dist/index.js",
9
- "types": "dist/types/index.d.ts",
9
+ "types": "types/index.d.ts",
10
10
  "type": "module",
11
11
  "scripts": {
12
12
  "prepublish": "tsc && npm run copygql",
@@ -28,10 +28,10 @@
28
28
  "author": "Cristian Incarnato & Drax Team",
29
29
  "license": "ISC",
30
30
  "dependencies": {
31
- "@drax/common-back": "^0.7.0",
32
- "@drax/crud-back": "^0.7.22",
33
- "@drax/crud-share": "^0.7.21",
34
- "@drax/identity-share": "^0.7.0",
31
+ "@drax/common-back": "^0.8.0",
32
+ "@drax/crud-back": "^0.8.1",
33
+ "@drax/crud-share": "^0.8.0",
34
+ "@drax/identity-share": "^0.8.0",
35
35
  "bcryptjs": "^2.4.3",
36
36
  "express-jwt": "^8.4.1",
37
37
  "graphql": "^16.8.2",
@@ -62,5 +62,5 @@
62
62
  "debug": "0"
63
63
  }
64
64
  },
65
- "gitHead": "cbe1b2d33284c511c3b52722a56af030aa36d03e"
65
+ "gitHead": "92afa3327c2d2d01b568a03b2c4e2ca1ebbe2e30"
66
66
  }
@@ -140,6 +140,8 @@ class UserController extends AbstractFastifyController<IUser, IUserCreate, IUser
140
140
  payload.tenant = request.rbac.getAuthUser.tenantId
141
141
  }
142
142
 
143
+ payload.origin ??= 'Admin'
144
+
143
145
  const userService = UserServiceFactory()
144
146
  let user = await userService.create(payload)
145
147
  return user
@@ -4,6 +4,7 @@ import {IDraxCrud, IDraxFieldFilter} from "@drax/crud-share";
4
4
  interface IUserRepository extends IDraxCrud<IUser, IUserCreate, IUserUpdate>{
5
5
  findById(id: string): Promise<IUser | null>;
6
6
  findByUsername(username: string): Promise<IUser | null>;
7
+ findByEmail(email: string): Promise<IUser | null>;
7
8
  changePassword(id: string, password:string):Promise<Boolean>;
8
9
  changeAvatar(id: string, avatarUrl: string): Promise<Boolean>;
9
10
  }
@@ -49,6 +49,7 @@ const UserSchema = new mongoose.Schema<IUser>({
49
49
  }
50
50
  },
51
51
  avatar: {type: String, required: false, index:false},
52
+
52
53
  role: {
53
54
  type: mongoose.Schema.Types.ObjectId,
54
55
  ref: 'Role',
@@ -61,6 +62,7 @@ const UserSchema = new mongoose.Schema<IUser>({
61
62
  required: false,
62
63
  index: false
63
64
  },
65
+ origin: {type: String, required: false, index:false},
64
66
  groups: [{
65
67
  type: mongoose.Schema.Types.ObjectId,
66
68
  ref: 'Group',
@@ -74,6 +74,11 @@ class UserMongoRepository implements IUserRepository {
74
74
  return user
75
75
  }
76
76
 
77
+ async findByEmail(email: string): Promise<IUser> {
78
+ const user: mongoose.HydratedDocument<IUser> = await UserModel.findOne({email: email}).populate(['role','tenant']).exec()
79
+ return user
80
+ }
81
+
77
82
  async paginate({
78
83
  page= 1,
79
84
  limit= 5,
@@ -27,6 +27,7 @@ const tableFields: SqliteTableField[] = [
27
27
  {name: "tenant", type: "TEXT", unique: false, primary: false},
28
28
  {name: "groups", type: "TEXT", unique: false, primary: false},
29
29
  {name: "avatar", type: "TEXT", unique: false, primary: false},
30
+ {name: "origin", type: "TEXT", unique: false, primary: false},
30
31
  {name: "createdAt", type: "TEXT", unique: false, primary: false},
31
32
  {name: "updatedAt", type: "TEXT", unique: false, primary: false}
32
33
  ]
@@ -150,6 +151,16 @@ class UserSqliteRepository implements IUserRepository {
150
151
  return user
151
152
  }
152
153
 
154
+ async findByEmail(email: string): Promise<IUser> {
155
+ const user = this.db.prepare('SELECT * FROM users WHERE email = ?').get(email);
156
+ if (!user) {
157
+ return null
158
+ }
159
+ user.role = await this.findRoleById(user.role)
160
+ user.tenant = await this.findTenantById(user.tenant)
161
+ return user
162
+ }
163
+
153
164
  async paginate({
154
165
  page= 1,
155
166
  limit= 5,
@@ -33,6 +33,26 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate>{
33
33
  }
34
34
  }
35
35
 
36
+ async authByEmail(email: string, createIfNotFound: boolean = false, userData: IUserCreate) {
37
+ let user = null
38
+ console.log("auth email", email)
39
+ user = await this.findByEmail(email)
40
+
41
+ if(!user && createIfNotFound){
42
+ userData.password = userData.password ? userData.password : randomUUID()
43
+ userData.active = userData.active === undefined ? true : userData.active
44
+ user = await this.create(userData)
45
+ }
46
+
47
+ if (user && user.active) {
48
+ const session = randomUUID()
49
+ const accessToken = AuthUtils.generateToken(user.id.toString(), user.username, user.role.id, user.tenant?.id, session)
50
+ return {accessToken: accessToken}
51
+ } else {
52
+ throw new BadCredentialsError()
53
+ }
54
+ }
55
+
36
56
  async changeUserPassword(userId: string, newPassword: string) {
37
57
  const user = await this.findById(userId)
38
58
  if (user) {
@@ -99,8 +119,6 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate>{
99
119
  }
100
120
  throw e
101
121
  }
102
-
103
-
104
122
  }
105
123
 
106
124
  async update(id: string, userData: IUserUpdate) {
@@ -160,6 +178,16 @@ class UserService extends AbstractService<IUser, IUserCreate, IUserUpdate>{
160
178
 
161
179
  }
162
180
 
181
+ async findByEmail(email: string): Promise<IUser | null> {
182
+ try {
183
+ const user: IUser = await this._repository.findByEmail(email);
184
+ return user
185
+ } catch (e) {
186
+ console.error("Error finding user by username", e)
187
+ throw e
188
+ }
189
+ }
190
+
163
191
  async paginate({
164
192
  page = 1,
165
193
  limit = 5,