@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.
Files changed (110) hide show
  1. package/dist/factory/AuthServiceFactory.js +8 -0
  2. package/dist/factory/RoleServiceFactory.js +8 -0
  3. package/dist/factory/UserServiceFactory.js +8 -0
  4. package/dist/graphql/index.js +7 -0
  5. package/dist/graphql/resolvers/auth.resolvers.js +15 -0
  6. package/dist/graphql/resolvers/role.resolvers.js +23 -0
  7. package/dist/graphql/resolvers/user.resolvers.js +26 -0
  8. package/dist/graphql/types/auth.graphql +8 -0
  9. package/dist/graphql/types/role.graphql +32 -0
  10. package/dist/graphql/types/user.graphql +34 -0
  11. package/dist/index.js +12 -0
  12. package/dist/interfaces/IRole.js +1 -0
  13. package/dist/interfaces/IRoleRepository.js +1 -0
  14. package/dist/interfaces/IUser.js +1 -0
  15. package/dist/interfaces/IUserGroup.js +1 -0
  16. package/dist/interfaces/IUserRepository.js +1 -0
  17. package/dist/models/RoleModel.js +33 -0
  18. package/dist/models/UserGroupModel.js +33 -0
  19. package/dist/models/UserModel.js +79 -0
  20. package/dist/repository/RoleRepository.js +29 -0
  21. package/dist/repository/UserRepository.js +33 -0
  22. package/dist/services/AuthService.js +21 -0
  23. package/dist/services/RoleService.js +31 -0
  24. package/dist/services/UserService.js +43 -0
  25. package/dist/utils/AuthUtils.js +36 -0
  26. package/package.json +53 -0
  27. package/src/factory/AuthServiceFactory.ts +10 -0
  28. package/src/factory/RoleServiceFactory.ts +10 -0
  29. package/src/factory/UserServiceFactory.ts +10 -0
  30. package/src/graphql/index.ts +8 -0
  31. package/src/graphql/resolvers/auth.resolvers.ts +19 -0
  32. package/src/graphql/resolvers/role.resolvers.ts +25 -0
  33. package/src/graphql/resolvers/user.resolvers.ts +27 -0
  34. package/src/graphql/types/auth.graphql +8 -0
  35. package/src/graphql/types/role.graphql +32 -0
  36. package/src/graphql/types/user.graphql +34 -0
  37. package/src/index.ts +24 -0
  38. package/src/interfaces/IRole.ts +11 -0
  39. package/src/interfaces/IRoleRepository.ts +11 -0
  40. package/src/interfaces/IUser.ts +21 -0
  41. package/src/interfaces/IUserGroup.ts +10 -0
  42. package/src/interfaces/IUserRepository.ts +11 -0
  43. package/src/models/RoleModel.ts +48 -0
  44. package/src/models/UserGroupModel.ts +48 -0
  45. package/src/models/UserModel.ts +94 -0
  46. package/src/repository/RoleRepository.ts +42 -0
  47. package/src/repository/UserRepository.ts +47 -0
  48. package/src/services/AuthService.ts +29 -0
  49. package/src/services/RoleService.ts +51 -0
  50. package/src/services/UserService.ts +67 -0
  51. package/src/utils/AuthUtils.ts +51 -0
  52. package/test/data-json/roles/admin-role.json +5 -0
  53. package/test/data-json/users/root-user.json +7 -0
  54. package/test/data-obj/roles/admin-role.ts +12 -0
  55. package/test/data-obj/users/root-user.ts +15 -0
  56. package/test/initializers/MongoInMemory.mjs +34 -0
  57. package/test/initializers/MongoInMemory.ts +42 -0
  58. package/test/initializers/RoleInitializer.mjs +11 -0
  59. package/test/initializers/RoleInitializer.ts +15 -0
  60. package/test/repository/role-repository.test.ts +75 -0
  61. package/test/repository/user-repository.test.ts +54 -0
  62. package/test/service/mock-service.test.ts +25 -0
  63. package/test/service/role-service.test.ts +30 -0
  64. package/test/service/user-service.test.ts +44 -0
  65. package/tsconfig.json +13 -0
  66. package/tsconfig.tsbuildinfo +1 -0
  67. package/types/factory/AuthServiceFactory.d.ts +4 -0
  68. package/types/factory/AuthServiceFactory.d.ts.map +1 -0
  69. package/types/factory/RoleServiceFactory.d.ts +4 -0
  70. package/types/factory/RoleServiceFactory.d.ts.map +1 -0
  71. package/types/factory/UserServiceFactory.d.ts +4 -0
  72. package/types/factory/UserServiceFactory.d.ts.map +1 -0
  73. package/types/graphql/index.d.ts +6 -0
  74. package/types/graphql/index.d.ts.map +1 -0
  75. package/types/graphql/resolvers/auth.resolvers.d.ts +10 -0
  76. package/types/graphql/resolvers/auth.resolvers.d.ts.map +1 -0
  77. package/types/graphql/resolvers/role.resolvers.d.ts +25 -0
  78. package/types/graphql/resolvers/role.resolvers.d.ts.map +1 -0
  79. package/types/graphql/resolvers/user.resolvers.d.ts +25 -0
  80. package/types/graphql/resolvers/user.resolvers.d.ts.map +1 -0
  81. package/types/index.d.ts +7 -0
  82. package/types/index.d.ts.map +1 -0
  83. package/types/interfaces/IRole.d.ts +11 -0
  84. package/types/interfaces/IRole.d.ts.map +1 -0
  85. package/types/interfaces/IRoleRepository.d.ts +10 -0
  86. package/types/interfaces/IRoleRepository.d.ts.map +1 -0
  87. package/types/interfaces/IUser.d.ts +20 -0
  88. package/types/interfaces/IUser.d.ts.map +1 -0
  89. package/types/interfaces/IUserGroup.d.ts +10 -0
  90. package/types/interfaces/IUserGroup.d.ts.map +1 -0
  91. package/types/interfaces/IUserRepository.d.ts +11 -0
  92. package/types/interfaces/IUserRepository.d.ts.map +1 -0
  93. package/types/models/RoleModel.d.ts +16 -0
  94. package/types/models/RoleModel.d.ts.map +1 -0
  95. package/types/models/UserGroupModel.d.ts +16 -0
  96. package/types/models/UserGroupModel.d.ts.map +1 -0
  97. package/types/models/UserModel.d.ts +16 -0
  98. package/types/models/UserModel.d.ts.map +1 -0
  99. package/types/repository/RoleRepository.d.ts +41 -0
  100. package/types/repository/RoleRepository.d.ts.map +1 -0
  101. package/types/repository/UserRepository.d.ts +40 -0
  102. package/types/repository/UserRepository.d.ts.map +1 -0
  103. package/types/services/AuthService.d.ts +8 -0
  104. package/types/services/AuthService.d.ts.map +1 -0
  105. package/types/services/RoleService.d.ts +17 -0
  106. package/types/services/RoleService.d.ts.map +1 -0
  107. package/types/services/UserService.d.ts +18 -0
  108. package/types/services/UserService.d.ts.map +1 -0
  109. package/types/utils/AuthUtils.d.ts +12 -0
  110. package/types/utils/AuthUtils.d.ts.map +1 -0
@@ -0,0 +1,8 @@
1
+ import AuthService from "../services/AuthService.js";
2
+ import UserServiceFactory from "./UserServiceFactory.js";
3
+ const AuthServiceFactory = () => {
4
+ const userService = UserServiceFactory();
5
+ const authService = new AuthService(userService);
6
+ return authService;
7
+ };
8
+ export default AuthServiceFactory;
@@ -0,0 +1,8 @@
1
+ import RoleService from "../services/RoleService.js";
2
+ import RoleRepository from "../repository/RoleRepository.js";
3
+ const RoleServiceFactory = () => {
4
+ const roleRepository = new RoleRepository;
5
+ const roleService = new RoleService(roleRepository);
6
+ return roleService;
7
+ };
8
+ export default RoleServiceFactory;
@@ -0,0 +1,8 @@
1
+ import UserRepository from "../repository/UserRepository.js";
2
+ import UserService from "../services/UserService.js";
3
+ const UserServiceFactory = () => {
4
+ const userRepository = new UserRepository;
5
+ const userService = new UserService(userRepository);
6
+ return userService;
7
+ };
8
+ export default UserServiceFactory;
@@ -0,0 +1,7 @@
1
+ import { GraphqlMerger } from "@drax/common-back";
2
+ export default async () => {
3
+ const __dirname = new URL(".", import.meta.url).pathname;
4
+ const typeDefs = GraphqlMerger.mergeTypeDefs(__dirname);
5
+ const resolvers = GraphqlMerger.mergeResolvers(__dirname);
6
+ return { typeDefs, resolvers };
7
+ };
@@ -0,0 +1,15 @@
1
+ import AuthServiceFactory from "../../factory/AuthServiceFactory.js";
2
+ const authService = AuthServiceFactory();
3
+ export default {
4
+ Query: {},
5
+ Mutation: {
6
+ auth: async (_, { input }) => {
7
+ try {
8
+ return await authService.auth(input.username, input.password);
9
+ }
10
+ catch (e) {
11
+ console.log(e);
12
+ }
13
+ },
14
+ }
15
+ };
@@ -0,0 +1,23 @@
1
+ import RoleServiceFactory from "../../factory/RoleServiceFactory.js";
2
+ const roleService = RoleServiceFactory();
3
+ export default {
4
+ Query: {
5
+ findRoleById: async (_, { id }) => {
6
+ return await roleService.findById(id);
7
+ },
8
+ paginateRole: async () => {
9
+ return await roleService.paginate();
10
+ }
11
+ },
12
+ Mutation: {
13
+ createRole: async (_, { input }) => {
14
+ return await roleService.create(input);
15
+ },
16
+ updateRole: async (_, { id, input }) => {
17
+ return await roleService.update(id, input);
18
+ },
19
+ deleteRole: async (_, { id }) => {
20
+ return await roleService.delete(id);
21
+ }
22
+ }
23
+ };
@@ -0,0 +1,26 @@
1
+ import UserServiceFactory from "../../factory/UserServiceFactory.js";
2
+ const userService = UserServiceFactory();
3
+ export default {
4
+ Query: {
5
+ findUserById: async (_, { id }) => {
6
+ return await userService.findById(id);
7
+ },
8
+ paginateUser: async () => {
9
+ console.log("paginateUser");
10
+ return await userService.paginate();
11
+ }
12
+ },
13
+ Mutation: {
14
+ createUser: async (_, { input }) => {
15
+ console.log("createUser");
16
+ const user = await userService.create(input);
17
+ return user;
18
+ },
19
+ updateUser: async (_, { id, input }) => {
20
+ return await userService.update(id, input);
21
+ },
22
+ deleteUser: async (_, { id }) => {
23
+ return await userService.delete(id);
24
+ }
25
+ }
26
+ };
@@ -0,0 +1,8 @@
1
+ input AuthInput{
2
+ username: String!
3
+ password: String!
4
+ }
5
+
6
+ type Mutation{
7
+ auth(input: AuthInput): String
8
+ }
@@ -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/dist/index.js ADDED
@@ -0,0 +1,12 @@
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
+ const graphqlMergeResult = await GraphqlMerge();
6
+ const identityTypeDefs = await graphqlMergeResult.typeDefs;
7
+ const identityResolvers = await graphqlMergeResult.resolvers;
8
+ const userService = UserServiceFactory();
9
+ const roleService = RoleServiceFactory();
10
+ const authService = AuthServiceFactory();
11
+ export { identityTypeDefs, identityResolvers, userService, roleService, authService };
12
+ /// <reference types="index.d.ts" />
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,33 @@
1
+ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
+ import uniqueValidator from 'mongoose-unique-validator';
3
+ import mongoosePaginate from 'mongoose-paginate-v2';
4
+ const Schema = mongoose.Schema;
5
+ const RoleSchema = new Schema({
6
+ name: {
7
+ type: String, unique: true, required: true, index: true,
8
+ validate: [
9
+ {
10
+ validator: function (v) {
11
+ return !/(\s){2}/.test(v);
12
+ },
13
+ message: props => `Role name cant contain two spaces`
14
+ },
15
+ ],
16
+ },
17
+ permissions: [{ type: String, required: true }],
18
+ childRoles: [{
19
+ type: mongoose.Schema.Types.ObjectId,
20
+ ref: 'Role',
21
+ required: false,
22
+ }],
23
+ readonly: { type: Boolean, required: false, default: false },
24
+ });
25
+ RoleSchema.plugin(uniqueValidator, { message: 'validation.unique' });
26
+ RoleSchema.plugin(MongooseSoftDelete);
27
+ RoleSchema.plugin(mongoosePaginate);
28
+ RoleSchema.set('toJSON', { getters: true });
29
+ const ROLE_MODEL_NAME = 'Role';
30
+ const ROLE_COLLECTION_NAME = 'roles';
31
+ const RoleModel = mongoose.model(ROLE_MODEL_NAME, RoleSchema, ROLE_COLLECTION_NAME);
32
+ export { RoleSchema, RoleModel };
33
+ export default RoleModel;
@@ -0,0 +1,33 @@
1
+ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
+ import uniqueValidator from 'mongoose-unique-validator';
3
+ import mongoosePaginate from 'mongoose-paginate-v2';
4
+ // Defining user Mongoose Schema
5
+ const UserGroupSchema = new mongoose.Schema({
6
+ name: {
7
+ type: String,
8
+ unique: true,
9
+ required: true,
10
+ index: true,
11
+ validate: {
12
+ validator: function (value) {
13
+ let r = /^[a-zA-Z0-9]+(?:\s[a-zA-Z0-9]+)*$/;
14
+ return r.test(value);
15
+ },
16
+ message: "Invalid name format"
17
+ }
18
+ },
19
+ users: [{
20
+ type: mongoose.Schema.Types.ObjectId,
21
+ ref: 'User',
22
+ required: false,
23
+ }],
24
+ }, { timestamps: true });
25
+ UserGroupSchema.set('toJSON', { getters: true });
26
+ UserGroupSchema.plugin(uniqueValidator, { message: 'validation.unique' });
27
+ UserGroupSchema.plugin(MongooseSoftDelete);
28
+ UserGroupSchema.plugin(mongoosePaginate);
29
+ const USERGROUP_MODEL_NAME = 'UserGroup';
30
+ const USERGROUP_COLLECTION_NAME = 'userGroups';
31
+ const UserGroupModel = mongoose.model(USERGROUP_MODEL_NAME, UserGroupSchema, USERGROUP_COLLECTION_NAME);
32
+ export { UserGroupSchema, UserGroupModel };
33
+ export default UserGroupModel;
@@ -0,0 +1,79 @@
1
+ import { mongoose, MongooseSoftDelete } from '@drax/common-back';
2
+ import uniqueValidator from 'mongoose-unique-validator';
3
+ import mongoosePaginate from 'mongoose-paginate-v2';
4
+ // Defining user Mongoose Schema
5
+ const UserSchema = new mongoose.Schema({
6
+ username: {
7
+ type: String,
8
+ unique: true,
9
+ required: true,
10
+ index: true,
11
+ validate: {
12
+ validator: function (value) {
13
+ let r = /^[a-zA-Z0-9]+$/;
14
+ return r.test(value);
15
+ },
16
+ message: "Invalid username format"
17
+ }
18
+ },
19
+ email: {
20
+ type: String,
21
+ unique: true,
22
+ required: true,
23
+ index: true,
24
+ validate: {
25
+ validator: function (value) {
26
+ 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])?/;
27
+ return r.test(value);
28
+ },
29
+ message: "Invalid email format"
30
+ }
31
+ },
32
+ password: { type: String, required: true },
33
+ code: { type: String, required: false },
34
+ name: { type: String, required: false },
35
+ active: { type: Boolean, required: true, default: false },
36
+ phone: {
37
+ type: String,
38
+ required: false,
39
+ validate: {
40
+ validator: function (value) {
41
+ let r = /[0-9]+/;
42
+ return value ? r.test(value) : true;
43
+ },
44
+ message: "Invalid Phone format"
45
+ }
46
+ },
47
+ avatar: { type: String, required: false },
48
+ avatarurl: { type: String, required: false },
49
+ role: {
50
+ type: mongoose.Schema.Types.ObjectId,
51
+ ref: 'Role',
52
+ required: true,
53
+ },
54
+ groups: [{
55
+ type: mongoose.Schema.Types.ObjectId,
56
+ ref: 'Group',
57
+ required: false,
58
+ }],
59
+ /* refreshToken: {
60
+ type: [
61
+ {
62
+ id: {type: String},
63
+ expiryDate: {type: Date},
64
+ sessionId: {type: String},
65
+ }
66
+ ],
67
+ default: [],
68
+ _id: false
69
+ }*/
70
+ }, { timestamps: true });
71
+ UserSchema.set('toJSON', { getters: true });
72
+ UserSchema.plugin(uniqueValidator, { message: 'validation.unique' });
73
+ UserSchema.plugin(MongooseSoftDelete);
74
+ UserSchema.plugin(mongoosePaginate);
75
+ const USER_MODEL_NAME = 'User';
76
+ const USER_COLLECTION_NAME = 'users';
77
+ const UserModel = mongoose.model(USER_MODEL_NAME, UserSchema, USER_COLLECTION_NAME);
78
+ export { UserSchema, UserModel };
79
+ export default UserModel;
@@ -0,0 +1,29 @@
1
+ import { RoleModel } from "../models/RoleModel.js";
2
+ class RoleRepository {
3
+ async create(roleData) {
4
+ const role = new RoleModel(roleData);
5
+ await role.save();
6
+ return role;
7
+ }
8
+ async update(_id, roleData) {
9
+ const role = await RoleModel.findOneAndUpdate(_id, roleData, { new: true }).exec();
10
+ return role;
11
+ }
12
+ async delete(_id) {
13
+ const result = await RoleModel.deleteOne(_id).exec();
14
+ return result.deletedCount == 1;
15
+ }
16
+ async findById(_id) {
17
+ const role = await RoleModel.findById(_id).exec();
18
+ return role;
19
+ }
20
+ async fetch() {
21
+ const roles = await RoleModel.find().exec();
22
+ return roles;
23
+ }
24
+ async paginate(query, options) {
25
+ const roles = await RoleModel.paginate(query, options);
26
+ return roles;
27
+ }
28
+ }
29
+ export default RoleRepository;
@@ -0,0 +1,33 @@
1
+ import { UserModel } from "../models/UserModel.js";
2
+ class UserRepository {
3
+ async create(userData) {
4
+ const user = new UserModel(userData);
5
+ await user.save();
6
+ await user.populate('role');
7
+ return user;
8
+ }
9
+ async update(_id, userData) {
10
+ const user = await UserModel.findOneAndUpdate(_id, userData).populate('role').exec();
11
+ return user;
12
+ }
13
+ async delete(_id) {
14
+ const result = await UserModel.deleteOne(_id).exec();
15
+ return result.deletedCount == 1;
16
+ }
17
+ async findById(_id) {
18
+ console.log("_id", _id);
19
+ const user = await UserModel.findById(_id).populate('role').exec();
20
+ console.log("user", user);
21
+ return user;
22
+ }
23
+ async findByUsername(username) {
24
+ const user = await UserModel.findOne({ username: username }).populate('role').exec();
25
+ return user;
26
+ }
27
+ async paginate(query, options) {
28
+ options.populate = ['role'];
29
+ const userPaginated = await UserModel.paginate(query, options);
30
+ return userPaginated;
31
+ }
32
+ }
33
+ export default UserRepository;
@@ -0,0 +1,21 @@
1
+ import AuthUtils from "../utils/AuthUtils.js";
2
+ class AuthService {
3
+ constructor(userService) {
4
+ this._userService = userService;
5
+ }
6
+ async auth(username, password) {
7
+ let user = null;
8
+ user = await this._userService.findByUsername(username);
9
+ //Si obtuve usuario chequeo la password
10
+ if (user && AuthUtils.checkPassword(password, user.password)) {
11
+ //TODO: Generar Sesion
12
+ const session = '123';
13
+ const token = AuthUtils.generateToken(user._id.toString(), user.username, session);
14
+ return token;
15
+ }
16
+ else {
17
+ throw Error('BadCredentials');
18
+ }
19
+ }
20
+ }
21
+ export default AuthService;
@@ -0,0 +1,31 @@
1
+ class RoleService {
2
+ constructor(roleRepostitory) {
3
+ this._repository = roleRepostitory;
4
+ }
5
+ async create(roleData) {
6
+ const role = await this._repository.create(roleData);
7
+ return role;
8
+ }
9
+ async update(_id, roleData) {
10
+ const role = await this._repository.update(_id, roleData);
11
+ return role;
12
+ }
13
+ async delete(_id) {
14
+ const deletedRole = await this._repository.delete(_id);
15
+ return deletedRole;
16
+ }
17
+ async findById(_id) {
18
+ const role = await this._repository.findById(_id);
19
+ return role;
20
+ }
21
+ async paginate(filters, page = 1, limit = 10) {
22
+ const query = {};
23
+ const options = {
24
+ page: page,
25
+ limit: limit
26
+ };
27
+ const pagination = await this._repository.paginate(query, options);
28
+ return pagination;
29
+ }
30
+ }
31
+ export default RoleService;
@@ -0,0 +1,43 @@
1
+ import AuthUtils from "../utils/AuthUtils.js";
2
+ class UserService {
3
+ constructor(userRepository) {
4
+ this._repository = userRepository;
5
+ }
6
+ async create(userData) {
7
+ userData.name = userData?.name?.trim();
8
+ userData.username = userData.username.trim();
9
+ userData.password = AuthUtils.hashPassword(userData.password.trim());
10
+ const user = await this._repository.create(userData);
11
+ return user;
12
+ }
13
+ async update(_id, userData) {
14
+ userData.name = userData.name.trim();
15
+ userData.username = userData.username.trim();
16
+ delete userData.password;
17
+ const user = await this._repository.update(_id, userData);
18
+ return user;
19
+ }
20
+ async delete(_id) {
21
+ const deletedRole = await this._repository.delete(_id);
22
+ return deletedRole;
23
+ }
24
+ async findById(_id) {
25
+ const user = await this._repository.findById(_id);
26
+ return user;
27
+ }
28
+ async findByUsername(username) {
29
+ const user = await this._repository.findByUsername(username);
30
+ return user;
31
+ }
32
+ async paginate(filters, page = 1, limit = 10) {
33
+ const query = {};
34
+ const options = {
35
+ page: page,
36
+ limit: limit
37
+ };
38
+ const pagination = await this._repository.paginate(query, options);
39
+ console.log("pagination", pagination);
40
+ return pagination;
41
+ }
42
+ }
43
+ export default UserService;
@@ -0,0 +1,36 @@
1
+ import bcryptjs from "bcryptjs";
2
+ import jsonwebtoken from "jsonwebtoken";
3
+ class AuthUtils {
4
+ static hashPassword(password) {
5
+ if (!password) {
6
+ throw new Error("password must be provided");
7
+ }
8
+ let salt = bcryptjs.genSaltSync(10);
9
+ let hashPassword = bcryptjs.hashSync(password, salt);
10
+ return hashPassword;
11
+ }
12
+ static checkPassword(password, hashPassword) {
13
+ return bcryptjs.compareSync(password, hashPassword);
14
+ }
15
+ static tokenSignPayload(userId, username, session) {
16
+ return {
17
+ id: userId,
18
+ username: username,
19
+ session: session
20
+ };
21
+ }
22
+ static generateToken(userId, username, session) {
23
+ const payload = AuthUtils.tokenSignPayload(userId, username, session);
24
+ const JWT_SECRET = process.env.JWT_SECRET ? process.env.JWT_SECRET : 'KRgDV3CeR5lVhsFF';
25
+ const options = {
26
+ expiresIn: process.env.JWT_LOGIN_EXPIRED_IN || '1h',
27
+ jwtid: userId,
28
+ algorithm: 'HS256',
29
+ audience: username,
30
+ issuer: process.env.ISSUER ? process.env.ISSUER : 'drax'
31
+ };
32
+ let token = jsonwebtoken.sign(payload, JWT_SECRET, options);
33
+ return token;
34
+ }
35
+ }
36
+ export default AuthUtils;
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@drax/identity-back",
3
+ "publishConfig": {
4
+ "access": "public"
5
+ },
6
+ "version": "0.0.3",
7
+ "description": "Identity module for user management, authentication and authorization.",
8
+ "main": "dist/index.js",
9
+ "types": "types/index.d.ts",
10
+ "type": "module",
11
+ "scripts": {
12
+ "serve": "nodemon --exec node --loader ts-node/esm src/index.ts",
13
+ "prepublish": "npm run tsc && npm run copygql",
14
+ "clean": "rm -rf dist",
15
+ "copygql": "copyfiles -u 1 ./**/*.graphql dist/",
16
+ "tsc": "tsc -b tsconfig.json",
17
+ "test": "node --loader tsx --test test/**/*",
18
+ "testRepositoryRole": "node --loader tsx --test test/repository/role*",
19
+ "testServiceRole": "node --loader tsx --test test/service/role*",
20
+ "testRepositoryUser": "node --loader tsx --test test/repository/user*",
21
+ "testServiceUser": "node --loader tsx --test test/service/user*",
22
+ "testcoverage": "node --loader tsx --experimental-test-coverage test/service/*"
23
+ },
24
+ "author": "Cristian Incarnato & Drax Team",
25
+ "license": "ISC",
26
+ "dependencies": {
27
+ "bcryptjs": "^2.4.3",
28
+ "express-jwt": "^8.4.1",
29
+ "jsonwebtoken": "^9.0.2"
30
+ },
31
+ "peerDependencies": {
32
+ "mongoose": "^8.3.4",
33
+ "mongoose-paginate-v2": "^1.8.0",
34
+ "mongoose-unique-validator": "^5.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/bcryptjs": "^2.4.6",
38
+ "@types/node": "^20.12.10",
39
+ "copyfiles": "^2.4.1",
40
+ "glob": "^10.2.6",
41
+ "mongodb-memory-server": "^9.2.0",
42
+ "nodemon": "^3.1.0",
43
+ "ts-node": "^10.9.2",
44
+ "tsx": "^3.12.7",
45
+ "typescript": "^5.4.5"
46
+ },
47
+ "config": {
48
+ "mongodbMemoryServer": {
49
+ "debug": "0"
50
+ }
51
+ },
52
+ "gitHead": "f47b34b60c6b1392c0ad671461645fa55e5b649b"
53
+ }
@@ -0,0 +1,10 @@
1
+ import AuthService from "../services/AuthService.js";
2
+ import UserServiceFactory from "./UserServiceFactory.js";
3
+
4
+ const AuthServiceFactory = () : AuthService => {
5
+ const userService = UserServiceFactory()
6
+ const authService = new AuthService(userService)
7
+ return authService
8
+ }
9
+
10
+ export default AuthServiceFactory
@@ -0,0 +1,10 @@
1
+ import RoleService from "../services/RoleService.js";
2
+ import RoleRepository from "../repository/RoleRepository.js";
3
+
4
+ const RoleServiceFactory = () : RoleService => {
5
+ const roleRepository = new RoleRepository
6
+ const roleService = new RoleService(roleRepository)
7
+ return roleService
8
+ }
9
+
10
+ export default RoleServiceFactory
@@ -0,0 +1,10 @@
1
+ import UserRepository from "../repository/UserRepository.js";
2
+ import UserService from "../services/UserService.js";
3
+
4
+ const UserServiceFactory = () : UserService => {
5
+ const userRepository = new UserRepository
6
+ const userService = new UserService(userRepository)
7
+ return userService
8
+ }
9
+
10
+ export default UserServiceFactory
@@ -0,0 +1,8 @@
1
+ import {GraphqlMerger} from "@drax/common-back"
2
+
3
+ export default async () => {
4
+ const __dirname = new URL(".", import.meta.url).pathname;
5
+ const typeDefs = GraphqlMerger.mergeTypeDefs(__dirname)
6
+ const resolvers = GraphqlMerger.mergeResolvers(__dirname)
7
+ return {typeDefs, resolvers}
8
+ }