@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,51 @@
1
+ import bcryptjs from "bcryptjs";
2
+ import jsonwebtoken, {SignOptions} from "jsonwebtoken";
3
+
4
+ class AuthUtils{
5
+
6
+ static hashPassword(password : string) :string {
7
+ if (!password) {
8
+ throw new Error("password must be provided")
9
+ }
10
+
11
+ let salt = bcryptjs.genSaltSync(10);
12
+ let hashPassword = bcryptjs.hashSync(password, salt);
13
+ return hashPassword;
14
+ }
15
+
16
+ static checkPassword(password : string, hashPassword : string) {
17
+ return bcryptjs.compareSync(password, hashPassword);
18
+ }
19
+
20
+ static tokenSignPayload(userId : string, username: string, session : string) {
21
+ return {
22
+ id: userId,
23
+ username: username,
24
+ session: session
25
+ };
26
+ }
27
+
28
+ static generateToken(userId : string, username: string, session : string) {
29
+ const payload = AuthUtils.tokenSignPayload(userId, username, session)
30
+
31
+ const JWT_SECRET = process.env.JWT_SECRET ? process.env.JWT_SECRET :'KRgDV3CeR5lVhsFF'
32
+
33
+ const options : SignOptions = {
34
+ expiresIn: process.env.JWT_LOGIN_EXPIRED_IN || '1h',
35
+ jwtid: userId,
36
+ algorithm: 'HS256',
37
+ audience: username,
38
+ issuer: process.env.ISSUER? process.env.ISSUER : 'drax'
39
+ }
40
+
41
+ let token = jsonwebtoken.sign(
42
+ payload,
43
+ JWT_SECRET,
44
+ options
45
+ )
46
+
47
+ return token
48
+ }
49
+ }
50
+
51
+ export default AuthUtils
@@ -0,0 +1,5 @@
1
+ {
2
+ "_id": "646a661e44c93567c23d8d62",
3
+ "name": "admin",
4
+ "permissions": []
5
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "username": "root",
3
+ "email": "root@example.com",
4
+ "password": "123",
5
+ "name": "root",
6
+ "role": "646a661e44c93567c23d8d62"
7
+ }
@@ -0,0 +1,12 @@
1
+ import {mongoose} from "@drax/common-back"
2
+ import {IRole} from "../../../src/interfaces/IRole"
3
+
4
+ const role: IRole = {
5
+ _id: new mongoose.Types.ObjectId("646a661e44c93567c23d8d62"),
6
+ name: "Admin",
7
+ permissions: [],
8
+ childRoles: [],
9
+ readonly: false
10
+ }
11
+
12
+ export default role
@@ -0,0 +1,15 @@
1
+ import {mongoose} from "@drax/common-back"
2
+ import {IUser} from "../../../src/interfaces/IUser"
3
+
4
+ const user: IUser = {
5
+ _id: new mongoose.Types.ObjectId("646a661e44c93567c23d8d61"),
6
+ active: false,
7
+ groups: [],
8
+ username: "root",
9
+ email: "root@example.com",
10
+ password: "123",
11
+ name: "root",
12
+ role: new mongoose.Types.ObjectId("646a661e44c93567c23d8d62")
13
+ }
14
+
15
+ export default user
@@ -0,0 +1,34 @@
1
+ import { mongoose } from '@drax/common-back';
2
+ import { MongoMemoryServer } from 'mongodb-memory-server';
3
+ const mongoServer = await MongoMemoryServer.create();
4
+ class MongoInMemory {
5
+ static async connect() {
6
+ if (mongoServer.state == "new") {
7
+ await mongoServer.start();
8
+ }
9
+ if (!mongoose.connection.readyState) {
10
+ await mongoose.connect(mongoServer.getUri(), { dbName: "verifyMASTER" });
11
+ }
12
+ return;
13
+ }
14
+ static get mongooseStatus() {
15
+ return mongoose.connection.readyState;
16
+ }
17
+ static get serverStatus() {
18
+ return mongoServer.state;
19
+ }
20
+ static get status() {
21
+ return mongoose.connection.readyState;
22
+ }
23
+ static async disconnect() {
24
+ await mongoose.disconnect();
25
+ }
26
+ static async DropAndClose() {
27
+ if (mongoServer) {
28
+ await mongoose.connection.dropDatabase();
29
+ await mongoose.connection.close();
30
+ await mongoServer.stop();
31
+ }
32
+ }
33
+ }
34
+ export default MongoInMemory;
@@ -0,0 +1,42 @@
1
+ import {mongoose} from '@drax/common-back';
2
+ import { MongoMemoryServer } from 'mongodb-memory-server';
3
+
4
+ const mongoServer = await MongoMemoryServer.create();
5
+
6
+ class MongoInMemory{
7
+
8
+ static async connect(){
9
+ if(mongoServer.state == "new"){
10
+ await mongoServer.start()
11
+ }
12
+ if(!mongoose.connection.readyState){
13
+ await mongoose.connect(mongoServer.getUri(), { dbName: "verifyMASTER" });
14
+ }
15
+ return
16
+ }
17
+ static get mongooseStatus(){
18
+ return mongoose.connection.readyState
19
+ }
20
+
21
+ static get serverStatus(){
22
+ return mongoServer.state
23
+ }
24
+
25
+ static get status(){
26
+ return mongoose.connection.readyState
27
+ }
28
+
29
+ static async disconnect(){
30
+ await mongoose.disconnect();
31
+ }
32
+
33
+ static async DropAndClose(){
34
+ if (mongoServer) {
35
+ await mongoose.connection.dropDatabase();
36
+ await mongoose.connection.close();
37
+ await mongoServer.stop();
38
+ }
39
+ }
40
+ }
41
+
42
+ export default MongoInMemory
@@ -0,0 +1,11 @@
1
+ import RoleService from "../../src/services/RoleService.mjs";
2
+ import RoleRepository from "../../src/repository/RoleRepository.mjs";
3
+ class RoleInitializer {
4
+ static async initAdminRole() {
5
+ const roleService = new RoleService(new RoleRepository());
6
+ let roleData = (await import("../data-obj/roles/admin-role.mjs")).default;
7
+ let roleCreated = await roleService.create(roleData);
8
+ return roleCreated;
9
+ }
10
+ }
11
+ export default RoleInitializer;
@@ -0,0 +1,15 @@
1
+ import RoleService from "../../src/services/RoleService";
2
+ import {IRole} from "../../src/interfaces/IRole";
3
+ import RoleRepository from "../../src/repository/RoleRepository";
4
+
5
+ class RoleInitializer{
6
+
7
+ static async initAdminRole(): Promise<IRole>{
8
+ const roleService = new RoleService(new RoleRepository())
9
+ let roleData = (await import("../data-obj/roles/admin-role")).default
10
+ let roleCreated = await roleService.create(roleData)
11
+ return roleCreated
12
+ }
13
+ }
14
+
15
+ export default RoleInitializer
@@ -0,0 +1,75 @@
1
+ import {describe,it, before, after} from "node:test"
2
+ import {equal} from "assert";
3
+ import RoleRepository from "../../src/repository/RoleRepository";
4
+ import MongoInMemory from "../initializers/MongoInMemory";
5
+ import {IRole} from "../../src/interfaces/IRole";
6
+ import {PaginateResult} from "mongoose";
7
+
8
+ describe("RoleRepositoryTest", function() {
9
+
10
+ const roleReposirory = new RoleRepository()
11
+
12
+ before(async () => {
13
+ await MongoInMemory.connect()
14
+ // console.log("BEFORE ROLE", MongoInMemory.mongooseStatus, MongoInMemory.serverStatus)
15
+ return
16
+ })
17
+
18
+ after(async () => {
19
+ await MongoInMemory.DropAndClose()
20
+ //console.log("AFTER ROLE", MongoInMemory.status, MongoInMemory.serverStatus)
21
+ return
22
+ })
23
+
24
+ it("Create a role successfully.", async function() {
25
+ let roleData = (await import("../data-obj/roles/admin-role")).default
26
+ let roleCreated: IRole = await roleReposirory.create(roleData)
27
+ equal(roleCreated.name,roleData.name)
28
+ })
29
+
30
+ it("Update a role successfully.", async function() {
31
+ let roleData = (await import("../data-obj/roles/admin-role")).default
32
+ roleData.name = "AdminUpdated"
33
+ let roleUpdated: IRole = await roleReposirory.update(roleData._id, roleData)
34
+ equal(roleUpdated.name,roleData.name)
35
+ })
36
+
37
+
38
+
39
+
40
+ it("Find role by ID successfully.", async function() {
41
+ let roleData = (await import("../data-obj/roles/admin-role")).default
42
+ let role: IRole = await roleReposirory.findById(roleData._id)
43
+ equal(role.name,roleData.name)
44
+ })
45
+
46
+ it("Retrieving all roles successfully.", async function() {
47
+ let roles: IRole[] = await roleReposirory.fetch()
48
+ equal(roles.length,1)
49
+ })
50
+
51
+ it("Paginate roles successfully.", async function() {
52
+ let paginateRoles: PaginateResult<IRole> = await roleReposirory.paginate()
53
+ equal(paginateRoles.docs.length,1)
54
+ equal(paginateRoles.totalDocs,1)
55
+ equal(paginateRoles.page,1)
56
+ })
57
+
58
+ it("Delete a role successfully.", async function() {
59
+ let roleData = (await import("../data-obj/roles/admin-role")).default
60
+ let roleDeleted: Boolean = await roleReposirory.delete(roleData._id)
61
+ equal(roleDeleted,true)
62
+ })
63
+
64
+ it("Fail create role when name has two spaces", async function() {
65
+ let roleData = (await import("../data-obj/roles/admin-role")).default
66
+ roleData.name = "Admin Role"
67
+ try{
68
+ let roleCreated: IRole = await roleReposirory.create(roleData)
69
+ equal("Not error throw it","Error expected")
70
+ }catch (e) {
71
+ equal(e.errors['name'].message,"Role name cant contain two spaces")
72
+ }
73
+
74
+ })
75
+ })
@@ -0,0 +1,54 @@
1
+ import {before, after, describe, it} from "node:test"
2
+ import {equal} from "assert";
3
+ import UserRepository from "../../src/repository/UserRepository";
4
+ import MongoInMemory from "../initializers/MongoInMemory";
5
+ import RoleInitializer from "../initializers/RoleInitializer";
6
+ import {IRole} from "../../src/interfaces/IRole";
7
+ import {IUser} from "../../src/interfaces/IUser";
8
+ import {PaginateResult} from "mongoose";
9
+
10
+ describe("UserRepositoryTest", function () {
11
+
12
+ let userRepository = new UserRepository()
13
+ let adminRole: IRole
14
+ let userAdminData: IUser
15
+
16
+ before(async () => {
17
+ await MongoInMemory.connect()
18
+ adminRole = await RoleInitializer.initAdminRole()
19
+ userAdminData = (await import("../data-obj/users/root-user")).default
20
+ //console.log("BEFORE USER", MongoInMemory.mongooseStatus, MongoInMemory.serverStatus)
21
+ return
22
+ })
23
+
24
+ after(async () => {
25
+ await MongoInMemory.DropAndClose()
26
+ //console.log("AFTER USER", MongoInMemory.status, MongoInMemory.serverStatus)
27
+ return
28
+ })
29
+
30
+ it("Create user successfully", async function () {
31
+ let userCreated = await userRepository.create(userAdminData)
32
+ equal(userCreated.username, userAdminData.username)
33
+ })
34
+
35
+ it("Update a user successfully.", async function() {
36
+ let adminData = (await import("../data-obj/users/root-user")).default
37
+ adminData.name = "AdminUpdated"
38
+ let userUpdated: IUser = await userRepository.update(adminData._id, adminData)
39
+ equal(userUpdated.name,userUpdated.name)
40
+ })
41
+
42
+ it("Find user by ID successfully", async function () {
43
+ let userCreated = await userRepository.findById(userAdminData._id)
44
+ equal(userCreated.username, userAdminData.username)
45
+ })
46
+
47
+ it("Paginate users successfully.", async function() {
48
+ let paginateUsers: PaginateResult<IUser> = await userRepository.paginate()
49
+ //console.log(paginateUsers)
50
+ equal(paginateUsers.docs.length,1)
51
+ equal(paginateUsers.totalDocs,1)
52
+ equal(paginateUsers.page,1)
53
+ })
54
+ })
@@ -0,0 +1,25 @@
1
+ import {describe, it, before, after} from "node:test"
2
+ import MongoInMemory from "../initializers/MongoInMemory";
3
+
4
+
5
+
6
+ describe("MockTest", function () {
7
+
8
+ before(async () => {
9
+ await MongoInMemory.connect()
10
+ console.log("BEFORE MOCK", MongoInMemory.mongooseStatus, MongoInMemory.serverStatus)
11
+ return
12
+ })
13
+
14
+ after(async () => {
15
+ await MongoInMemory.DropAndClose()
16
+ console.log("AFTER MOCK", MongoInMemory.status, MongoInMemory.serverStatus)
17
+ return
18
+ })
19
+
20
+
21
+ it("should create MOCK", function () {
22
+ console.log("should create mock")
23
+
24
+ })
25
+ })
@@ -0,0 +1,30 @@
1
+ import {describe,it, before, after} from "node:test"
2
+ import assert from "assert";
3
+ import RoleService from "../../src/services/RoleService";
4
+ import MongoInMemory from "../initializers/MongoInMemory";
5
+ import {IRole} from "../../src/interfaces/IRole";
6
+ import RoleRepository from "../../src/repository/RoleRepository";
7
+ import {IRoleRepository} from "../../src/interfaces/IRoleRepository";
8
+
9
+ describe("RoleServiceTest", function() {
10
+ let roleRepository: IRoleRepository = new RoleRepository()
11
+ let roleService = new RoleService(roleRepository)
12
+ before(async () => {
13
+ await MongoInMemory.connect()
14
+ console.log("BEFORE ROLE", MongoInMemory.mongooseStatus, MongoInMemory.serverStatus)
15
+ return
16
+ })
17
+
18
+ after(async () => {
19
+ await MongoInMemory.DropAndClose()
20
+ console.log("AFTER ROLE", MongoInMemory.status, MongoInMemory.serverStatus)
21
+ return
22
+ })
23
+
24
+ it("should create role", async function() {
25
+ let roleData = (await import("../data-obj/roles/admin-role")).default
26
+ let roleCreated: IRole = await roleService.create(roleData)
27
+
28
+ assert.equal(roleCreated.name,roleData.name)
29
+ })
30
+ })
@@ -0,0 +1,44 @@
1
+ import {before, after, describe, it} from "node:test"
2
+ import assert from "assert";
3
+ import UserService from "../../src/services/UserService";
4
+ import MongoInMemory from "../initializers/MongoInMemory";
5
+ import RoleInitializer from "../initializers/RoleInitializer";
6
+ import {IRole} from "../../src/interfaces/IRole";
7
+ import {IUser} from "../../src/interfaces/IUser";
8
+ import UserRepository from "../../src/repository/UserRepository";
9
+ import {IUserRepository} from "../../src/interfaces/IUserRepository";
10
+
11
+ describe("UserServiceTest", function () {
12
+ let userRepository: IUserRepository = new UserRepository()
13
+ let userService = new UserService(userRepository)
14
+ let adminRole: IRole
15
+ let userAdminData: IUser
16
+
17
+ before(async () => {
18
+ await MongoInMemory.connect()
19
+ adminRole = await RoleInitializer.initAdminRole()
20
+ userAdminData = (await import("../data-obj/users/root-user")).default
21
+ console.log("BEFORE USER", MongoInMemory.mongooseStatus, MongoInMemory.serverStatus)
22
+ return
23
+ })
24
+
25
+ after(async () => {
26
+ await MongoInMemory.DropAndClose()
27
+ console.log("AFTER USER", MongoInMemory.status, MongoInMemory.serverStatus)
28
+ return
29
+ })
30
+
31
+ it("should create user", async function () {
32
+
33
+ let userCreated = await userService.create(userAdminData)
34
+
35
+ assert.equal(userCreated.username, userAdminData.username)
36
+ })
37
+
38
+ it("should find one user", async function () {
39
+ let userCreated = await userService.findById(userAdminData._id)
40
+
41
+
42
+ assert.equal(userCreated.username, userAdminData.username)
43
+ })
44
+ })
package/tsconfig.json ADDED
@@ -0,0 +1,13 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist",
6
+ "declarationDir": "./types"
7
+ },
8
+ "exclude": ["test", "types","dist"],
9
+ "references": [{ "path": "../../common/common-back" }],
10
+ "ts-node": {
11
+ "esm": true
12
+ }
13
+ }