@nekutima/biome-sdk 0.1.18

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 (146) hide show
  1. package/README.md +100 -0
  2. package/dist/auth/auth.service.d.ts +90 -0
  3. package/dist/auth/auth.service.d.ts.map +1 -0
  4. package/dist/auth/auth.service.js +166 -0
  5. package/dist/auth/auth.service.js.map +1 -0
  6. package/dist/auth/types.d.ts +19 -0
  7. package/dist/auth/types.d.ts.map +1 -0
  8. package/dist/auth/types.js +3 -0
  9. package/dist/auth/types.js.map +1 -0
  10. package/dist/core/configuration.d.ts +26 -0
  11. package/dist/core/configuration.d.ts.map +1 -0
  12. package/dist/core/configuration.js +3 -0
  13. package/dist/core/configuration.js.map +1 -0
  14. package/dist/core/error-handler.d.ts +24 -0
  15. package/dist/core/error-handler.d.ts.map +1 -0
  16. package/dist/core/error-handler.js +76 -0
  17. package/dist/core/error-handler.js.map +1 -0
  18. package/dist/core/http-client.d.ts +43 -0
  19. package/dist/core/http-client.d.ts.map +1 -0
  20. package/dist/core/http-client.js +97 -0
  21. package/dist/core/http-client.js.map +1 -0
  22. package/dist/core/state-manager.d.ts +16 -0
  23. package/dist/core/state-manager.d.ts.map +1 -0
  24. package/dist/core/state-manager.js +33 -0
  25. package/dist/core/state-manager.js.map +1 -0
  26. package/dist/files/file-upload.d.ts +60 -0
  27. package/dist/files/file-upload.d.ts.map +1 -0
  28. package/dist/files/file-upload.js +121 -0
  29. package/dist/files/file-upload.js.map +1 -0
  30. package/dist/index.d.ts +80 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +140 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/models/api-error.model.d.ts +31 -0
  35. package/dist/models/api-error.model.d.ts.map +1 -0
  36. package/dist/models/api-error.model.js +53 -0
  37. package/dist/models/api-error.model.js.map +1 -0
  38. package/dist/models/api-response.model.d.ts +51 -0
  39. package/dist/models/api-response.model.d.ts.map +1 -0
  40. package/dist/models/api-response.model.js +77 -0
  41. package/dist/models/api-response.model.js.map +1 -0
  42. package/dist/models/chat.model.d.ts +59 -0
  43. package/dist/models/chat.model.d.ts.map +1 -0
  44. package/dist/models/chat.model.js +3 -0
  45. package/dist/models/chat.model.js.map +1 -0
  46. package/dist/models/ecosystem.model.d.ts +16 -0
  47. package/dist/models/ecosystem.model.d.ts.map +1 -0
  48. package/dist/models/ecosystem.model.js +7 -0
  49. package/dist/models/ecosystem.model.js.map +1 -0
  50. package/dist/models/file.model.d.ts +67 -0
  51. package/dist/models/file.model.d.ts.map +1 -0
  52. package/dist/models/file.model.js +3 -0
  53. package/dist/models/file.model.js.map +1 -0
  54. package/dist/models/notification.model.d.ts +172 -0
  55. package/dist/models/notification.model.d.ts.map +1 -0
  56. package/dist/models/notification.model.js +77 -0
  57. package/dist/models/notification.model.js.map +1 -0
  58. package/dist/models/person.model.d.ts +94 -0
  59. package/dist/models/person.model.d.ts.map +1 -0
  60. package/dist/models/person.model.js +14 -0
  61. package/dist/models/person.model.js.map +1 -0
  62. package/dist/models/project.model.d.ts +62 -0
  63. package/dist/models/project.model.d.ts.map +1 -0
  64. package/dist/models/project.model.js +93 -0
  65. package/dist/models/project.model.js.map +1 -0
  66. package/dist/models/task-update.model.d.ts +28 -0
  67. package/dist/models/task-update.model.d.ts.map +1 -0
  68. package/dist/models/task-update.model.js +8 -0
  69. package/dist/models/task-update.model.js.map +1 -0
  70. package/dist/models/task-url.model.d.ts +16 -0
  71. package/dist/models/task-url.model.d.ts.map +1 -0
  72. package/dist/models/task-url.model.js +3 -0
  73. package/dist/models/task-url.model.js.map +1 -0
  74. package/dist/models/task.model.d.ts +120 -0
  75. package/dist/models/task.model.d.ts.map +1 -0
  76. package/dist/models/task.model.js +78 -0
  77. package/dist/models/task.model.js.map +1 -0
  78. package/dist/models/timezone.model.d.ts +19 -0
  79. package/dist/models/timezone.model.d.ts.map +1 -0
  80. package/dist/models/timezone.model.js +12 -0
  81. package/dist/models/timezone.model.js.map +1 -0
  82. package/dist/models/user.model.d.ts +101 -0
  83. package/dist/models/user.model.d.ts.map +1 -0
  84. package/dist/models/user.model.js +22 -0
  85. package/dist/models/user.model.js.map +1 -0
  86. package/dist/profiles/profile.service.d.ts +52 -0
  87. package/dist/profiles/profile.service.d.ts.map +1 -0
  88. package/dist/profiles/profile.service.js +119 -0
  89. package/dist/profiles/profile.service.js.map +1 -0
  90. package/dist/profiles/types.d.ts +1 -0
  91. package/dist/profiles/types.d.ts.map +1 -0
  92. package/dist/profiles/types.js +3 -0
  93. package/dist/profiles/types.js.map +1 -0
  94. package/dist/tasks/task-sorting.d.ts +51 -0
  95. package/dist/tasks/task-sorting.d.ts.map +1 -0
  96. package/dist/tasks/task-sorting.js +137 -0
  97. package/dist/tasks/task-sorting.js.map +1 -0
  98. package/dist/tasks/task.service.d.ts +134 -0
  99. package/dist/tasks/task.service.d.ts.map +1 -0
  100. package/dist/tasks/task.service.js +256 -0
  101. package/dist/tasks/task.service.js.map +1 -0
  102. package/dist/tasks/types.d.ts +2 -0
  103. package/dist/tasks/types.d.ts.map +1 -0
  104. package/dist/tasks/types.js +3 -0
  105. package/dist/tasks/types.js.map +1 -0
  106. package/dist/types/actor.types.d.ts +101 -0
  107. package/dist/types/actor.types.d.ts.map +1 -0
  108. package/dist/types/actor.types.js +135 -0
  109. package/dist/types/actor.types.js.map +1 -0
  110. package/dist/types/api.types.d.ts +43 -0
  111. package/dist/types/api.types.d.ts.map +1 -0
  112. package/dist/types/api.types.js +6 -0
  113. package/dist/types/api.types.js.map +1 -0
  114. package/dist/types/common.types.d.ts +40 -0
  115. package/dist/types/common.types.d.ts.map +1 -0
  116. package/dist/types/common.types.js +6 -0
  117. package/dist/types/common.types.js.map +1 -0
  118. package/dist/types/state-machine.types.d.ts +102 -0
  119. package/dist/types/state-machine.types.d.ts.map +1 -0
  120. package/dist/types/state-machine.types.js +18 -0
  121. package/dist/types/state-machine.types.js.map +1 -0
  122. package/dist/users/user.service.d.ts +49 -0
  123. package/dist/users/user.service.d.ts.map +1 -0
  124. package/dist/users/user.service.js +119 -0
  125. package/dist/users/user.service.js.map +1 -0
  126. package/dist/utils/date.utils.d.ts +60 -0
  127. package/dist/utils/date.utils.d.ts.map +1 -0
  128. package/dist/utils/date.utils.js +125 -0
  129. package/dist/utils/date.utils.js.map +1 -0
  130. package/dist/utils/username-generator.d.ts +76 -0
  131. package/dist/utils/username-generator.d.ts.map +1 -0
  132. package/dist/utils/username-generator.js +177 -0
  133. package/dist/utils/username-generator.js.map +1 -0
  134. package/dist/utils/validation.utils.d.ts +57 -0
  135. package/dist/utils/validation.utils.d.ts.map +1 -0
  136. package/dist/utils/validation.utils.js +117 -0
  137. package/dist/utils/validation.utils.js.map +1 -0
  138. package/dist/validation/password-strength.d.ts +66 -0
  139. package/dist/validation/password-strength.d.ts.map +1 -0
  140. package/dist/validation/password-strength.js +192 -0
  141. package/dist/validation/password-strength.js.map +1 -0
  142. package/dist/validation/schemas.d.ts +69 -0
  143. package/dist/validation/schemas.d.ts.map +1 -0
  144. package/dist/validation/schemas.js +94 -0
  145. package/dist/validation/schemas.js.map +1 -0
  146. package/package.json +51 -0
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /**
3
+ * Unified API Error model for Biome platform
4
+ * This model is shared between frontend and backend
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ApiStandardError = exports.API_ERROR_TYPE = void 0;
8
+ var API_ERROR_TYPE;
9
+ (function (API_ERROR_TYPE) {
10
+ API_ERROR_TYPE["BAD_REQUEST"] = "BAD_REQUEST";
11
+ API_ERROR_TYPE["UNAUTHORIZED"] = "UNAUTHORIZED";
12
+ API_ERROR_TYPE["FORBIDDEN"] = "FORBIDDEN";
13
+ API_ERROR_TYPE["NOT_FOUND"] = "NOT_FOUND";
14
+ API_ERROR_TYPE["INTERNAL_SERVER_ERROR"] = "INTERNAL_SERVER_ERROR";
15
+ API_ERROR_TYPE["VALIDATION_ERROR"] = "VALIDATION_ERROR";
16
+ API_ERROR_TYPE["CONFLICT"] = "CONFLICT";
17
+ API_ERROR_TYPE["RATE_LIMIT_EXCEEDED"] = "RATE_LIMIT_EXCEEDED";
18
+ })(API_ERROR_TYPE || (exports.API_ERROR_TYPE = API_ERROR_TYPE = {}));
19
+ /**
20
+ * API Error helper class for backend usage
21
+ */
22
+ class ApiStandardError extends Error {
23
+ constructor(type, message, details) {
24
+ super(message);
25
+ this.type = type;
26
+ this.message = message;
27
+ this.details = details;
28
+ this.statusCode = this.getStatusCode(type);
29
+ }
30
+ getStatusCode(type) {
31
+ switch (type) {
32
+ case API_ERROR_TYPE.BAD_REQUEST:
33
+ return 400;
34
+ case API_ERROR_TYPE.UNAUTHORIZED:
35
+ return 401;
36
+ case API_ERROR_TYPE.FORBIDDEN:
37
+ return 403;
38
+ case API_ERROR_TYPE.NOT_FOUND:
39
+ return 404;
40
+ case API_ERROR_TYPE.CONFLICT:
41
+ return 409;
42
+ case API_ERROR_TYPE.RATE_LIMIT_EXCEEDED:
43
+ return 429;
44
+ case API_ERROR_TYPE.VALIDATION_ERROR:
45
+ return 422;
46
+ case API_ERROR_TYPE.INTERNAL_SERVER_ERROR:
47
+ default:
48
+ return 500;
49
+ }
50
+ }
51
+ }
52
+ exports.ApiStandardError = ApiStandardError;
53
+ //# sourceMappingURL=api-error.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-error.model.js","sourceRoot":"","sources":["../../src/models/api-error.model.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,IAAY,cASX;AATD,WAAY,cAAc;IACtB,6CAA2B,CAAA;IAC3B,+CAA6B,CAAA;IAC7B,yCAAuB,CAAA;IACvB,yCAAuB,CAAA;IACvB,iEAA+C,CAAA;IAC/C,uDAAqC,CAAA;IACrC,uCAAqB,CAAA;IACrB,6DAA2C,CAAA;AAC/C,CAAC,EATW,cAAc,8BAAd,cAAc,QASzB;AASD;;GAEG;AACH,MAAa,gBAAiB,SAAQ,KAAK;IAKvC,YAAY,IAAoB,EAAE,OAAe,EAAE,OAAiC;QAChF,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IAC/C,CAAC;IAEO,aAAa,CAAC,IAAoB;QACtC,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,cAAc,CAAC,WAAW;gBAC3B,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,YAAY;gBAC5B,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,SAAS;gBACzB,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,SAAS;gBACzB,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,QAAQ;gBACxB,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,mBAAmB;gBACnC,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,gBAAgB;gBAChC,OAAO,GAAG,CAAC;YACf,KAAK,cAAc,CAAC,qBAAqB,CAAC;YAC1C;gBACI,OAAO,GAAG,CAAC;QACnB,CAAC;IACL,CAAC;CACJ;AAlCD,4CAkCC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Unified API Response model for Biome platform
3
+ * This model is shared between frontend and backend
4
+ */
5
+ export type ApiResponseType = 'created' | 'updated' | 'deleted' | 'denied' | 'granted' | 'not-created' | 'not-updated' | 'not-deleted' | 'not-found' | 'done' | 'found' | 'no' | 'yes' | 'error' | 'success';
6
+ export declare const API_RESPONSE_TYPE: {
7
+ readonly CREATED: ApiResponseType;
8
+ readonly UPDATED: ApiResponseType;
9
+ readonly DELETED: ApiResponseType;
10
+ readonly DENIED: ApiResponseType;
11
+ readonly GRANTED: ApiResponseType;
12
+ readonly NOT_CREATED: ApiResponseType;
13
+ readonly NOT_UPDATED: ApiResponseType;
14
+ readonly NOT_DELETED: ApiResponseType;
15
+ readonly NOT_FOUND: ApiResponseType;
16
+ readonly FOUND: ApiResponseType;
17
+ readonly NEGATIVE: ApiResponseType;
18
+ readonly POSITIVE: ApiResponseType;
19
+ readonly DONE: ApiResponseType;
20
+ readonly ERROR: ApiResponseType;
21
+ readonly SUCCESS: ApiResponseType;
22
+ };
23
+ /**
24
+ * API Response class for Biome platform
25
+ *
26
+ * Generic type-safe API response wrapper.
27
+ *
28
+ * @template T - The type of the payload data
29
+ * - Use specific types for data responses: ApiResponse<User>
30
+ * - Use null for no-data responses: ApiResponse<null>
31
+ * - Default is void for backward compatibility
32
+ *
33
+ * @example
34
+ * // Success with data
35
+ * new ApiResponse<User>(API_RESPONSE_TYPE.SUCCESS, userData, 'User found')
36
+ *
37
+ * // Success without data (deletion, etc.)
38
+ * new ApiResponse<null>(API_RESPONSE_TYPE.SUCCESS, null, 'Deleted successfully')
39
+ *
40
+ * // Error response
41
+ * new ApiResponse<null>(API_RESPONSE_TYPE.DENIED, null, 'Forbidden')
42
+ */
43
+ export declare class ApiResponse<T = void> {
44
+ result: ApiResponseType;
45
+ payload: T;
46
+ message: string;
47
+ isSuccess: boolean;
48
+ constructor(result: ApiResponseType, payload: T, message?: string);
49
+ private evaluateSuccess;
50
+ }
51
+ //# sourceMappingURL=api-response.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-response.model.d.ts","sourceRoot":"","sources":["../../src/models/api-response.model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,eAAe,GACrB,SAAS,GACT,SAAS,GACT,SAAS,GACT,QAAQ,GACR,SAAS,GACT,aAAa,GACb,aAAa,GACb,aAAa,GACb,WAAW,GACX,MAAM,GACN,OAAO,GACP,IAAI,GACJ,KAAK,GACL,OAAO,GACP,SAAS,CAAC;AAEhB,eAAO,MAAM,iBAAiB;sBACJ,eAAe;sBACf,eAAe;sBACf,eAAe;qBACjB,eAAe;sBACb,eAAe;0BACP,eAAe;0BACf,eAAe;0BACf,eAAe;wBACnB,eAAe;oBACvB,eAAe;uBACf,eAAe;uBACd,eAAe;mBAClB,eAAe;oBACb,eAAe;sBACX,eAAe;CAC/B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,WAAW,CAAC,CAAC,GAAG,IAAI;IACtB,MAAM,EAAE,eAAe,CAAC;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;gBAEd,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,SAAK;IAO7D,OAAO,CAAC,eAAe;CAyB1B"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Unified API Response model for Biome platform
4
+ * This model is shared between frontend and backend
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.ApiResponse = exports.API_RESPONSE_TYPE = void 0;
8
+ exports.API_RESPONSE_TYPE = {
9
+ CREATED: 'created',
10
+ UPDATED: 'updated',
11
+ DELETED: 'deleted',
12
+ DENIED: 'denied',
13
+ GRANTED: 'granted',
14
+ NOT_CREATED: 'not-created',
15
+ NOT_UPDATED: 'not-updated',
16
+ NOT_DELETED: 'not-deleted',
17
+ NOT_FOUND: 'not-found',
18
+ FOUND: 'found',
19
+ NEGATIVE: 'no',
20
+ POSITIVE: 'yes',
21
+ DONE: 'done',
22
+ ERROR: 'error',
23
+ SUCCESS: 'success',
24
+ };
25
+ /**
26
+ * API Response class for Biome platform
27
+ *
28
+ * Generic type-safe API response wrapper.
29
+ *
30
+ * @template T - The type of the payload data
31
+ * - Use specific types for data responses: ApiResponse<User>
32
+ * - Use null for no-data responses: ApiResponse<null>
33
+ * - Default is void for backward compatibility
34
+ *
35
+ * @example
36
+ * // Success with data
37
+ * new ApiResponse<User>(API_RESPONSE_TYPE.SUCCESS, userData, 'User found')
38
+ *
39
+ * // Success without data (deletion, etc.)
40
+ * new ApiResponse<null>(API_RESPONSE_TYPE.SUCCESS, null, 'Deleted successfully')
41
+ *
42
+ * // Error response
43
+ * new ApiResponse<null>(API_RESPONSE_TYPE.DENIED, null, 'Forbidden')
44
+ */
45
+ class ApiResponse {
46
+ constructor(result, payload, message = '') {
47
+ this.result = result;
48
+ this.payload = payload;
49
+ this.message = message;
50
+ this.isSuccess = this.evaluateSuccess(result);
51
+ }
52
+ evaluateSuccess(code) {
53
+ switch (code) {
54
+ case exports.API_RESPONSE_TYPE.CREATED:
55
+ case exports.API_RESPONSE_TYPE.UPDATED:
56
+ case exports.API_RESPONSE_TYPE.DELETED:
57
+ case exports.API_RESPONSE_TYPE.GRANTED:
58
+ case exports.API_RESPONSE_TYPE.FOUND:
59
+ case exports.API_RESPONSE_TYPE.DONE:
60
+ case exports.API_RESPONSE_TYPE.POSITIVE:
61
+ case exports.API_RESPONSE_TYPE.NEGATIVE:
62
+ case exports.API_RESPONSE_TYPE.NOT_FOUND:
63
+ case exports.API_RESPONSE_TYPE.SUCCESS:
64
+ return true;
65
+ case exports.API_RESPONSE_TYPE.DENIED:
66
+ case exports.API_RESPONSE_TYPE.NOT_CREATED:
67
+ case exports.API_RESPONSE_TYPE.NOT_UPDATED:
68
+ case exports.API_RESPONSE_TYPE.NOT_DELETED:
69
+ case exports.API_RESPONSE_TYPE.ERROR:
70
+ return false;
71
+ default:
72
+ return false;
73
+ }
74
+ }
75
+ }
76
+ exports.ApiResponse = ApiResponse;
77
+ //# sourceMappingURL=api-response.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-response.model.js","sourceRoot":"","sources":["../../src/models/api-response.model.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAmBU,QAAA,iBAAiB,GAAG;IAC7B,OAAO,EAAE,SAA4B;IACrC,OAAO,EAAE,SAA4B;IACrC,OAAO,EAAE,SAA4B;IACrC,MAAM,EAAE,QAA2B;IACnC,OAAO,EAAE,SAA4B;IACrC,WAAW,EAAE,aAAgC;IAC7C,WAAW,EAAE,aAAgC;IAC7C,WAAW,EAAE,aAAgC;IAC7C,SAAS,EAAE,WAA8B;IACzC,KAAK,EAAE,OAA0B;IACjC,QAAQ,EAAE,IAAuB;IACjC,QAAQ,EAAE,KAAwB;IAClC,IAAI,EAAE,MAAyB;IAC/B,KAAK,EAAE,OAA0B;IACjC,OAAO,EAAE,SAA4B;CAC/B,CAAC;AAEX;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAa,WAAW;IAMpB,YAAY,MAAuB,EAAE,OAAU,EAAE,OAAO,GAAG,EAAE;QACzD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEO,eAAe,CAAC,IAAqB;QACzC,QAAQ,IAAI,EAAE,CAAC;YACX,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,OAAO,CAAC;YAC/B,KAAK,yBAAiB,CAAC,KAAK,CAAC;YAC7B,KAAK,yBAAiB,CAAC,IAAI,CAAC;YAC5B,KAAK,yBAAiB,CAAC,QAAQ,CAAC;YAChC,KAAK,yBAAiB,CAAC,QAAQ,CAAC;YAChC,KAAK,yBAAiB,CAAC,SAAS,CAAC;YACjC,KAAK,yBAAiB,CAAC,OAAO;gBAC1B,OAAO,IAAI,CAAC;YAEhB,KAAK,yBAAiB,CAAC,MAAM,CAAC;YAC9B,KAAK,yBAAiB,CAAC,WAAW,CAAC;YACnC,KAAK,yBAAiB,CAAC,WAAW,CAAC;YACnC,KAAK,yBAAiB,CAAC,WAAW,CAAC;YACnC,KAAK,yBAAiB,CAAC,KAAK;gBACxB,OAAO,KAAK,CAAC;YAEjB;gBACI,OAAO,KAAK,CAAC;QACrB,CAAC;IACL,CAAC;CACJ;AAtCD,kCAsCC"}
@@ -0,0 +1,59 @@
1
+ export type ChatContextType = 'task' | 'project' | 'guild' | 'direct';
2
+ export interface Chat {
3
+ id: number;
4
+ contextType: ChatContextType;
5
+ contextId: number;
6
+ createdAt: Date;
7
+ updatedAt: Date;
8
+ }
9
+ export interface ChatParticipant {
10
+ id: number;
11
+ chatId: number;
12
+ userId: number;
13
+ role?: string | null;
14
+ avatarFileId?: number | null;
15
+ avatarStoragePath?: string | null;
16
+ avatarFilename?: string | null;
17
+ createdAt: Date;
18
+ updatedAt: Date;
19
+ }
20
+ export interface ChatMessage {
21
+ id: number;
22
+ chatId: number;
23
+ senderId: number;
24
+ content: string;
25
+ createdAt: Date;
26
+ updatedAt: Date;
27
+ }
28
+ export interface ChatMessageReceipt {
29
+ id: number;
30
+ messageId: number;
31
+ userId: number;
32
+ readAt: Date | null;
33
+ createdAt: Date;
34
+ updatedAt: Date;
35
+ }
36
+ export interface ChatParticipantProfile {
37
+ userId: number;
38
+ displayName: string | null;
39
+ email: string;
40
+ avatarFileId?: number | null;
41
+ avatarStoragePath?: string | null;
42
+ avatarFilename?: string | null;
43
+ role?: string | null;
44
+ }
45
+ export interface ChatMessageWithSender extends ChatMessage {
46
+ sender: {
47
+ id: number;
48
+ displayName: string;
49
+ email: string;
50
+ avatarFileId?: number | null;
51
+ avatarStoragePath?: string | null;
52
+ avatarFilename?: string | null;
53
+ };
54
+ receipts: Array<Pick<ChatMessageReceipt, 'userId' | 'readAt'>>;
55
+ }
56
+ export interface ChatWithParticipants extends Chat {
57
+ participants: ChatParticipantProfile[];
58
+ }
59
+ //# sourceMappingURL=chat.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.model.d.ts","sourceRoot":"","sources":["../../src/models/chat.model.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEtE,MAAM,WAAW,IAAI;IACjB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,eAAe,CAAC;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,WAAW;IACxB,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,IAAI,GAAG,IAAI,CAAC;IACpB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,sBAAsB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACtD,MAAM,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;KAClC,CAAC;IACF,QAAQ,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,QAAQ,GAAG,QAAQ,CAAC,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,oBAAqB,SAAQ,IAAI;IAC9C,YAAY,EAAE,sBAAsB,EAAE,CAAC;CAC1C"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=chat.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.model.js","sourceRoot":"","sources":["../../src/models/chat.model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Unified Ecosystem model for Biome platform
3
+ * This model is shared between frontend and backend
4
+ */
5
+ export interface Ecosystem {
6
+ id?: number;
7
+ name: string;
8
+ description?: string;
9
+ deleted: boolean;
10
+ createdAt: Date;
11
+ createdBy: number;
12
+ updatedAt: Date;
13
+ updatedBy: number;
14
+ }
15
+ export type EcosystemMinimal = Pick<Ecosystem, 'id' | 'name' | 'description'>;
16
+ //# sourceMappingURL=ecosystem.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem.model.d.ts","sourceRoot":"","sources":["../../src/models/ecosystem.model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACtB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,GAAG,MAAM,GAAG,aAAa,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+ /**
3
+ * Unified Ecosystem model for Biome platform
4
+ * This model is shared between frontend and backend
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ //# sourceMappingURL=ecosystem.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecosystem.model.js","sourceRoot":"","sources":["../../src/models/ecosystem.model.ts"],"names":[],"mappings":";AAAA;;;GAGG"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Shared file model definitions used across backend and frontend.
3
+ * These interfaces describe files stored in the Trunk storage system.
4
+ */
5
+ export interface File {
6
+ id?: number;
7
+ taskId?: number;
8
+ filename: string;
9
+ name?: string;
10
+ description?: string;
11
+ mimeType: string;
12
+ size: number;
13
+ isPublic: boolean;
14
+ ownerId: number;
15
+ folder?: string;
16
+ storagePath: string;
17
+ downloadUrl?: string;
18
+ createdAt?: Date;
19
+ updatedAt?: Date;
20
+ deletedAt?: Date;
21
+ tags?: string[];
22
+ }
23
+ export interface FileUploadRequest {
24
+ file: any;
25
+ name?: string;
26
+ description?: string;
27
+ tags?: string[];
28
+ isPublic?: boolean;
29
+ folder?: string;
30
+ }
31
+ export interface FileUpdateRequest {
32
+ name?: string;
33
+ description?: string;
34
+ tags?: string[];
35
+ isPublic?: boolean;
36
+ folder?: string;
37
+ }
38
+ export interface FilePermission {
39
+ id?: number;
40
+ fileId: number;
41
+ userId: number;
42
+ permissions: string[];
43
+ grantedBy: number;
44
+ grantedAt?: Date;
45
+ }
46
+ export interface FileSearchOptions {
47
+ page?: number;
48
+ limit?: number;
49
+ sort?: string;
50
+ order?: 'asc' | 'desc';
51
+ search?: string;
52
+ tags?: string[];
53
+ type?: string;
54
+ folder?: string;
55
+ isPublic?: boolean;
56
+ ownerId?: number;
57
+ }
58
+ export interface FileListResponse {
59
+ files: File[];
60
+ pagination: {
61
+ page: number;
62
+ limit: number;
63
+ total: number;
64
+ pages: number;
65
+ };
66
+ }
67
+ //# sourceMappingURL=file.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.model.d.ts","sourceRoot":"","sources":["../../src/models/file.model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,IAAI;IACjB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,EAAE,GAAG,CAAC;IACV,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC3B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC7B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,UAAU,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;CACL"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=file.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file.model.js","sourceRoot":"","sources":["../../src/models/file.model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Unified Notification model for Biome platform
3
+ * This model is shared between frontend and backend
4
+ *
5
+ * CRITICAL: This model matches the database schema exactly (all fields in camelCase)
6
+ * Database table: notifications
7
+ * All fields correspond to actual database columns
8
+ *
9
+ * Story 7: Global Notification System Infrastructure
10
+ * @see docs/user-stories/global_stories.md#story-7
11
+ */
12
+ /**
13
+ * Complete Notification model matching database schema
14
+ * Includes all fields from the notifications table
15
+ */
16
+ export interface Notification {
17
+ /** Unique notification identifier (UUID) */
18
+ id?: number;
19
+ /** Recipient user ID (who receives the notification) */
20
+ userId: number;
21
+ /** Source tool that generated the notification */
22
+ originTool: OriginTool;
23
+ /** Specific event type within the origin tool */
24
+ notificationType: string;
25
+ /** Short notification title/subject */
26
+ title: string;
27
+ /** Notification body/description */
28
+ message: string;
29
+ /** User who triggered the event (nullable - can be system-generated) */
30
+ actorId?: number | null;
31
+ /** URL/route to navigate to (e.g., "/tasks/123", "/projects/456") */
32
+ targetLink: string;
33
+ /** Flexible JSONB object with tool-specific data */
34
+ metadata?: Record<string, any>;
35
+ /** Boolean flag indicating if notification has been read */
36
+ isRead: boolean;
37
+ /** Timestamp when notification was read (nullable) */
38
+ readAt?: Date | null;
39
+ /** Timestamp when notification was created */
40
+ createdAt: Date;
41
+ /** Timestamp when notification was last updated */
42
+ updatedAt: Date;
43
+ /** Soft delete timestamp (nullable) */
44
+ deletedAt?: Date | null;
45
+ }
46
+ /**
47
+ * Origin Tool Enum
48
+ * Defines all Biome tools that can generate notifications
49
+ */
50
+ export declare enum OriginTool {
51
+ TASKS = "tasks",
52
+ PROJECTS = "projects",
53
+ CIRCLES = "circles",
54
+ BUSINESS = "business",
55
+ SYSTEM = "system",
56
+ LEGACY = "legacy"
57
+ }
58
+ /**
59
+ * Notification type safe for frontend display
60
+ * Includes all fields, as no sensitive data exists in notifications
61
+ */
62
+ export type NotificationPublic = Notification;
63
+ /**
64
+ * Lightweight notification representation for lists
65
+ * Minimal fields for performance in badge count and quick queries
66
+ */
67
+ export type NotificationMinimal = Pick<Notification, 'id' | 'userId' | 'isRead' | 'createdAt'>;
68
+ /**
69
+ * Extended notification with actor user information
70
+ * Combines Notification model with User data for the actor
71
+ */
72
+ export interface NotificationWithActor extends Notification {
73
+ actor?: {
74
+ id: number;
75
+ username: string;
76
+ displayName?: string;
77
+ } | null;
78
+ }
79
+ /**
80
+ * Type for notification creation (without auto-generated or auto-managed fields)
81
+ */
82
+ export type CreateNotificationDto = Omit<Notification, 'id' | 'isRead' | 'readAt' | 'createdAt' | 'updatedAt' | 'deletedAt'> & {
83
+ /** Optional override for isRead (defaults to false) */
84
+ isRead?: boolean;
85
+ };
86
+ /**
87
+ * Type for notification updates (partial, without auto-managed fields)
88
+ */
89
+ export type UpdateNotificationDto = Partial<Omit<Notification, 'id' | 'userId' | 'createdAt' | 'updatedAt' | 'deletedAt'>>;
90
+ /**
91
+ * Notification Settings Model
92
+ * Per-tool notification preferences for each user
93
+ */
94
+ export interface NotificationSettings {
95
+ id?: number;
96
+ userId: number;
97
+ /** Enable/disable notifications for tasks tool */
98
+ tasks: boolean;
99
+ /** Enable/disable notifications for projects tool */
100
+ projects: boolean;
101
+ /** Enable/disable notifications for circles tool */
102
+ circles: boolean;
103
+ /** Enable/disable notifications for business tool */
104
+ business: boolean;
105
+ /** Enable/disable notifications for system events */
106
+ system: boolean;
107
+ /** Global master toggle (overrides all tool settings if false) */
108
+ enabled: boolean;
109
+ createdAt: Date;
110
+ updatedAt: Date;
111
+ }
112
+ /**
113
+ * Type for updating notification settings
114
+ */
115
+ export type UpdateNotificationSettingsDto = Partial<Omit<NotificationSettings, 'id' | 'userId' | 'createdAt' | 'updatedAt'>>;
116
+ /**
117
+ * Notification List Query Parameters
118
+ * Query parameters for GET /notifications endpoint
119
+ */
120
+ export interface NotificationListParams {
121
+ /** Page number (1-indexed) */
122
+ page?: number;
123
+ /** Number of items per page */
124
+ limit?: number;
125
+ /** Filter to only unread notifications */
126
+ unreadOnly?: boolean;
127
+ /** Filter by specific origin tool */
128
+ originTool?: OriginTool;
129
+ /** Sort order: 'newest' or 'oldest' (defaults to newest) */
130
+ sortOrder?: 'newest' | 'oldest';
131
+ }
132
+ /**
133
+ * Notification List Response
134
+ * Standardized structure for notification list API responses
135
+ */
136
+ export interface NotificationListResponse {
137
+ /** Array of notifications */
138
+ notifications: Notification[];
139
+ /** Total count of unread notifications (for badge) */
140
+ unreadCount: number;
141
+ /** Pagination metadata */
142
+ pagination: {
143
+ total: number;
144
+ page: number;
145
+ totalPages: number;
146
+ hasMore: boolean;
147
+ };
148
+ }
149
+ /**
150
+ * Notification Helper Functions
151
+ */
152
+ export declare const NotificationHelper: {
153
+ /**
154
+ * Check if a notification is unread
155
+ */
156
+ isUnread: (notification: Notification) => boolean;
157
+ /**
158
+ * Check if a notification is deleted (soft delete)
159
+ */
160
+ isDeleted: (notification: Notification) => boolean;
161
+ /**
162
+ * Get relative time string for notification timestamp
163
+ * @example "5 minutes ago", "2 hours ago", "3 days ago"
164
+ */
165
+ getRelativeTime: (date: Date) => string;
166
+ /**
167
+ * Format badge count for display
168
+ * Shows actual count for 1-99, shows "99+" for 100 or more
169
+ */
170
+ formatBadgeCount: (count: number) => string;
171
+ };
172
+ //# sourceMappingURL=notification.model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.model.d.ts","sourceRoot":"","sources":["../../src/models/notification.model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ /**
3
+ * Unified Notification model for Biome platform
4
+ * This model is shared between frontend and backend
5
+ *
6
+ * CRITICAL: This model matches the database schema exactly (all fields in camelCase)
7
+ * Database table: notifications
8
+ * All fields correspond to actual database columns
9
+ *
10
+ * Story 7: Global Notification System Infrastructure
11
+ * @see docs/user-stories/global_stories.md#story-7
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.NotificationHelper = exports.OriginTool = void 0;
15
+ /**
16
+ * Origin Tool Enum
17
+ * Defines all Biome tools that can generate notifications
18
+ */
19
+ var OriginTool;
20
+ (function (OriginTool) {
21
+ OriginTool["TASKS"] = "tasks";
22
+ OriginTool["PROJECTS"] = "projects";
23
+ OriginTool["CIRCLES"] = "circles";
24
+ OriginTool["BUSINESS"] = "business";
25
+ OriginTool["SYSTEM"] = "system";
26
+ OriginTool["LEGACY"] = "legacy";
27
+ })(OriginTool || (exports.OriginTool = OriginTool = {}));
28
+ /**
29
+ * Notification Helper Functions
30
+ */
31
+ exports.NotificationHelper = {
32
+ /**
33
+ * Check if a notification is unread
34
+ */
35
+ isUnread: (notification) => {
36
+ return !notification.isRead;
37
+ },
38
+ /**
39
+ * Check if a notification is deleted (soft delete)
40
+ */
41
+ isDeleted: (notification) => {
42
+ return notification.deletedAt !== null && notification.deletedAt !== undefined;
43
+ },
44
+ /**
45
+ * Get relative time string for notification timestamp
46
+ * @example "5 minutes ago", "2 hours ago", "3 days ago"
47
+ */
48
+ getRelativeTime: (date) => {
49
+ const now = new Date();
50
+ const diffMs = now.getTime() - new Date(date).getTime();
51
+ const diffMinutes = Math.floor(diffMs / 60000);
52
+ const diffHours = Math.floor(diffMs / 3600000);
53
+ const diffDays = Math.floor(diffMs / 86400000);
54
+ if (diffMinutes < 1)
55
+ return 'just now';
56
+ if (diffMinutes < 60)
57
+ return `${diffMinutes} minute${diffMinutes === 1 ? '' : 's'} ago`;
58
+ if (diffHours < 24)
59
+ return `${diffHours} hour${diffHours === 1 ? '' : 's'} ago`;
60
+ if (diffDays < 7)
61
+ return `${diffDays} day${diffDays === 1 ? '' : 's'} ago`;
62
+ // For older notifications, return formatted date
63
+ return new Date(date).toLocaleDateString();
64
+ },
65
+ /**
66
+ * Format badge count for display
67
+ * Shows actual count for 1-99, shows "99+" for 100 or more
68
+ */
69
+ formatBadgeCount: (count) => {
70
+ if (count === 0)
71
+ return '';
72
+ if (count <= 99)
73
+ return count.toString();
74
+ return '99+';
75
+ },
76
+ };
77
+ //# sourceMappingURL=notification.model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notification.model.js","sourceRoot":"","sources":["../../src/models/notification.model.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAkDH;;;GAGG;AACH,IAAY,UAOX;AAPD,WAAY,UAAU;IAClB,6BAAe,CAAA;IACf,mCAAqB,CAAA;IACrB,iCAAmB,CAAA;IACnB,mCAAqB,CAAA;IACrB,+BAAiB,CAAA;IACjB,+BAAiB,CAAA;AACrB,CAAC,EAPW,UAAU,0BAAV,UAAU,QAOrB;AA0GD;;GAEG;AACU,QAAA,kBAAkB,GAAG;IAC9B;;OAEG;IACH,QAAQ,EAAE,CAAC,YAA0B,EAAW,EAAE;QAC9C,OAAO,CAAC,YAAY,CAAC,MAAM,CAAC;IAChC,CAAC;IAED;;OAEG;IACH,SAAS,EAAE,CAAC,YAA0B,EAAW,EAAE;QAC/C,OAAO,YAAY,CAAC,SAAS,KAAK,IAAI,IAAI,YAAY,CAAC,SAAS,KAAK,SAAS,CAAC;IACnF,CAAC;IAED;;;OAGG;IACH,eAAe,EAAE,CAAC,IAAU,EAAU,EAAE;QACpC,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,EAAE,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACxD,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;QAC/C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;QAE/C,IAAI,WAAW,GAAG,CAAC;YAAE,OAAO,UAAU,CAAC;QACvC,IAAI,WAAW,GAAG,EAAE;YAAE,OAAO,GAAG,WAAW,UAAU,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QACxF,IAAI,SAAS,GAAG,EAAE;YAAE,OAAO,GAAG,SAAS,QAAQ,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAChF,IAAI,QAAQ,GAAG,CAAC;YAAE,OAAO,GAAG,QAAQ,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC;QAE3E,iDAAiD;QACjD,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,kBAAkB,EAAE,CAAC;IAC/C,CAAC;IAED;;;OAGG;IACH,gBAAgB,EAAE,CAAC,KAAa,EAAU,EAAE;QACxC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAC3B,IAAI,KAAK,IAAI,EAAE;YAAE,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzC,OAAO,KAAK,CAAC;IACjB,CAAC;CACJ,CAAC"}