@drax/identity-back 0.0.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/factory/AuthServiceFactory.js +8 -0
- package/dist/factory/RoleServiceFactory.js +8 -0
- package/dist/factory/UserServiceFactory.js +8 -0
- package/dist/graphql/index.js +7 -0
- package/dist/graphql/resolvers/auth.resolvers.js +15 -0
- package/dist/graphql/resolvers/role.resolvers.js +23 -0
- package/dist/graphql/resolvers/user.resolvers.js +26 -0
- package/dist/graphql/types/auth.graphql +8 -0
- package/dist/graphql/types/role.graphql +32 -0
- package/dist/graphql/types/user.graphql +34 -0
- package/dist/index.js +12 -0
- package/dist/interfaces/IRole.js +1 -0
- package/dist/interfaces/IRoleRepository.js +1 -0
- package/dist/interfaces/IUser.js +1 -0
- package/dist/interfaces/IUserGroup.js +1 -0
- package/dist/interfaces/IUserRepository.js +1 -0
- package/dist/models/RoleModel.js +33 -0
- package/dist/models/UserGroupModel.js +33 -0
- package/dist/models/UserModel.js +79 -0
- package/dist/repository/RoleRepository.js +29 -0
- package/dist/repository/UserRepository.js +33 -0
- package/dist/services/AuthService.js +21 -0
- package/dist/services/RoleService.js +31 -0
- package/dist/services/UserService.js +43 -0
- package/dist/utils/AuthUtils.js +36 -0
- package/package.json +53 -0
- package/src/factory/AuthServiceFactory.ts +10 -0
- package/src/factory/RoleServiceFactory.ts +10 -0
- package/src/factory/UserServiceFactory.ts +10 -0
- package/src/graphql/index.ts +8 -0
- package/src/graphql/resolvers/auth.resolvers.ts +19 -0
- package/src/graphql/resolvers/role.resolvers.ts +25 -0
- package/src/graphql/resolvers/user.resolvers.ts +27 -0
- package/src/graphql/types/auth.graphql +8 -0
- package/src/graphql/types/role.graphql +32 -0
- package/src/graphql/types/user.graphql +34 -0
- package/src/index.ts +24 -0
- package/src/interfaces/IRole.ts +11 -0
- package/src/interfaces/IRoleRepository.ts +11 -0
- package/src/interfaces/IUser.ts +21 -0
- package/src/interfaces/IUserGroup.ts +10 -0
- package/src/interfaces/IUserRepository.ts +11 -0
- package/src/models/RoleModel.ts +48 -0
- package/src/models/UserGroupModel.ts +48 -0
- package/src/models/UserModel.ts +94 -0
- package/src/repository/RoleRepository.ts +42 -0
- package/src/repository/UserRepository.ts +47 -0
- package/src/services/AuthService.ts +29 -0
- package/src/services/RoleService.ts +51 -0
- package/src/services/UserService.ts +67 -0
- package/src/utils/AuthUtils.ts +51 -0
- package/test/data-json/roles/admin-role.json +5 -0
- package/test/data-json/users/root-user.json +7 -0
- package/test/data-obj/roles/admin-role.ts +12 -0
- package/test/data-obj/users/root-user.ts +15 -0
- package/test/initializers/MongoInMemory.mjs +34 -0
- package/test/initializers/MongoInMemory.ts +42 -0
- package/test/initializers/RoleInitializer.mjs +11 -0
- package/test/initializers/RoleInitializer.ts +15 -0
- package/test/repository/role-repository.test.ts +75 -0
- package/test/repository/user-repository.test.ts +54 -0
- package/test/service/mock-service.test.ts +25 -0
- package/test/service/role-service.test.ts +30 -0
- package/test/service/user-service.test.ts +44 -0
- package/tsconfig.json +13 -0
- package/tsconfig.tsbuildinfo +1 -0
- package/types/factory/AuthServiceFactory.d.ts +4 -0
- package/types/factory/AuthServiceFactory.d.ts.map +1 -0
- package/types/factory/RoleServiceFactory.d.ts +4 -0
- package/types/factory/RoleServiceFactory.d.ts.map +1 -0
- package/types/factory/UserServiceFactory.d.ts +4 -0
- package/types/factory/UserServiceFactory.d.ts.map +1 -0
- package/types/graphql/index.d.ts +6 -0
- package/types/graphql/index.d.ts.map +1 -0
- package/types/graphql/resolvers/auth.resolvers.d.ts +10 -0
- package/types/graphql/resolvers/auth.resolvers.d.ts.map +1 -0
- package/types/graphql/resolvers/role.resolvers.d.ts +25 -0
- package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -0
- package/types/graphql/resolvers/user.resolvers.d.ts +25 -0
- package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -0
- package/types/index.d.ts +7 -0
- package/types/index.d.ts.map +1 -0
- package/types/interfaces/IRole.d.ts +11 -0
- package/types/interfaces/IRole.d.ts.map +1 -0
- package/types/interfaces/IRoleRepository.d.ts +10 -0
- package/types/interfaces/IRoleRepository.d.ts.map +1 -0
- package/types/interfaces/IUser.d.ts +20 -0
- package/types/interfaces/IUser.d.ts.map +1 -0
- package/types/interfaces/IUserGroup.d.ts +10 -0
- package/types/interfaces/IUserGroup.d.ts.map +1 -0
- package/types/interfaces/IUserRepository.d.ts +11 -0
- package/types/interfaces/IUserRepository.d.ts.map +1 -0
- package/types/models/RoleModel.d.ts +16 -0
- package/types/models/RoleModel.d.ts.map +1 -0
- package/types/models/UserGroupModel.d.ts +16 -0
- package/types/models/UserGroupModel.d.ts.map +1 -0
- package/types/models/UserModel.d.ts +16 -0
- package/types/models/UserModel.d.ts.map +1 -0
- package/types/repository/RoleRepository.d.ts +41 -0
- package/types/repository/RoleRepository.d.ts.map +1 -0
- package/types/repository/UserRepository.d.ts +40 -0
- package/types/repository/UserRepository.d.ts.map +1 -0
- package/types/services/AuthService.d.ts +8 -0
- package/types/services/AuthService.d.ts.map +1 -0
- package/types/services/RoleService.d.ts +17 -0
- package/types/services/RoleService.d.ts.map +1 -0
- package/types/services/UserService.d.ts +18 -0
- package/types/services/UserService.d.ts.map +1 -0
- package/types/utils/AuthUtils.d.ts +12 -0
- package/types/utils/AuthUtils.d.ts.map +1 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import AuthServiceFactory from "../../factory/AuthServiceFactory.js";
|
|
2
|
+
|
|
3
|
+
const authService = AuthServiceFactory()
|
|
4
|
+
export default {
|
|
5
|
+
Query: {
|
|
6
|
+
|
|
7
|
+
},
|
|
8
|
+
Mutation: {
|
|
9
|
+
auth: async (_,{input}) => {
|
|
10
|
+
try{
|
|
11
|
+
return await authService.auth(input.username, input.password)
|
|
12
|
+
}catch (e) {
|
|
13
|
+
console.log(e)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
},
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import RoleServiceFactory from "../../factory/RoleServiceFactory.js";
|
|
2
|
+
|
|
3
|
+
const roleService = RoleServiceFactory()
|
|
4
|
+
export default {
|
|
5
|
+
Query: {
|
|
6
|
+
findRoleById: async (_,{id}) => {
|
|
7
|
+
return await roleService.findById(id)
|
|
8
|
+
},
|
|
9
|
+
paginateRole: async () => {
|
|
10
|
+
return await roleService.paginate()
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
Mutation: {
|
|
14
|
+
createRole: async (_,{input}) => {
|
|
15
|
+
return await roleService.create(input)
|
|
16
|
+
|
|
17
|
+
},
|
|
18
|
+
updateRole: async (_,{id, input}) => {
|
|
19
|
+
return await roleService.update(id, input)
|
|
20
|
+
},
|
|
21
|
+
deleteRole: async (_,{id}) => {
|
|
22
|
+
return await roleService.delete(id)
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import UserServiceFactory from "../../factory/UserServiceFactory.js";
|
|
2
|
+
|
|
3
|
+
const userService = UserServiceFactory()
|
|
4
|
+
export default {
|
|
5
|
+
Query: {
|
|
6
|
+
findUserById: async (_,{id}) => {
|
|
7
|
+
return await userService.findById(id)
|
|
8
|
+
},
|
|
9
|
+
paginateUser: async () => {
|
|
10
|
+
console.log("paginateUser")
|
|
11
|
+
return await userService.paginate()
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
Mutation: {
|
|
15
|
+
createUser: async (_,{input}) => {
|
|
16
|
+
console.log("createUser")
|
|
17
|
+
const user = await userService.create(input)
|
|
18
|
+
return user
|
|
19
|
+
},
|
|
20
|
+
updateUser: async (_,{id, input}) => {
|
|
21
|
+
return await userService.update(id, input)
|
|
22
|
+
},
|
|
23
|
+
deleteUser: async (_,{id}) => {
|
|
24
|
+
return await userService.delete(id)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
type Role {
|
|
2
|
+
_id: ID!
|
|
3
|
+
name: String
|
|
4
|
+
readonly: Boolean
|
|
5
|
+
childRoles: [Role]
|
|
6
|
+
permissions: [String]
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type RolePaginated{
|
|
10
|
+
totalDocs: Int
|
|
11
|
+
page: Int
|
|
12
|
+
limit: Int
|
|
13
|
+
docs: [Role]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
type Query{
|
|
17
|
+
paginateRole: RolePaginated
|
|
18
|
+
findRoleById(id: ID): Role
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
input RoleInput{
|
|
22
|
+
name: String
|
|
23
|
+
permissions: [String]
|
|
24
|
+
readonly: Boolean
|
|
25
|
+
childRoles: [ID]
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
type Mutation{
|
|
29
|
+
createRole(input: RoleInput): Role
|
|
30
|
+
updateRole(id: ID!, input: RoleInput): Role
|
|
31
|
+
deleteRole(id: ID!): Boolean
|
|
32
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
type User {
|
|
2
|
+
_id: ID!
|
|
3
|
+
username: String!
|
|
4
|
+
email: String
|
|
5
|
+
role: Role
|
|
6
|
+
phone: String
|
|
7
|
+
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
type UserPaginated{
|
|
11
|
+
totalDocs: Int
|
|
12
|
+
page: Int
|
|
13
|
+
limit: Int
|
|
14
|
+
docs: [User]
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
type Query{
|
|
18
|
+
findUserByUsername(username: String!): User
|
|
19
|
+
findUserById(id: ID!): User
|
|
20
|
+
paginateUser: UserPaginated
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
input UserInput{
|
|
24
|
+
username: String!
|
|
25
|
+
email: String!
|
|
26
|
+
password: String!
|
|
27
|
+
role: ID
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
type Mutation{
|
|
31
|
+
createUser(input: UserInput): User
|
|
32
|
+
updateUser(id: ID!, input: UserInput): User
|
|
33
|
+
deleteUser(id: ID!): Boolean
|
|
34
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import GraphqlMerge from "./graphql/index.js"
|
|
2
|
+
import UserServiceFactory from "./factory/UserServiceFactory.js";
|
|
3
|
+
import RoleServiceFactory from "./factory/RoleServiceFactory.js";
|
|
4
|
+
import AuthServiceFactory from "./factory/AuthServiceFactory.js";
|
|
5
|
+
|
|
6
|
+
const graphqlMergeResult = await GraphqlMerge()
|
|
7
|
+
const identityTypeDefs = await graphqlMergeResult.typeDefs;
|
|
8
|
+
const identityResolvers = await graphqlMergeResult.resolvers;
|
|
9
|
+
|
|
10
|
+
const userService = UserServiceFactory()
|
|
11
|
+
const roleService = RoleServiceFactory()
|
|
12
|
+
|
|
13
|
+
const authService = AuthServiceFactory()
|
|
14
|
+
|
|
15
|
+
export {
|
|
16
|
+
identityTypeDefs,
|
|
17
|
+
identityResolvers,
|
|
18
|
+
userService,
|
|
19
|
+
roleService,
|
|
20
|
+
authService
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
/// <reference types="index.d.ts" />
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {IRole} from './IRole'
|
|
2
|
+
interface IRoleRepository{
|
|
3
|
+
create(role: IRole): Promise<IRole>;
|
|
4
|
+
update(_id: any, updatedRole: IRole): Promise<IRole | null>;
|
|
5
|
+
delete(_id: any): Promise<boolean>;
|
|
6
|
+
findById(_id: any): Promise<IRole | null>;
|
|
7
|
+
|
|
8
|
+
paginate(query: any, options: any): any;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export {IRoleRepository}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import {mongoose} from "@drax/common-back";
|
|
2
|
+
import {IRole} from "./IRole";
|
|
3
|
+
import {IUserGroup} from "./IUserGroup";
|
|
4
|
+
|
|
5
|
+
interface IUser {
|
|
6
|
+
_id?: mongoose.Types.ObjectId
|
|
7
|
+
username: string
|
|
8
|
+
email: string
|
|
9
|
+
password: string
|
|
10
|
+
active: boolean
|
|
11
|
+
name?: string
|
|
12
|
+
phone?: string
|
|
13
|
+
avatar?: string
|
|
14
|
+
avatarurl?: string
|
|
15
|
+
code?: string
|
|
16
|
+
role: mongoose.Types.ObjectId | IRole
|
|
17
|
+
groups: mongoose.Types.ObjectId[] | IUserGroup[]
|
|
18
|
+
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export {IUser}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import {IUser} from './IUser'
|
|
2
|
+
interface IUserRepository{
|
|
3
|
+
create(role: IUser): Promise<IUser>;
|
|
4
|
+
update(_id: any, updatedRole: IUser): Promise<IUser | null>;
|
|
5
|
+
delete(_id: any): Promise<boolean>;
|
|
6
|
+
findById(_id: any): Promise<IUser | null>;
|
|
7
|
+
findByUsername(username: string): Promise<IUser | null>;
|
|
8
|
+
paginate(query: any, options: any): any;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export {IUserRepository}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {mongoose, MongooseSoftDelete} from '@drax/common-back';
|
|
2
|
+
import uniqueValidator from 'mongoose-unique-validator';
|
|
3
|
+
import mongoosePaginate from 'mongoose-paginate-v2'
|
|
4
|
+
import {IRole} from '../interfaces/IRole'
|
|
5
|
+
const Schema = mongoose.Schema
|
|
6
|
+
import {PaginateModel} from "mongoose";
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
const RoleSchema = new Schema<IRole>({
|
|
10
|
+
name: {
|
|
11
|
+
type: String, unique: true, required: true, index: true,
|
|
12
|
+
validate: [
|
|
13
|
+
{
|
|
14
|
+
validator: function(v) {
|
|
15
|
+
return !/(\s){2}/.test(v);
|
|
16
|
+
},
|
|
17
|
+
message: props => `Role name cant contain two spaces`
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
],
|
|
21
|
+
},
|
|
22
|
+
permissions: [{type: String, required: true}],
|
|
23
|
+
childRoles: [{
|
|
24
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
25
|
+
ref: 'Role',
|
|
26
|
+
required: false,
|
|
27
|
+
}],
|
|
28
|
+
readonly: {type: Boolean, required: false, default: false},
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
RoleSchema.plugin(uniqueValidator, {message: 'validation.unique'});
|
|
32
|
+
RoleSchema.plugin(MongooseSoftDelete);
|
|
33
|
+
RoleSchema.plugin(mongoosePaginate);
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
RoleSchema.set('toJSON', {getters: true});
|
|
37
|
+
|
|
38
|
+
const ROLE_MODEL_NAME = 'Role';
|
|
39
|
+
const ROLE_COLLECTION_NAME = 'roles';
|
|
40
|
+
const RoleModel = mongoose.model<IRole, PaginateModel<IRole>>(ROLE_MODEL_NAME, RoleSchema,ROLE_COLLECTION_NAME);
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
RoleSchema,
|
|
44
|
+
RoleModel
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default RoleModel
|
|
48
|
+
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import {mongoose, MongooseSoftDelete} from '@drax/common-back';
|
|
2
|
+
import {IUserGroup} from "../interfaces/IUserGroup";
|
|
3
|
+
import uniqueValidator from 'mongoose-unique-validator';
|
|
4
|
+
import mongoosePaginate from 'mongoose-paginate-v2'
|
|
5
|
+
import {PaginateModel} from "mongoose";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// Defining user Mongoose Schema
|
|
9
|
+
const UserGroupSchema = new mongoose.Schema<IUserGroup>({
|
|
10
|
+
name: {
|
|
11
|
+
type: String,
|
|
12
|
+
unique: true,
|
|
13
|
+
required: true,
|
|
14
|
+
index: true,
|
|
15
|
+
validate: {
|
|
16
|
+
validator: function (value: string) {
|
|
17
|
+
let r = /^[a-zA-Z0-9]+(?:\s[a-zA-Z0-9]+)*$/;
|
|
18
|
+
return r.test(value);
|
|
19
|
+
},
|
|
20
|
+
message: "Invalid name format"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
users: [{
|
|
24
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
25
|
+
ref: 'User',
|
|
26
|
+
required: false,
|
|
27
|
+
}],
|
|
28
|
+
}, {timestamps: true});
|
|
29
|
+
|
|
30
|
+
UserGroupSchema.set('toJSON', {getters: true});
|
|
31
|
+
|
|
32
|
+
UserGroupSchema.plugin(uniqueValidator, {message: 'validation.unique'});
|
|
33
|
+
|
|
34
|
+
UserGroupSchema.plugin(MongooseSoftDelete);
|
|
35
|
+
UserGroupSchema.plugin(mongoosePaginate);
|
|
36
|
+
|
|
37
|
+
const USERGROUP_MODEL_NAME = 'UserGroup';
|
|
38
|
+
const USERGROUP_COLLECTION_NAME = 'userGroups';
|
|
39
|
+
|
|
40
|
+
const UserGroupModel = mongoose.model<IUserGroup,PaginateModel<IUserGroup>>(USERGROUP_MODEL_NAME, UserGroupSchema,USERGROUP_COLLECTION_NAME);
|
|
41
|
+
|
|
42
|
+
export {
|
|
43
|
+
UserGroupSchema,
|
|
44
|
+
UserGroupModel
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default UserGroupModel
|
|
48
|
+
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import {mongoose, MongooseSoftDelete} from '@drax/common-back';
|
|
2
|
+
import {IUser} from "../interfaces/IUser";
|
|
3
|
+
import uniqueValidator from 'mongoose-unique-validator';
|
|
4
|
+
import mongoosePaginate from 'mongoose-paginate-v2'
|
|
5
|
+
import {PaginateModel} from "mongoose";
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// Defining user Mongoose Schema
|
|
9
|
+
const UserSchema = new mongoose.Schema<IUser>({
|
|
10
|
+
username: {
|
|
11
|
+
type: String,
|
|
12
|
+
unique: true,
|
|
13
|
+
required: true,
|
|
14
|
+
index: true,
|
|
15
|
+
validate: {
|
|
16
|
+
validator: function (value: string) {
|
|
17
|
+
let r = /^[a-zA-Z0-9]+$/;
|
|
18
|
+
return r.test(value);
|
|
19
|
+
},
|
|
20
|
+
message: "Invalid username format"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
email: {
|
|
24
|
+
type: String,
|
|
25
|
+
unique: true,
|
|
26
|
+
required: true,
|
|
27
|
+
index: true,
|
|
28
|
+
validate: {
|
|
29
|
+
validator: function (value: string) {
|
|
30
|
+
let r = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/;
|
|
31
|
+
return r.test(value);
|
|
32
|
+
},
|
|
33
|
+
message: "Invalid email format"
|
|
34
|
+
}
|
|
35
|
+
},
|
|
36
|
+
password: {type: String, required: true},
|
|
37
|
+
code: {type: String, required: false},
|
|
38
|
+
name: {type: String, required: false},
|
|
39
|
+
active: {type: Boolean, required: true, default: false},
|
|
40
|
+
phone: {
|
|
41
|
+
type: String,
|
|
42
|
+
required: false,
|
|
43
|
+
validate: {
|
|
44
|
+
validator: function (value: string) {
|
|
45
|
+
let r = /[0-9]+/;
|
|
46
|
+
return value ? r.test(value) : true;
|
|
47
|
+
},
|
|
48
|
+
message: "Invalid Phone format"
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
avatar: {type: String, required: false},
|
|
52
|
+
avatarurl: {type: String, required: false},
|
|
53
|
+
role: {
|
|
54
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
55
|
+
ref: 'Role',
|
|
56
|
+
required: true,
|
|
57
|
+
},
|
|
58
|
+
groups: [{
|
|
59
|
+
type: mongoose.Schema.Types.ObjectId,
|
|
60
|
+
ref: 'Group',
|
|
61
|
+
required: false,
|
|
62
|
+
}],
|
|
63
|
+
/* refreshToken: {
|
|
64
|
+
type: [
|
|
65
|
+
{
|
|
66
|
+
id: {type: String},
|
|
67
|
+
expiryDate: {type: Date},
|
|
68
|
+
sessionId: {type: String},
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
default: [],
|
|
72
|
+
_id: false
|
|
73
|
+
}*/
|
|
74
|
+
}, {timestamps: true});
|
|
75
|
+
|
|
76
|
+
UserSchema.set('toJSON', {getters: true});
|
|
77
|
+
|
|
78
|
+
UserSchema.plugin(uniqueValidator, {message: 'validation.unique'});
|
|
79
|
+
|
|
80
|
+
UserSchema.plugin(MongooseSoftDelete);
|
|
81
|
+
UserSchema.plugin(mongoosePaginate);
|
|
82
|
+
|
|
83
|
+
const USER_MODEL_NAME = 'User';
|
|
84
|
+
const USER_COLLECTION_NAME = 'users';
|
|
85
|
+
|
|
86
|
+
const UserModel = mongoose.model<IUser,PaginateModel<IUser>>(USER_MODEL_NAME, UserSchema,USER_COLLECTION_NAME);
|
|
87
|
+
|
|
88
|
+
export {
|
|
89
|
+
UserSchema,
|
|
90
|
+
UserModel
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
export default UserModel
|
|
94
|
+
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import {RoleModel} from "../models/RoleModel.js";
|
|
2
|
+
import {IRole} from '../interfaces/IRole'
|
|
3
|
+
import {IRoleRepository} from '../interfaces/IRoleRepository'
|
|
4
|
+
import {mongoose} from "@drax/common-back";
|
|
5
|
+
import {FilterQuery, PaginateOptions, PaginateResult} from "mongoose";
|
|
6
|
+
import {DeleteResult} from "mongodb";
|
|
7
|
+
|
|
8
|
+
class RoleRepository implements IRoleRepository{
|
|
9
|
+
|
|
10
|
+
async create(roleData: IRole): Promise<IRole> {
|
|
11
|
+
const role : mongoose.HydratedDocument<IRole> = new RoleModel(roleData)
|
|
12
|
+
await role.save()
|
|
13
|
+
return role
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async update(_id: mongoose.Types.ObjectId, roleData: IRole): Promise<IRole> {
|
|
17
|
+
const role : mongoose.HydratedDocument<IRole> = await RoleModel.findOneAndUpdate(_id, roleData, {new: true}).exec()
|
|
18
|
+
return role
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async delete(_id: mongoose.Types.ObjectId): Promise<boolean> {
|
|
22
|
+
const result : DeleteResult = await RoleModel.deleteOne(_id).exec()
|
|
23
|
+
return result.deletedCount == 1
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async findById(_id: mongoose.Types.ObjectId): Promise<IRole | null>{
|
|
27
|
+
const role: mongoose.HydratedDocument<IRole> | null = await RoleModel.findById(_id).exec()
|
|
28
|
+
return role
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async fetch(): Promise<IRole[]>{
|
|
32
|
+
const roles: mongoose.HydratedDocument<IRole>[] = await RoleModel.find().exec()
|
|
33
|
+
return roles
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async paginate(query ?: FilterQuery<IRole>, options ?: PaginateOptions): Promise<PaginateResult<IRole>>{
|
|
37
|
+
const roles: PaginateResult<IRole> = await RoleModel.paginate(query, options)
|
|
38
|
+
return roles
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export default RoleRepository
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import {UserModel} from "../models/UserModel.js";
|
|
2
|
+
import {mongoose} from "@drax/common-back"
|
|
3
|
+
import {FilterQuery, PaginateOptions, PaginateResult} from "mongoose";
|
|
4
|
+
import {IUser} from "../interfaces/IUser";
|
|
5
|
+
import {DeleteResult} from "mongodb";
|
|
6
|
+
|
|
7
|
+
class UserRepository {
|
|
8
|
+
|
|
9
|
+
async create(userData: IUser): Promise<IUser> {
|
|
10
|
+
const user: mongoose.HydratedDocument<IUser> = new UserModel(userData)
|
|
11
|
+
await user.save()
|
|
12
|
+
await user.populate('role')
|
|
13
|
+
return user
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
async update(_id: mongoose.Types.ObjectId, userData: IUser): Promise<IUser> {
|
|
17
|
+
const user: mongoose.HydratedDocument<IUser> = await UserModel.findOneAndUpdate(_id, userData).populate('role').exec()
|
|
18
|
+
return user
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
async delete(_id: mongoose.Types.ObjectId): Promise<boolean> {
|
|
22
|
+
const result: DeleteResult = await UserModel.deleteOne(_id).exec()
|
|
23
|
+
return result.deletedCount == 1
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async findById(_id: mongoose.Types.ObjectId): Promise<IUser> {
|
|
27
|
+
console.log("_id",_id)
|
|
28
|
+
const user: mongoose.HydratedDocument<IUser> = await UserModel.findById(_id).populate('role').exec()
|
|
29
|
+
console.log("user",user)
|
|
30
|
+
return user
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async findByUsername(username: string): Promise<IUser> {
|
|
34
|
+
const user: mongoose.HydratedDocument<IUser> = await UserModel.findOne({username: username}).populate('role').exec()
|
|
35
|
+
return user
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async paginate(query ?: FilterQuery<IUser>, options ?: PaginateOptions): Promise<PaginateResult<IUser>> {
|
|
39
|
+
|
|
40
|
+
options.populate = ['role']
|
|
41
|
+
|
|
42
|
+
const userPaginated: PaginateResult<IUser> = await UserModel.paginate(query, options)
|
|
43
|
+
return userPaginated
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export default UserRepository
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import UserService from "./UserService.js";
|
|
2
|
+
import AuthUtils from "../utils/AuthUtils.js";
|
|
3
|
+
class AuthService {
|
|
4
|
+
|
|
5
|
+
private _userService: UserService;
|
|
6
|
+
|
|
7
|
+
constructor(userService : UserService) {
|
|
8
|
+
this._userService = userService
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
async auth(username : string, password : string){
|
|
13
|
+
let user = null
|
|
14
|
+
|
|
15
|
+
user = await this._userService.findByUsername(username)
|
|
16
|
+
|
|
17
|
+
//Si obtuve usuario chequeo la password
|
|
18
|
+
if (user && AuthUtils.checkPassword(password, user.password)) {
|
|
19
|
+
//TODO: Generar Sesion
|
|
20
|
+
const session = '123'
|
|
21
|
+
const token = AuthUtils.generateToken(user._id.toString(), user.username, session)
|
|
22
|
+
return token
|
|
23
|
+
}else{
|
|
24
|
+
throw Error('BadCredentials')
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export default AuthService
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import {IRole} from "../interfaces/IRole";
|
|
2
|
+
import {IRoleRepository} from "../interfaces/IRoleRepository";
|
|
3
|
+
import { IPaginateFilter} from "@drax/common-back"
|
|
4
|
+
|
|
5
|
+
class RoleService {
|
|
6
|
+
|
|
7
|
+
_repository: IRoleRepository
|
|
8
|
+
|
|
9
|
+
constructor(roleRepostitory: IRoleRepository) {
|
|
10
|
+
this._repository = roleRepostitory
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
async create(roleData: IRole): Promise<IRole> {
|
|
14
|
+
const role = await this._repository.create(roleData)
|
|
15
|
+
return role
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
async update(_id: any, roleData: IRole) {
|
|
19
|
+
const role = await this._repository.update(_id, roleData)
|
|
20
|
+
return role
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
async delete(_id: any): Promise<boolean> {
|
|
24
|
+
const deletedRole = await this._repository.delete(_id);
|
|
25
|
+
return deletedRole;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
async findById(_id: any): Promise<IRole | null> {
|
|
29
|
+
const role : IRole = await this._repository.findById(_id);
|
|
30
|
+
return role
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async paginate(filters ?: IPaginateFilter, page: number = 1, limit: number = 10): Promise<{ roles: IRole[], totalCount: number }> {
|
|
34
|
+
|
|
35
|
+
const query = {
|
|
36
|
+
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const options = {
|
|
40
|
+
page: page,
|
|
41
|
+
limit: limit
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const pagination = await this._repository.paginate(query, options);
|
|
45
|
+
return pagination;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export default RoleService
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import {IPaginateFilter} from "@drax/common-back"
|
|
2
|
+
import {IUser} from "../interfaces/IUser";
|
|
3
|
+
import {IUserRepository} from "../interfaces/IUserRepository";
|
|
4
|
+
import AuthUtils from "../utils/AuthUtils.js";
|
|
5
|
+
|
|
6
|
+
class UserService {
|
|
7
|
+
|
|
8
|
+
_repository: IUserRepository
|
|
9
|
+
|
|
10
|
+
constructor(userRepository: IUserRepository) {
|
|
11
|
+
this._repository = userRepository;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
async create(userData: IUser): Promise<IUser> {
|
|
15
|
+
|
|
16
|
+
userData.name = userData?.name?.trim()
|
|
17
|
+
userData.username = userData.username.trim()
|
|
18
|
+
userData.password = AuthUtils.hashPassword(userData.password.trim())
|
|
19
|
+
|
|
20
|
+
const user: IUser = await this._repository.create(userData)
|
|
21
|
+
return user
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async update(_id: any, userData: IUser) {
|
|
25
|
+
|
|
26
|
+
userData.name = userData.name.trim()
|
|
27
|
+
userData.username = userData.username.trim()
|
|
28
|
+
delete userData.password
|
|
29
|
+
|
|
30
|
+
const user: IUser = await this._repository.update(_id, userData)
|
|
31
|
+
return user
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async delete(_id: any): Promise<boolean> {
|
|
35
|
+
const deletedRole: boolean = await this._repository.delete(_id);
|
|
36
|
+
return deletedRole;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async findById(_id: any): Promise<IUser | null> {
|
|
40
|
+
const user: IUser = await this._repository.findById(_id);
|
|
41
|
+
return user
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
async findByUsername(username: string): Promise<IUser | null> {
|
|
45
|
+
const user: IUser = await this._repository.findByUsername(username);
|
|
46
|
+
return user
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
async paginate(filters ?: IPaginateFilter, page : number = 1, limit : number = 10): Promise<{
|
|
50
|
+
roles: IUser[],
|
|
51
|
+
totalCount: number
|
|
52
|
+
}> {
|
|
53
|
+
|
|
54
|
+
const query = {}
|
|
55
|
+
|
|
56
|
+
const options = {
|
|
57
|
+
page: page,
|
|
58
|
+
limit: limit
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
const pagination = await this._repository.paginate(query, options);
|
|
62
|
+
console.log("pagination",pagination)
|
|
63
|
+
return pagination;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export default UserService
|