@alacard-project/shared 1.0.0 → 1.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 (180) hide show
  1. package/dist/config/base-config.service.d.ts +25 -0
  2. package/dist/config/base-config.service.js +87 -0
  3. package/dist/config/base-config.service.js.map +1 -0
  4. package/dist/constants/auth-config.constants.d.ts +8 -0
  5. package/dist/constants/auth-config.constants.js +12 -0
  6. package/dist/constants/auth-config.constants.js.map +1 -0
  7. package/dist/constants/auth.constants.d.ts +31 -0
  8. package/dist/constants/auth.constants.js +35 -0
  9. package/dist/constants/auth.constants.js.map +1 -0
  10. package/dist/constants/common.constants.d.ts +8 -0
  11. package/dist/constants/common.constants.js +12 -0
  12. package/dist/constants/common.constants.js.map +1 -0
  13. package/dist/constants/env.constants.d.ts +21 -4
  14. package/dist/constants/env.constants.js +21 -4
  15. package/dist/constants/env.constants.js.map +1 -1
  16. package/dist/constants/error-messages.d.ts +1 -0
  17. package/dist/constants/error-messages.js +13 -0
  18. package/dist/constants/error-messages.js.map +1 -0
  19. package/dist/constants/grpc.constants.d.ts +26 -0
  20. package/dist/constants/grpc.constants.js +26 -0
  21. package/dist/constants/grpc.constants.js.map +1 -1
  22. package/dist/constants/index.d.ts +10 -2
  23. package/dist/constants/index.js +10 -2
  24. package/dist/constants/index.js.map +1 -1
  25. package/dist/constants/logging-messages.constants.d.ts +12 -0
  26. package/dist/constants/logging-messages.constants.js +16 -0
  27. package/dist/constants/logging-messages.constants.js.map +1 -0
  28. package/dist/constants/microservices.constants.d.ts +18 -0
  29. package/dist/constants/microservices.constants.js +22 -0
  30. package/dist/constants/microservices.constants.js.map +1 -0
  31. package/dist/constants/monitoring.constants.d.ts +51 -0
  32. package/dist/constants/monitoring.constants.js +55 -0
  33. package/dist/constants/monitoring.constants.js.map +1 -0
  34. package/dist/constants/routes.constants.d.ts +20 -0
  35. package/dist/constants/routes.constants.js +24 -0
  36. package/dist/constants/routes.constants.js.map +1 -0
  37. package/dist/constants/tokens.constants.d.ts +6 -0
  38. package/dist/constants/tokens.constants.js +10 -0
  39. package/dist/constants/tokens.constants.js.map +1 -0
  40. package/dist/contracts/auth.contract.d.ts +88 -0
  41. package/dist/contracts/auth.contract.js +3 -0
  42. package/dist/contracts/auth.contract.js.map +1 -0
  43. package/dist/contracts/index.d.ts +1 -0
  44. package/dist/contracts/index.js +1 -0
  45. package/dist/contracts/index.js.map +1 -1
  46. package/dist/decorators/scopes.decorator.d.ts +2 -0
  47. package/dist/decorators/scopes.decorator.js +8 -0
  48. package/dist/decorators/scopes.decorator.js.map +1 -0
  49. package/dist/dto/auth.dto.d.ts +41 -0
  50. package/dist/dto/auth.dto.js +53 -0
  51. package/dist/dto/auth.dto.js.map +1 -0
  52. package/dist/dto/index.d.ts +2 -0
  53. package/dist/dto/index.js +19 -0
  54. package/dist/dto/index.js.map +1 -0
  55. package/dist/dto/logging.dto.d.ts +29 -0
  56. package/dist/dto/logging.dto.js +146 -0
  57. package/dist/dto/logging.dto.js.map +1 -0
  58. package/dist/enums/{environment.enum.js → env.enum.js} +1 -1
  59. package/dist/enums/env.enum.js.map +1 -0
  60. package/dist/enums/error.enum.d.ts +19 -0
  61. package/dist/enums/error.enum.js +24 -0
  62. package/dist/enums/error.enum.js.map +1 -0
  63. package/dist/enums/events.enum.d.ts +20 -0
  64. package/dist/enums/events.enum.js +14 -0
  65. package/dist/enums/events.enum.js.map +1 -0
  66. package/dist/enums/health.enum.d.ts +7 -0
  67. package/dist/enums/health.enum.js +12 -0
  68. package/dist/enums/health.enum.js.map +1 -0
  69. package/dist/enums/index.d.ts +8 -5
  70. package/dist/enums/index.js +8 -5
  71. package/dist/enums/index.js.map +1 -1
  72. package/dist/enums/{log-level.enum.js → logging.enum.js} +1 -1
  73. package/dist/enums/logging.enum.js.map +1 -0
  74. package/dist/enums/{notification-type.enum.js → notification.enum.js} +1 -1
  75. package/dist/enums/notification.enum.js.map +1 -0
  76. package/dist/enums/permission.enum.d.ts +18 -0
  77. package/dist/enums/permission.enum.js +23 -0
  78. package/dist/enums/permission.enum.js.map +1 -0
  79. package/dist/enums/user.enum.d.ts +8 -0
  80. package/dist/enums/{user-role.enum.js → user.enum.js} +4 -2
  81. package/dist/enums/user.enum.js.map +1 -0
  82. package/dist/errors/app.error.d.ts +17 -0
  83. package/dist/errors/app.error.js +29 -0
  84. package/dist/errors/app.error.js.map +1 -0
  85. package/dist/errors/error-map.d.ts +7 -0
  86. package/dist/errors/error-map.js +92 -0
  87. package/dist/errors/error-map.js.map +1 -0
  88. package/dist/index.d.ts +10 -1
  89. package/dist/index.js +10 -1
  90. package/dist/index.js.map +1 -1
  91. package/dist/types/auth.types.d.ts +5 -0
  92. package/dist/types/config.types.d.ts +3 -2
  93. package/dist/types/index.d.ts +2 -0
  94. package/dist/types/index.js +2 -0
  95. package/dist/types/index.js.map +1 -1
  96. package/dist/types/monitoring.types.d.ts +60 -0
  97. package/dist/types/monitoring.types.js +3 -0
  98. package/dist/types/monitoring.types.js.map +1 -0
  99. package/dist/types/user.types.d.ts +10 -0
  100. package/dist/types/user.types.js +3 -0
  101. package/dist/types/user.types.js.map +1 -0
  102. package/dist/utils/app.utils.d.ts +8 -0
  103. package/dist/utils/app.utils.js +25 -0
  104. package/dist/utils/app.utils.js.map +1 -0
  105. package/dist/utils/health.utils.d.ts +8 -0
  106. package/dist/utils/health.utils.js +60 -0
  107. package/dist/utils/health.utils.js.map +1 -0
  108. package/dist/utils/logging-client.d.ts +7 -0
  109. package/dist/utils/logging-client.js +22 -0
  110. package/dist/utils/logging-client.js.map +1 -0
  111. package/dist/utils/prometheus.utils.d.ts +9 -0
  112. package/dist/utils/prometheus.utils.js +66 -0
  113. package/dist/utils/prometheus.utils.js.map +1 -0
  114. package/dist/utils/user.utils.d.ts +1 -0
  115. package/dist/utils/user.utils.js +7 -0
  116. package/dist/utils/user.utils.js.map +1 -0
  117. package/package.json +9 -8
  118. package/src/config/base-config.service.ts +101 -0
  119. package/src/constants/auth-config.constants.ts +9 -0
  120. package/src/constants/auth.constants.ts +34 -0
  121. package/src/constants/common.constants.ts +9 -0
  122. package/src/constants/env.constants.ts +21 -4
  123. package/src/constants/error-messages.ts +10 -0
  124. package/src/constants/grpc.constants.ts +26 -0
  125. package/src/constants/index.ts +10 -2
  126. package/src/constants/logging-messages.constants.ts +15 -0
  127. package/src/constants/microservices.constants.ts +18 -0
  128. package/src/constants/monitoring.constants.ts +71 -0
  129. package/src/constants/routes.constants.ts +21 -0
  130. package/src/constants/tokens.constants.ts +6 -0
  131. package/src/contracts/auth.contract.ts +98 -0
  132. package/src/contracts/index.ts +1 -0
  133. package/src/decorators/scopes.decorator.ts +4 -0
  134. package/src/dto/auth.dto.ts +62 -0
  135. package/src/dto/index.ts +2 -0
  136. package/src/{logging/dto/log-filter.dto.ts → dto/logging.dto.ts} +1 -1
  137. package/src/enums/error.enum.ts +26 -0
  138. package/src/enums/events.enum.ts +22 -0
  139. package/src/enums/health.enum.ts +7 -0
  140. package/src/enums/index.ts +8 -5
  141. package/src/enums/permission.enum.ts +31 -0
  142. package/src/enums/{user-role.enum.ts → user.enum.ts} +3 -1
  143. package/src/errors/app.error.ts +33 -0
  144. package/src/errors/error-map.ts +95 -0
  145. package/src/index.ts +10 -1
  146. package/src/types/auth.types.ts +5 -0
  147. package/src/types/config.types.ts +4 -2
  148. package/src/types/index.ts +2 -1
  149. package/src/types/monitoring.types.ts +79 -0
  150. package/src/types/user.types.ts +11 -0
  151. package/src/utils/app.utils.ts +54 -0
  152. package/src/utils/health.utils.ts +72 -0
  153. package/src/utils/logging-client.ts +21 -0
  154. package/src/utils/prometheus.utils.ts +114 -0
  155. package/src/utils/user.utils.ts +3 -0
  156. package/dist/constants/services.constants.d.ts +0 -6
  157. package/dist/constants/services.constants.js +0 -10
  158. package/dist/constants/services.constants.js.map +0 -1
  159. package/dist/enums/environment.enum.js.map +0 -1
  160. package/dist/enums/error-code.enum.d.ts +0 -8
  161. package/dist/enums/error-code.enum.js +0 -13
  162. package/dist/enums/error-code.enum.js.map +0 -1
  163. package/dist/enums/log-level.enum.js.map +0 -1
  164. package/dist/enums/notification-type.enum.js.map +0 -1
  165. package/dist/enums/user-role.enum.d.ts +0 -6
  166. package/dist/enums/user-role.enum.js.map +0 -1
  167. package/dist/logging/enums/log-level.enum.d.ts +0 -7
  168. package/dist/logging/enums/log-level.enum.js +0 -12
  169. package/dist/logging/enums/log-level.enum.js.map +0 -1
  170. package/dist/tsconfig.tsbuildinfo +0 -1
  171. package/proto/token.proto +0 -50
  172. package/src/constants/services.constants.ts +0 -6
  173. package/src/enums/error-code.enum.ts +0 -8
  174. package/src/logging/index.ts +0 -1
  175. /package/dist/enums/{environment.enum.d.ts → env.enum.d.ts} +0 -0
  176. /package/dist/enums/{log-level.enum.d.ts → logging.enum.d.ts} +0 -0
  177. /package/dist/enums/{notification-type.enum.d.ts → notification.enum.d.ts} +0 -0
  178. /package/src/enums/{environment.enum.ts → env.enum.ts} +0 -0
  179. /package/src/enums/{log-level.enum.ts → logging.enum.ts} +0 -0
  180. /package/src/enums/{notification-type.enum.ts → notification.enum.ts} +0 -0
@@ -0,0 +1,7 @@
1
+ export declare class LoggingClient {
2
+ logInfo(message: string, context?: any): void;
3
+ logWarn(message: string, context?: any): void;
4
+ logError(message: string, context?: any): void;
5
+ logUserAction(userId: string, email: string, action: string, resource: string, details?: any): void;
6
+ updateServiceStatus(serviceName: string, status: string, version: string, uptime: number, metadata?: string): void;
7
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.LoggingClient = void 0;
4
+ class LoggingClient {
5
+ logInfo(message, context) {
6
+ console.log(`[INFO] ${message}`, context || '');
7
+ }
8
+ logWarn(message, context) {
9
+ console.warn(`[WARN] ${message}`, context || '');
10
+ }
11
+ logError(message, context) {
12
+ console.error(`[ERROR] ${message}`, context || '');
13
+ }
14
+ logUserAction(userId, email, action, resource, details) {
15
+ console.log(`[USER_ACTION] ${action} by ${email} (${userId}) on ${resource}`, details || '');
16
+ }
17
+ updateServiceStatus(serviceName, status, version, uptime, metadata) {
18
+ console.log(`[SERVICE_STATUS] ${serviceName} is ${status} (v${version}, uptime: ${uptime}s)`, metadata || '');
19
+ }
20
+ }
21
+ exports.LoggingClient = LoggingClient;
22
+ //# sourceMappingURL=logging-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logging-client.js","sourceRoot":"","sources":["../../src/utils/logging-client.ts"],"names":[],"mappings":";;;AAAA,MAAa,aAAa;IACtB,OAAO,CAAC,OAAe,EAAE,OAAa;QAClC,OAAO,CAAC,GAAG,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,CAAC,OAAe,EAAE,OAAa;QAClC,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,QAAQ,CAAC,OAAe,EAAE,OAAa;QACnC,OAAO,CAAC,KAAK,CAAC,WAAW,OAAO,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,aAAa,CAAC,MAAc,EAAE,KAAa,EAAE,MAAc,EAAE,QAAgB,EAAE,OAAa;QACxF,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAAM,OAAO,KAAK,KAAK,MAAM,QAAQ,QAAQ,EAAE,EAAE,OAAO,IAAI,EAAE,CAAC,CAAC;IACjG,CAAC;IAED,mBAAmB,CAAC,WAAmB,EAAE,MAAc,EAAE,OAAe,EAAE,MAAc,EAAE,QAAiB;QACvG,OAAO,CAAC,GAAG,CAAC,oBAAoB,WAAW,OAAO,MAAM,MAAM,OAAO,aAAa,MAAM,IAAI,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC;IAClH,CAAC;CACJ;AApBD,sCAoBC"}
@@ -0,0 +1,9 @@
1
+ import { PrometheusMetric, MetricValue } from '../types/monitoring.types';
2
+ export declare function formatPrometheusMetric(metric: PrometheusMetric, value: MetricValue): string;
3
+ export declare function createCounter(name: string, help: string, labelNames?: string[]): PrometheusMetric;
4
+ export declare function createGauge(name: string, help: string, labelNames?: string[]): PrometheusMetric;
5
+ export declare function createHistogram(name: string, help: string, labelNames?: string[]): PrometheusMetric;
6
+ export declare function calculatePercentile(values: number[], percentile: number): number;
7
+ export declare function formatDuration(milliseconds: number): number;
8
+ export declare function bytesToMegabytes(bytes: number): number;
9
+ export declare function calculateErrorRate(errorCount: number, totalCount: number): number;
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatPrometheusMetric = formatPrometheusMetric;
4
+ exports.createCounter = createCounter;
5
+ exports.createGauge = createGauge;
6
+ exports.createHistogram = createHistogram;
7
+ exports.calculatePercentile = calculatePercentile;
8
+ exports.formatDuration = formatDuration;
9
+ exports.bytesToMegabytes = bytesToMegabytes;
10
+ exports.calculateErrorRate = calculateErrorRate;
11
+ function formatPrometheusMetric(metric, value) {
12
+ const labels = value.labels
13
+ ? Object.entries(value.labels)
14
+ .map(([key, val]) => `${key}="${val}"`)
15
+ .join(',')
16
+ : '';
17
+ const metricLine = labels
18
+ ? `${metric.name}{${labels}} ${value.value}`
19
+ : `${metric.name} ${value.value}`;
20
+ return value.timestamp
21
+ ? `${metricLine} ${value.timestamp}`
22
+ : metricLine;
23
+ }
24
+ function createCounter(name, help, labelNames) {
25
+ return {
26
+ name,
27
+ help,
28
+ type: 'counter',
29
+ labelNames,
30
+ };
31
+ }
32
+ function createGauge(name, help, labelNames) {
33
+ return {
34
+ name,
35
+ help,
36
+ type: 'gauge',
37
+ labelNames,
38
+ };
39
+ }
40
+ function createHistogram(name, help, labelNames) {
41
+ return {
42
+ name,
43
+ help,
44
+ type: 'histogram',
45
+ labelNames,
46
+ };
47
+ }
48
+ function calculatePercentile(values, percentile) {
49
+ if (values.length === 0)
50
+ return 0;
51
+ const sorted = [...values].sort((a, b) => a - b);
52
+ const index = Math.ceil((percentile / 100) * sorted.length) - 1;
53
+ return sorted[index];
54
+ }
55
+ function formatDuration(milliseconds) {
56
+ return milliseconds / 1000;
57
+ }
58
+ function bytesToMegabytes(bytes) {
59
+ return bytes / (1024 * 1024);
60
+ }
61
+ function calculateErrorRate(errorCount, totalCount) {
62
+ if (totalCount === 0)
63
+ return 0;
64
+ return (errorCount / totalCount) * 100;
65
+ }
66
+ //# sourceMappingURL=prometheus.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prometheus.utils.js","sourceRoot":"","sources":["../../src/utils/prometheus.utils.ts"],"names":[],"mappings":";;AASA,wDAiBC;AAKD,sCAWC;AAKD,kCAWC;AAKD,0CAWC;AAKD,kDASC;AAKD,wCAEC;AAKD,4CAEC;AAKD,gDAMC;AAxGD,SAAgB,sBAAsB,CAClC,MAAwB,EACxB,KAAkB;IAElB,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM;QACvB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC;aACzB,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,KAAK,GAAG,GAAG,CAAC;aACtC,IAAI,CAAC,GAAG,CAAC;QACd,CAAC,CAAC,EAAE,CAAC;IAET,MAAM,UAAU,GAAG,MAAM;QACrB,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,KAAK,KAAK,CAAC,KAAK,EAAE;QAC5C,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;IAEtC,OAAO,KAAK,CAAC,SAAS;QAClB,CAAC,CAAC,GAAG,UAAU,IAAI,KAAK,CAAC,SAAS,EAAE;QACpC,CAAC,CAAC,UAAU,CAAC;AACrB,CAAC;AAKD,SAAgB,aAAa,CACzB,IAAY,EACZ,IAAY,EACZ,UAAqB;IAErB,OAAO;QACH,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,SAAS;QACf,UAAU;KACb,CAAC;AACN,CAAC;AAKD,SAAgB,WAAW,CACvB,IAAY,EACZ,IAAY,EACZ,UAAqB;IAErB,OAAO;QACH,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,OAAO;QACb,UAAU;KACb,CAAC;AACN,CAAC;AAKD,SAAgB,eAAe,CAC3B,IAAY,EACZ,IAAY,EACZ,UAAqB;IAErB,OAAO;QACH,IAAI;QACJ,IAAI;QACJ,IAAI,EAAE,WAAW;QACjB,UAAU;KACb,CAAC;AACN,CAAC;AAKD,SAAgB,mBAAmB,CAC/B,MAAgB,EAChB,UAAkB;IAElB,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAElC,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChE,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC;AAKD,SAAgB,cAAc,CAAC,YAAoB;IAC/C,OAAO,YAAY,GAAG,IAAI,CAAC;AAC/B,CAAC;AAKD,SAAgB,gBAAgB,CAAC,KAAa;IAC1C,OAAO,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;AACjC,CAAC;AAKD,SAAgB,kBAAkB,CAC9B,UAAkB,EAClB,UAAkB;IAElB,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,UAAU,GAAG,UAAU,CAAC,GAAG,GAAG,CAAC;AAC3C,CAAC"}
@@ -0,0 +1 @@
1
+ export declare function generateFullName(firstName?: string, lastName?: string, middleName?: string): string;
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateFullName = generateFullName;
4
+ function generateFullName(firstName, lastName, middleName) {
5
+ return [lastName, firstName, middleName].filter(Boolean).join(' ').trim();
6
+ }
7
+ //# sourceMappingURL=user.utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"user.utils.js","sourceRoot":"","sources":["../../src/utils/user.utils.ts"],"names":[],"mappings":";;AAAA,4CAEC;AAFD,SAAgB,gBAAgB,CAAC,SAAkB,EAAE,QAAiB,EAAE,UAAmB;IACvF,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9E,CAAC"}
package/package.json CHANGED
@@ -1,9 +1,8 @@
1
1
  {
2
2
  "name": "@alacard-project/shared",
3
- "version": "1.0.0",
4
- "private": false,
5
- "publishConfig": {
6
- "access": "public"
3
+ "version": "1.0.3",
4
+ "engines": {
5
+ "node": ">=24.0.0"
7
6
  },
8
7
  "description": "Pure types and constants for Alacard microservices",
9
8
  "main": "dist/index.js",
@@ -13,11 +12,13 @@
13
12
  "watch": "tsc -w"
14
13
  },
15
14
  "dependencies": {
15
+ "@nestjs/config": "^4.0.2",
16
16
  "class-transformer": "^0.5.1",
17
- "class-validator": "^0.14.3"
17
+ "class-validator": "^0.14.3",
18
+ "rxjs": "^7.8.2"
18
19
  },
19
20
  "devDependencies": {
20
- "@types/node": "^20.11.0",
21
- "typescript": "^5.3.3"
21
+ "@types/node": "^24.10.0",
22
+ "typescript": "^5.9.3"
22
23
  }
23
- }
24
+ }
@@ -0,0 +1,101 @@
1
+ import { ConfigService } from '@nestjs/config';
2
+ import { ENV_KEYS } from '../constants/env.constants';
3
+ import { Environment } from '../enums/env.enum';
4
+
5
+ export abstract class BaseConfigService {
6
+ constructor(protected readonly configService: ConfigService) { }
7
+
8
+ get environment(): Environment {
9
+ return this.configService.get<Environment>(ENV_KEYS.NODE_ENV) || Environment.DEVELOPMENT;
10
+ }
11
+
12
+ get isProduction(): boolean {
13
+ return this.environment === Environment.PRODUCTION;
14
+ }
15
+
16
+ get port(): number {
17
+ return this.getOptionalNumber(ENV_KEYS.PORT, 3000)!;
18
+ }
19
+
20
+ get databaseUrl(): string {
21
+ return this.getRequiredString(ENV_KEYS.DATABASE_URL);
22
+ }
23
+
24
+ get redisHost(): string {
25
+ return this.getRequiredString(ENV_KEYS.REDIS_HOST);
26
+ }
27
+
28
+ get redisPort(): number {
29
+ return this.getRequiredNumber(ENV_KEYS.REDIS_PORT);
30
+ }
31
+
32
+ get kafkaBrokers(): string[] {
33
+ const brokers = this.getRequiredString(ENV_KEYS.KAFKA_BROKERS);
34
+ return brokers.split(',');
35
+ }
36
+
37
+ get corsOrigins(): string[] {
38
+ const origins = this.getOptionalString(ENV_KEYS.CORS_ORIGINS);
39
+ return origins ? origins.split(',') : ['*'];
40
+ }
41
+
42
+ get rabbitmqUrl(): string {
43
+ return this.getRequiredString(ENV_KEYS.RABBITMQ_URL);
44
+ }
45
+
46
+ get rateLimitTtl(): number {
47
+ return this.getOptionalNumber(ENV_KEYS.RATE_LIMIT_TTL, 60)!;
48
+ }
49
+
50
+ get rateLimitMax(): number {
51
+ return this.getOptionalNumber(ENV_KEYS.RATE_LIMIT_MAX, 10)!;
52
+ }
53
+
54
+ get userServiceUrl(): string {
55
+ return this.getRequiredString(ENV_KEYS.USER_SERVICE_URL);
56
+ }
57
+
58
+ get userProtoPath(): string {
59
+ return this.getRequiredString(ENV_KEYS.USER_PROTO_PATH);
60
+ }
61
+
62
+ protected getRequiredString(key: string): string {
63
+ const value = this.configService.get<string>(key);
64
+ if (!value) {
65
+ throw new Error(`Config error: ${key} is required`);
66
+ }
67
+ return value;
68
+ }
69
+
70
+ protected getRequiredNumber(key: string): number {
71
+ const value = this.configService.get<number>(key);
72
+ if (value === undefined) {
73
+ throw new Error(`Config error: ${key} is required`);
74
+ }
75
+ return value;
76
+ }
77
+
78
+ protected getOptionalString(key: string, defaultValue?: string): string | undefined {
79
+ return this.configService.get<string>(key) || defaultValue;
80
+ }
81
+
82
+ protected getOptionalNumber(key: string, defaultValue?: number): number | undefined {
83
+ return this.configService.get<number>(key) ?? defaultValue;
84
+ }
85
+
86
+ protected getOptionalBoolean(key: string, defaultValue = false): boolean {
87
+ return this.configService.get<boolean>(key) ?? defaultValue;
88
+ }
89
+
90
+ protected timeToSeconds(timeStr: string): number {
91
+ const unit = timeStr.slice(-1);
92
+ const value = parseInt(timeStr.slice(0, -1));
93
+ switch (unit) {
94
+ case 's': return value;
95
+ case 'm': return value * 60;
96
+ case 'h': return value * 3600;
97
+ case 'd': return value * 86400;
98
+ default: return parseInt(timeStr);
99
+ }
100
+ }
101
+ }
@@ -0,0 +1,9 @@
1
+ export const INVITATION_CONFIG = {
2
+ DEFAULT_EXPIRATION_DAYS: 7,
3
+ TOKEN_LENGTH: 32,
4
+ };
5
+
6
+ export const PASSWORD_RESET_CONFIG = {
7
+ TOKEN_EXPIRY_HOURS: 1,
8
+ TOKEN_LENGTH: 32,
9
+ };
@@ -0,0 +1,34 @@
1
+ export const AUTHENTICATION_MESSAGES = {
2
+ USER_NOT_FOUND: 'User with this email was not found.',
3
+ USER_ALREADY_EXISTS: 'User with this email already exists.',
4
+ INVALID_PASSWORD: 'The password you entered is incorrect.',
5
+ USER_INACTIVE: 'Your account is currently inactive. Please contact support.',
6
+ INVALID_REFRESH_TOKEN: 'Your session has expired or the refresh token is invalid.',
7
+ LOGOUT_SUCCESS: 'You have been successfully logged out.',
8
+ REGISTRATION_SUCCESS: 'Your account has been created successfully.',
9
+ REGISTER_SUCCESS: 'Account created successfully.',
10
+ LOGIN_SUCCESS: 'Logged in successfully.',
11
+ PASSWORD_RESET_SENT: 'A password reset link has been sent to your email.',
12
+ PASSWORD_RESET_SUCCESS: 'Your password has been reset successfully.',
13
+ INVALID_CREDENTIALS: 'The email or password you entered is incorrect.',
14
+ };
15
+
16
+ export const COOKIE_EXPIRATION = {
17
+ REFRESH_TOKEN_MS: 7 * 24 * 60 * 60 * 1000, // 7 days
18
+ ACCESS_TOKEN_MS: 15 * 60 * 1000, // 15 minutes
19
+ };
20
+
21
+ export const INVITATION_MESSAGES = {
22
+ INVITATION_SENT: 'Invitation sent successfully.',
23
+ INVITATION_VALID: 'Invitation is valid.',
24
+ INVITATION_NOT_FOUND: 'Invitation not found.',
25
+ INVITATION_EXPIRED: 'Invitation has expired.',
26
+ INVITATION_ALREADY_USED: 'Invitation has already been used.',
27
+ };
28
+
29
+ export const PASSWORD_RESET_MESSAGES = {
30
+ RESET_EMAIL_SENT: 'Password reset email sent.',
31
+ PASSWORD_RESET_SUCCESS: 'Password reset successfully.',
32
+ INVALID_TOKEN: 'Invalid password reset token.',
33
+ TOKEN_EXPIRED: 'Password reset token has expired.',
34
+ };
@@ -0,0 +1,9 @@
1
+ export const COOKIE_NAMES = {
2
+ ACCESS_TOKEN: 'access_token',
3
+ REFRESH_TOKEN: 'refresh_token',
4
+ } as const;
5
+
6
+ export const PASSPORT_STRATEGIES = {
7
+ LOCAL: 'local',
8
+ JWT: 'jwt',
9
+ } as const;
@@ -8,18 +8,35 @@ export const ENV_KEYS = {
8
8
  KAFKA_BROKERS: 'KAFKA_BROKERS',
9
9
  RABBITMQ_URL: 'RABBITMQ_URL',
10
10
  JWT_SECRET: 'JWT_SECRET',
11
+ JWT_EXPIRES_IN: 'JWT_EXPIRES_IN',
12
+ JWT_REFRESH_EXPIRES_IN: 'JWT_REFRESH_EXPIRES_IN',
11
13
  GRPC_PORT: 'GRPC_PORT',
12
14
  GRPC_URL: 'GRPC_URL',
13
15
  LOGGING_PROTO_PATH: 'LOGGING_PROTO_PATH',
14
16
  INTERNAL_CONFIG_KEY: 'INTERNAL_CONFIG_KEY',
15
17
  RATE_LIMIT_TTL: 'RATE_LIMIT_TTL',
16
18
  RATE_LIMIT_MAX: 'RATE_LIMIT_MAX',
19
+ NOTIFICATION_SERVICE_URL: 'NOTIFICATION_SERVICE_URL',
20
+ LOG_FILE_PATH: 'LOG_FILE_PATH',
21
+ LOG_RETENTION_DAYS: 'LOG_RETENTION_DAYS',
17
22
  CORS_ORIGINS: 'CORS_ORIGINS',
23
+ USER_SERVICE_URL: 'USER_SERVICE_URL',
24
+ USER_PROTO_PATH: 'USER_PROTO_PATH',
25
+ AUTH_SERVICE_URL: 'AUTH_SERVICE_URL',
26
+ AUTH_PROTO_PATH: 'AUTH_PROTO_PATH',
27
+ LOGGING_SERVICE_URL: 'LOGGING_SERVICE_URL',
28
+ TOKEN_SERVICE_URL: 'TOKEN_SERVICE_URL',
29
+ TOKEN_PROTO_PATH: 'TOKEN_PROTO_PATH',
30
+ CONFIG_SERVICE_URL: 'CONFIG_SERVICE_URL',
31
+ CONFIG_SERVICE_ENABLED: 'CONFIG_SERVICE_ENABLED',
18
32
  } as const;
19
33
 
20
34
  export const ENV_VALUES = {
21
- DEVELOPMENT: 'development',
22
- PRODUCTION: 'production',
23
- TEST: 'test',
24
- STAGING: 'staging',
35
+ NODE_ENV: {
36
+ DEVELOPMENT: 'development',
37
+ PRODUCTION: 'production',
38
+ TEST: 'test',
39
+ STAGING: 'staging',
40
+ LOCAL: 'local',
41
+ },
25
42
  } as const;
@@ -0,0 +1,10 @@
1
+ import { ErrorCode } from '../enums/error.enum';
2
+
3
+ export const ErrorMessages: Record<string, string> = {
4
+ [ErrorCode.INTERNAL_SERVER_ERROR]: 'An internal server error occurred. Please try again later.',
5
+ [ErrorCode.VALIDATION_ERROR]: 'Input validation failed. Please check your data.',
6
+ [ErrorCode.AUTH_INVALID_TOKEN]: 'Your session token is invalid or has been revoked.',
7
+ [ErrorCode.AUTH_TOKEN_EXPIRED]: 'Your session has expired. Please log in again.',
8
+ [ErrorCode.AUTH_ACCESS_DENIED]: 'Access denied. You do not have the required role or scope.',
9
+ [ErrorCode.NOT_FOUND]: 'The requested resource was not found.',
10
+ };
@@ -1,10 +1,13 @@
1
1
  export const GRPC_PACKAGES = {
2
2
  LOGGING: 'logging',
3
3
  CONFIG: 'config',
4
+ AUTH: 'auth',
5
+ USER: 'user',
4
6
  } as const;
5
7
 
6
8
  export const GRPC_METHODS = {
7
9
  LOGGING: {
10
+ SERVICE: 'LoggingService',
8
11
  LOG_EVENT: 'LogEvent',
9
12
  LOG_USER_ACTION: 'LogUserAction',
10
13
  UPDATE_SERVICE_STATUS: 'UpdateServiceStatus',
@@ -12,4 +15,27 @@ export const GRPC_METHODS = {
12
15
  GET_SERVICE_STATUS: 'GetServiceStatus',
13
16
  GET_USER_ACTIONS: 'GetUserActions',
14
17
  },
18
+ AUTH: {
19
+ SERVICE: 'AuthService',
20
+ LOGIN: 'Login',
21
+ REGISTER: 'Register',
22
+ VALIDATE: 'Validate',
23
+ GET_USER_BY_ID: 'GetUserById',
24
+ GET_USER_BY_EMAIL: 'GetUserByEmail',
25
+ VALIDATE_TOKEN: 'ValidateToken',
26
+ REFRESH_TOKEN: 'RefreshToken',
27
+ REVOKE_TOKEN: 'RevokeToken',
28
+ CHECK_PERMISSION: 'CheckPermission',
29
+ GET_USER_PERMISSIONS: 'GetUserPermissions',
30
+ },
31
+ USER: {
32
+ SERVICE: 'UserService',
33
+ GET_USER_BY_ID: 'GetUserById',
34
+ GET_USER_By_EMAIL: 'GetUserByEmail',
35
+ GET_USER_PERMISSIONS: 'GetUserPermissions',
36
+ CREATE_USER: 'CreateUser',
37
+ UPDATE_USER: 'UpdateUser',
38
+ UPDATE_PROFILE: 'UpdateProfile',
39
+ DELETE_USER: 'DeleteUser',
40
+ },
15
41
  } as const;
@@ -1,5 +1,13 @@
1
1
  export * from './env.constants';
2
2
  export * from './http.constants';
3
- export * from './services.constants';
4
- export * from './grpc.constants';
5
3
  export * from './logging.constants';
4
+ export * from './microservices.constants';
5
+ export * from './grpc.constants';
6
+ export * from './error-messages';
7
+ export * from './auth.constants';
8
+ export * from './logging-messages.constants';
9
+ export * from './routes.constants';
10
+ export * from './common.constants';
11
+ export * from './tokens.constants';
12
+ export * from './auth-config.constants';
13
+ export * from './monitoring.constants';
@@ -0,0 +1,15 @@
1
+ export const LOGGING_MESSAGES = {
2
+ USER_LOGGED_IN: 'User successfully logged in',
3
+ USER_REGISTERED: 'New user registered',
4
+ USER_LOGGED_OUT: 'User logged out',
5
+
6
+ LOGIN_ATTEMPT_NONEXISTENT_EMAIL: 'Login attempt with non-existent email',
7
+ LOGIN_ATTEMPT_INVALID_PASSWORD: 'Login attempt with invalid password',
8
+
9
+ ACCESS_TOKEN_VALIDATED: 'Access token successfully validated',
10
+ ACCESS_TOKEN_VALIDATION_FAILED: 'Access token validation failed',
11
+
12
+ CONFIG_RELOADED: 'Configuration successfully reloaded',
13
+ VAULT_CONNECTED: 'Connected to HashiCorp Vault',
14
+ VAULT_CONNECTION_FAILED: 'Failed to connect to HashiCorp Vault',
15
+ };
@@ -0,0 +1,18 @@
1
+ export const MICROSERVICES = {
2
+ CONFIG: {
3
+ SERVICE_NAME: 'CONFIG_SERVICE',
4
+ PACKAGE: 'config',
5
+ },
6
+ LOGGING: {
7
+ SERVICE_NAME: 'LOGGING_SERVICE',
8
+ PACKAGE: 'logging',
9
+ },
10
+ AUTH: {
11
+ SERVICE_NAME: 'AUTH_SERVICE',
12
+ PACKAGE: 'auth',
13
+ },
14
+ USER: {
15
+ SERVICE_NAME: 'USER_SERVICE',
16
+ PACKAGE: 'user',
17
+ },
18
+ } as const;
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Prometheus Metrics Constants
3
+ */
4
+
5
+ export const PROMETHEUS_METRICS = {
6
+ // HTTP Metrics
7
+ HTTP_REQUESTS_TOTAL: 'http_requests_total',
8
+ HTTP_REQUEST_DURATION: 'http_request_duration_seconds',
9
+ HTTP_ERRORS_TOTAL: 'http_errors_total',
10
+ HTTP_RESPONSE_SIZE: 'http_response_size_bytes',
11
+
12
+ // Database Metrics
13
+ DB_CONNECTIONS_ACTIVE: 'db_connections_active',
14
+ DB_CONNECTIONS_IDLE: 'db_connections_idle',
15
+ DB_QUERY_DURATION: 'db_query_duration_seconds',
16
+ DB_QUERIES_TOTAL: 'db_queries_total',
17
+ DB_ERRORS_TOTAL: 'db_errors_total',
18
+
19
+ // gRPC Metrics
20
+ GRPC_REQUESTS_TOTAL: 'grpc_requests_total',
21
+ GRPC_REQUEST_DURATION: 'grpc_request_duration_seconds',
22
+ GRPC_ERRORS_TOTAL: 'grpc_errors_total',
23
+
24
+ // Kafka Metrics
25
+ KAFKA_MESSAGES_SENT: 'kafka_messages_sent_total',
26
+ KAFKA_MESSAGES_RECEIVED: 'kafka_messages_received_total',
27
+ KAFKA_ERRORS_TOTAL: 'kafka_errors_total',
28
+
29
+ // System Metrics
30
+ PROCESS_CPU_USAGE: 'process_cpu_usage_percent',
31
+ PROCESS_MEMORY_USAGE: 'process_memory_usage_bytes',
32
+ PROCESS_HEAP_USED: 'process_heap_used_bytes',
33
+ PROCESS_HEAP_TOTAL: 'process_heap_total_bytes',
34
+ PROCESS_UPTIME: 'process_uptime_seconds',
35
+
36
+ // Application Metrics
37
+ ACTIVE_USERS: 'active_users_total',
38
+ REGISTERED_USERS: 'registered_users_total',
39
+ REQUESTS_PER_SECOND: 'requests_per_second',
40
+ ERROR_RATE: 'error_rate_percent',
41
+
42
+ // Cache Metrics
43
+ CACHE_HITS: 'cache_hits_total',
44
+ CACHE_MISSES: 'cache_misses_total',
45
+ CACHE_SIZE: 'cache_size_bytes',
46
+ } as const;
47
+
48
+ export const METRIC_LABELS = {
49
+ SERVICE: 'service',
50
+ METHOD: 'method',
51
+ STATUS: 'status',
52
+ ENDPOINT: 'endpoint',
53
+ ERROR_TYPE: 'error_type',
54
+ DATABASE: 'database',
55
+ QUERY_TYPE: 'query_type',
56
+ USER_ROLE: 'user_role',
57
+ GRPC_METHOD: 'grpc_method',
58
+ KAFKA_TOPIC: 'kafka_topic',
59
+ } as const;
60
+
61
+ export const HEALTH_CHECK_ENDPOINTS = {
62
+ LIVENESS: '/health/liveness',
63
+ READINESS: '/health/readiness',
64
+ STARTUP: '/health/startup',
65
+ } as const;
66
+
67
+ export const MONITORING_CONFIG = {
68
+ SCRAPE_INTERVAL: 15, // seconds
69
+ SCRAPE_TIMEOUT: 10, // seconds
70
+ RETENTION_DAYS: 15,
71
+ } as const;
@@ -0,0 +1,21 @@
1
+ export const ROUTES = {
2
+ AUTH: {
3
+ BASE: 'auth',
4
+ LOGIN: 'login',
5
+ LOGOUT: 'logout',
6
+ REGISTER: 'register',
7
+ PROFILE: 'profile',
8
+ REFRESH: 'refresh',
9
+ INVITE: 'invite',
10
+ INVITATIONS: 'invitations',
11
+ REGISTER_BY_INVITE: 'register-by-invite',
12
+ },
13
+ USER: {
14
+ BASE: 'users',
15
+ },
16
+ } as const;
17
+
18
+ export const AUTH_ROUTES = {
19
+ PASSWORD_RESET_REQUEST: 'password-reset/request',
20
+ PASSWORD_RESET_CONFIRM: 'password-reset/confirm',
21
+ };
@@ -0,0 +1,6 @@
1
+ export const SERVICE_TOKENS = {
2
+ USER_SERVICE: 'USER_PACKAGE',
3
+ AUTH_SERVICE: 'AUTH_PACKAGE',
4
+ LOGGING_SERVICE: 'LOGGING_PACKAGE',
5
+ CONFIG_SERVICE: 'CONFIG_PACKAGE',
6
+ } as const;
@@ -0,0 +1,98 @@
1
+ export interface GetUserByIdGrpcRequest {
2
+ userId: string;
3
+ }
4
+
5
+ export interface GetUserByIdGrpcResponse {
6
+ user: any;
7
+ }
8
+
9
+ export interface GetUserByEmailGrpcRequest {
10
+ email: string;
11
+ }
12
+
13
+ export interface GetUserByEmailGrpcResponse {
14
+ user: any;
15
+ }
16
+
17
+ export interface ValidateTokenGrpcRequest {
18
+ token: string;
19
+ }
20
+
21
+ export interface ValidateTokenGrpcResponse {
22
+ valid: boolean;
23
+ user?: any;
24
+ }
25
+
26
+ export interface RefreshTokenGrpcRequest {
27
+ refreshToken: string;
28
+ }
29
+
30
+ export interface RevokeTokenGrpcRequest {
31
+ refreshToken: string;
32
+ userId: string;
33
+ }
34
+
35
+ export interface RevokeTokenGrpcResponse {
36
+ success: boolean;
37
+ }
38
+
39
+ export interface CheckPermissionGrpcRequest {
40
+ userId: string;
41
+ resource: string;
42
+ action: string;
43
+ }
44
+
45
+ export interface CheckPermissionGrpcResponse {
46
+ hasPermission: boolean;
47
+ }
48
+
49
+ export interface GetUserPermissionsGrpcRequest {
50
+ userId: string;
51
+ }
52
+
53
+ export interface GetUserPermissionsGrpcResponse {
54
+ userId: string;
55
+ permissions: Array<{ resource: string; action: string }>;
56
+ scopes: string[];
57
+ }
58
+
59
+ export interface CreateUserRequest {
60
+ userId?: string;
61
+ email: string;
62
+ role: string;
63
+ firstName?: string;
64
+ lastName?: string;
65
+ password?: string;
66
+ }
67
+
68
+ export interface UpdateUserRequest {
69
+ userId: string;
70
+ email?: string;
71
+ role?: string;
72
+ firstName?: string;
73
+ lastName?: string;
74
+ password?: string;
75
+ isActive?: boolean;
76
+ }
77
+
78
+ export interface UpdateProfileRequest {
79
+ userId: string;
80
+ firstName?: string;
81
+ lastName?: string;
82
+ }
83
+
84
+ export interface DeleteUserRequest {
85
+ userId: string;
86
+ }
87
+
88
+ export interface PermissionsResponse {
89
+ userId: string;
90
+ permissions: Array<{ id?: string; resource: string; action: string }>;
91
+ scopes: string[];
92
+ }
93
+
94
+ // Aliases for backward compatibility or cleaner naming
95
+ export type GetUserByIdRequest = GetUserByIdGrpcRequest;
96
+ export type GetUserByEmailRequest = GetUserByEmailGrpcRequest;
97
+ export type GetUserPermissionsRequest = GetUserPermissionsGrpcRequest;
98
+ export type DeleteUserResponse = { success: boolean };