@drax/identity-back 0.7.22 → 0.8.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.
- package/dist/controllers/UserController.js +1 -0
- package/dist/models/UserModel.js +1 -0
- package/dist/repository/mongo/UserMongoRepository.js +4 -0
- package/dist/repository/sqlite/UserSqliteRepository.js +10 -0
- package/dist/services/UserService.js +28 -0
- package/package.json +6 -6
- package/src/controllers/UserController.ts +2 -0
- package/src/interfaces/IUserRepository.ts +1 -0
- package/src/models/UserModel.ts +2 -0
- package/src/repository/mongo/UserMongoRepository.ts +5 -0
- package/src/repository/sqlite/UserSqliteRepository.ts +11 -0
- package/src/services/UserService.ts +30 -2
- package/tsconfig.tsbuildinfo +1 -1
- package/types/controllers/UserController.d.ts.map +1 -1
- package/types/interfaces/IUserRepository.d.ts +1 -0
- package/types/interfaces/IUserRepository.d.ts.map +1 -1
- package/types/models/UserModel.d.ts.map +1 -1
- package/types/repository/mongo/UserMongoRepository.d.ts +1 -0
- package/types/repository/mongo/UserMongoRepository.d.ts.map +1 -1
- package/types/repository/sqlite/UserSqliteRepository.d.ts +1 -0
- package/types/repository/sqlite/UserSqliteRepository.d.ts.map +1 -1
- package/types/services/UserService.d.ts +4 -0
- package/types/services/UserService.d.ts.map +1 -1
|
@@ -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;
|
package/dist/models/UserModel.js
CHANGED
|
@@ -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,7 +3,7 @@
|
|
|
3
3
|
"publishConfig": {
|
|
4
4
|
"access": "public"
|
|
5
5
|
},
|
|
6
|
-
"version": "0.
|
|
6
|
+
"version": "0.8.0",
|
|
7
7
|
"description": "Identity module for user management, authentication and authorization.",
|
|
8
8
|
"main": "dist/index.js",
|
|
9
9
|
"types": "dist/types/index.d.ts",
|
|
@@ -28,10 +28,10 @@
|
|
|
28
28
|
"author": "Cristian Incarnato & Drax Team",
|
|
29
29
|
"license": "ISC",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@drax/common-back": "^0.
|
|
32
|
-
"@drax/crud-back": "^0.
|
|
33
|
-
"@drax/crud-share": "^0.
|
|
34
|
-
"@drax/identity-share": "^0.
|
|
31
|
+
"@drax/common-back": "^0.8.0",
|
|
32
|
+
"@drax/crud-back": "^0.8.0",
|
|
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": "
|
|
65
|
+
"gitHead": "4c5c82ae5a92ea25c75f821b5aa1e64126b131cb"
|
|
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
|
}
|
package/src/models/UserModel.ts
CHANGED
|
@@ -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,
|