@culturefy/shared 1.0.28 → 1.0.29

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 (106) hide show
  1. package/build/cjs/dto/index.js +8 -0
  2. package/build/cjs/dto/index.js.map +1 -1
  3. package/build/cjs/index.js +6 -0
  4. package/build/cjs/index.js.map +1 -1
  5. package/build/cjs/interfaces/index.js +16 -0
  6. package/build/cjs/interfaces/index.js.map +1 -0
  7. package/build/cjs/interfaces/keycloak.js +2 -0
  8. package/build/cjs/interfaces/keycloak.js.map +1 -0
  9. package/build/cjs/interfaces/user.js +2 -0
  10. package/build/cjs/interfaces/user.js.map +1 -0
  11. package/build/cjs/middlewares/index.js +10 -0
  12. package/build/cjs/middlewares/index.js.map +1 -0
  13. package/build/cjs/middlewares/token-validation.js +485 -0
  14. package/build/cjs/middlewares/token-validation.js.map +1 -0
  15. package/build/cjs/models/user.model.js +507 -0
  16. package/build/cjs/models/user.model.js.map +1 -0
  17. package/build/cjs/service/keycloak.service.js +1003 -0
  18. package/build/cjs/service/keycloak.service.js.map +1 -0
  19. package/build/cjs/service/user.service.js +95 -0
  20. package/build/cjs/service/user.service.js.map +1 -0
  21. package/build/cjs/utils/index.js +6 -0
  22. package/build/cjs/utils/index.js.map +1 -1
  23. package/build/cjs/utils/jwt.js +14 -0
  24. package/build/cjs/utils/jwt.js.map +1 -0
  25. package/build/cjs/utils/response.js +19 -0
  26. package/build/cjs/utils/response.js.map +1 -1
  27. package/build/esm/dto/index.js +1 -1
  28. package/build/esm/dto/index.js.map +1 -1
  29. package/build/esm/index.js +1 -0
  30. package/build/esm/index.js.map +1 -1
  31. package/build/esm/interfaces/index.js +3 -0
  32. package/build/esm/interfaces/index.js.map +1 -0
  33. package/build/esm/interfaces/keycloak.js +2 -0
  34. package/build/esm/interfaces/keycloak.js.map +1 -0
  35. package/build/esm/interfaces/user.js +2 -0
  36. package/build/esm/interfaces/user.js.map +1 -0
  37. package/build/esm/middlewares/index.js +2 -0
  38. package/build/esm/middlewares/index.js.map +1 -0
  39. package/build/esm/middlewares/token-validation.js +481 -0
  40. package/build/esm/middlewares/token-validation.js.map +1 -0
  41. package/build/esm/models/user.model.js +497 -0
  42. package/build/esm/models/user.model.js.map +1 -0
  43. package/build/esm/service/keycloak.service.js +996 -0
  44. package/build/esm/service/keycloak.service.js.map +1 -0
  45. package/build/esm/service/user.service.js +91 -0
  46. package/build/esm/service/user.service.js.map +1 -0
  47. package/build/esm/utils/index.js +1 -0
  48. package/build/esm/utils/index.js.map +1 -1
  49. package/build/esm/utils/jwt.js +10 -0
  50. package/build/esm/utils/jwt.js.map +1 -0
  51. package/build/esm/utils/response.js +18 -0
  52. package/build/esm/utils/response.js.map +1 -1
  53. package/build/package.json +13 -2
  54. package/build/src/dto/index.d.ts +1 -0
  55. package/build/src/dto/index.js +3 -0
  56. package/build/src/dto/index.js.map +1 -1
  57. package/build/src/index.d.ts +1 -0
  58. package/build/src/index.js +1 -0
  59. package/build/src/index.js.map +1 -1
  60. package/build/src/interfaces/index.d.ts +2 -0
  61. package/build/src/interfaces/index.js +6 -0
  62. package/build/src/interfaces/index.js.map +1 -0
  63. package/build/src/interfaces/keycloak.d.ts +151 -0
  64. package/build/src/interfaces/keycloak.js +3 -0
  65. package/build/src/interfaces/keycloak.js.map +1 -0
  66. package/build/src/interfaces/user.d.ts +5 -0
  67. package/build/src/interfaces/user.js +3 -0
  68. package/build/src/interfaces/user.js.map +1 -0
  69. package/build/src/middlewares/index.d.ts +1 -0
  70. package/build/src/middlewares/index.js +5 -0
  71. package/build/src/middlewares/index.js.map +1 -0
  72. package/build/src/middlewares/token-validation.d.ts +17 -0
  73. package/build/src/middlewares/token-validation.js +329 -0
  74. package/build/src/middlewares/token-validation.js.map +1 -0
  75. package/build/src/models/user.model.d.ts +193 -0
  76. package/build/src/models/user.model.js +401 -0
  77. package/build/src/models/user.model.js.map +1 -0
  78. package/build/src/service/keycloak.service.d.ts +88 -0
  79. package/build/src/service/keycloak.service.js +1059 -0
  80. package/build/src/service/keycloak.service.js.map +1 -0
  81. package/build/src/service/user.service.d.ts +11 -0
  82. package/build/src/service/user.service.js +118 -0
  83. package/build/src/service/user.service.js.map +1 -0
  84. package/build/src/utils/index.d.ts +1 -0
  85. package/build/src/utils/index.js +1 -0
  86. package/build/src/utils/index.js.map +1 -1
  87. package/build/src/utils/jwt.d.ts +1 -0
  88. package/build/src/utils/jwt.js +14 -0
  89. package/build/src/utils/jwt.js.map +1 -0
  90. package/build/src/utils/response.d.ts +1 -0
  91. package/build/src/utils/response.js +19 -0
  92. package/build/src/utils/response.js.map +1 -1
  93. package/package.json +13 -2
  94. package/src/dto/index.ts +1 -0
  95. package/src/index.ts +2 -1
  96. package/src/interfaces/index.ts +2 -0
  97. package/src/interfaces/keycloak.ts +161 -0
  98. package/src/interfaces/user.ts +5 -0
  99. package/src/middlewares/index.ts +1 -0
  100. package/src/middlewares/token-validation.ts +456 -0
  101. package/src/models/user.model.ts +488 -0
  102. package/src/service/keycloak.service.ts +1104 -0
  103. package/src/service/user.service.ts +99 -0
  104. package/src/utils/index.ts +2 -1
  105. package/src/utils/jwt.ts +10 -0
  106. package/src/utils/response.ts +19 -0
@@ -0,0 +1,99 @@
1
+ import { Types } from "mongoose";
2
+ import { InvocationContext } from "@azure/functions";
3
+ import IUser, { UserModel } from "../models/user.model";
4
+ import { Initializers, WithDb } from "@culturefy/shared";
5
+
6
+ export class UserService extends Initializers {
7
+
8
+ private readonly schema = UserModel.schema;
9
+ constructor(context: InvocationContext, dbUrl:string) {
10
+ super(context, dbUrl);
11
+ }
12
+
13
+ private getModel() {
14
+ const connection = (this as any).getConnection();
15
+ if (!connection) {
16
+ throw new Error('Database connection not established');
17
+ }
18
+ return connection.model(UserModel.modelName, this.schema);
19
+ }
20
+
21
+ @WithDb
22
+ async getUserById(userId: string): Promise<IUser | null> {
23
+ try {
24
+ let model = this.getModel();
25
+ this.context.log("UserId:", JSON.stringify(userId));
26
+
27
+ // Handle both string and SchemaObjectId inputs
28
+ let objectId: Types.ObjectId;
29
+ if (typeof userId === 'string') {
30
+ objectId = new Types.ObjectId(userId);
31
+ } else {
32
+ // If it's already a SchemaObjectId, extract the string value
33
+ const userIdString = (userId as any).path || (userId as any).toString();
34
+ objectId = new Types.ObjectId(userIdString);
35
+ }
36
+
37
+ this.context.log("ObjectId:", JSON.stringify(objectId));
38
+ const user = await model.findById(objectId);
39
+ this.context.log("User:", JSON.stringify(user));
40
+ return user;
41
+ } catch (error) {
42
+ this.context.error("Error in getUserById", error);
43
+ throw error;
44
+ }
45
+ }
46
+
47
+ @WithDb
48
+ async getUserByBusinessId(businessId: string, email: string): Promise<IUser | null> {
49
+ try {
50
+ let model = this.getModel();
51
+ this.context.log("BusinessId:", JSON.stringify(businessId));
52
+ this.context.log("Email:", JSON.stringify(email));
53
+
54
+ if(!businessId) return null;
55
+ if(!email) return null;
56
+
57
+ businessId = businessId.toLowerCase();
58
+ businessId = businessId.trim();
59
+
60
+ email = email.toLowerCase();
61
+ email = email.trim();
62
+
63
+ // Handle both string and SchemaObjectId inputs
64
+ let objectId: Types.ObjectId;
65
+ if (typeof businessId === 'string') {
66
+ objectId = new Types.ObjectId(businessId);
67
+ } else {
68
+ // If it's already a SchemaObjectId, extract the string value
69
+ const businessIdString = (businessId as any).path || (businessId as any).toString();
70
+ objectId = new Types.ObjectId(businessIdString);
71
+ }
72
+
73
+ this.context.log("ObjectId:", JSON.stringify(objectId));
74
+ const user = await model.findOne({ businessId: objectId, email: email });
75
+ this.context.log("User:", JSON.stringify(user));
76
+ return user;
77
+ } catch (error) {
78
+ this.context.error("Error in getUserByBusinessId", error);
79
+ throw error;
80
+ }
81
+ }
82
+
83
+ @WithDb
84
+ async getUserByEmail(email: string) {
85
+ try {
86
+ let model = this.getModel();
87
+ this.context.log("Email:", JSON.stringify(email));
88
+
89
+ email = email.toLowerCase();
90
+ email = email.trim();
91
+ const user = await model.findOne({ email: email });
92
+ this.context.log("User:", JSON.stringify(user));
93
+ return user;
94
+ } catch (error) {
95
+ this.context.error("Error in getUserByEmail", error);
96
+ throw error;
97
+ }
98
+ }
99
+ }
@@ -1,4 +1,5 @@
1
1
  export * from './secrets';
2
2
  export * from './response';
3
3
  export * from './initializers';
4
- export * from './mapper';
4
+ export * from './mapper';
5
+ export * from './jwt';
@@ -0,0 +1,10 @@
1
+ import { jwtDecode } from "jwt-decode";
2
+
3
+ export function verifyJsonWebToken(token: string): Record<string, any> | false {
4
+ try {
5
+ const decoded = jwtDecode(token);
6
+ return decoded;
7
+ } catch (error: any) {
8
+ return false;
9
+ }
10
+ }
@@ -63,4 +63,23 @@ export function asyncHandler(handler: Function) {
63
63
  return sendResponse(500, null, error.message ? error.message : 'An unexpected error occurred');
64
64
  }
65
65
  };
66
+ }
67
+
68
+ // Parse cookies from request headers
69
+ export function parseCookies(req: any, context: InvocationContext): Record<string, any> {
70
+ // Convert Headers object to plain object for logging
71
+ const headersObj: Record<string, string> = {};
72
+ req.headers.forEach((value: string, key: string) => {
73
+ headersObj[key] = value;
74
+ });
75
+ context.info("Parse headers", JSON.stringify(headersObj));
76
+
77
+ const cookieHeader = req.headers.get("Cookie") || "";
78
+ context.info("Parse cookies", JSON.stringify(cookieHeader));
79
+ return cookieHeader.split(";").reduce((cookies: Record<string, any>, cookie: string) => {
80
+ const [name, ...rest] = cookie.split("=");
81
+ if (!name) return cookies;
82
+ cookies[name.trim()] = decodeURIComponent(rest.join("="));
83
+ return cookies;
84
+ }, {});
66
85
  }