@j3r3mcdev/oast-server 1.1.1 → 1.1.2

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 (187) hide show
  1. package/.github/workflows/ci.yml +29 -29
  2. package/.github/workflows/publish.yml +31 -31
  3. package/README.md +192 -192
  4. package/dist/api/controllers/__tests__/tasks.controller.test.d.ts +1 -0
  5. package/dist/api/controllers/events.controller.d.ts +6 -0
  6. package/dist/api/controllers/health.controller.d.ts +4 -0
  7. package/dist/api/controllers/index.d.ts +0 -0
  8. package/dist/api/controllers/tasks.controller.d.ts +40 -0
  9. package/dist/api/dto/__tests__/create-task.dto.test.d.ts +1 -0
  10. package/dist/api/dto/__tests__/filter-tasks.dto.test.d.ts +1 -0
  11. package/dist/api/dto/create-task.dto.d.ts +9 -0
  12. package/dist/api/dto/filter-tasks.dto.d.ts +8 -0
  13. package/dist/api/services/__tests__/events.service.test.d.ts +1 -0
  14. package/dist/api/services/__tests__/tasks.service.test.d.ts +1 -0
  15. package/dist/api/services/events.service.d.ts +8 -0
  16. package/dist/api/services/tasks.service.d.ts +22 -0
  17. package/dist/api/sse/events.stream.d.ts +25 -0
  18. package/dist/config/constants.d.ts +0 -0
  19. package/dist/config/env.d.ts +0 -0
  20. package/dist/core/__tests__/core-router.test.d.ts +1 -0
  21. package/dist/core/__tests__/core-server.test.d.ts +1 -0
  22. package/dist/core/__tests__/event.normalizer.test.d.ts +1 -0
  23. package/dist/core/__tests__/event.router.test.d.ts +1 -0
  24. package/dist/core/__tests__/logger.test.d.ts +1 -0
  25. package/dist/core/__tests__/storage-manager.test.d.ts +1 -0
  26. package/dist/core/event.normalizer.d.ts +10 -0
  27. package/dist/core/event.router.d.ts +7 -0
  28. package/dist/core/http/__tests__/adapter-node.test.d.ts +1 -0
  29. package/dist/core/http/__tests__/body-parser-multipart.test.d.ts +1 -0
  30. package/dist/core/http/__tests__/body-parser-raw.test.d.ts +1 -0
  31. package/dist/core/http/__tests__/body-parser-text.test.d.ts +1 -0
  32. package/dist/core/http/__tests__/compile-path.test.d.ts +1 -0
  33. package/dist/core/http/__tests__/middleware-pipeline.test.d.ts +1 -0
  34. package/dist/core/http/__tests__/request.test.d.ts +1 -0
  35. package/dist/core/http/__tests__/response.test.d.ts +1 -0
  36. package/dist/core/http/__tests__/router-match.test.d.ts +1 -0
  37. package/dist/core/http/adapter-node.d.ts +8 -0
  38. package/dist/core/http/buildRequest.d.ts +2 -0
  39. package/dist/core/http/compile-path.d.ts +13 -0
  40. package/dist/core/http/errors.d.ts +9 -0
  41. package/dist/core/http/http-server.d.ts +7 -0
  42. package/dist/core/http/index.d.ts +0 -0
  43. package/dist/core/http/main.d.ts +0 -0
  44. package/dist/core/http/middleware.d.ts +12 -0
  45. package/dist/core/http/request.d.ts +35 -0
  46. package/dist/core/http/response.d.ts +17 -0
  47. package/dist/core/http/router.d.ts +28 -0
  48. package/dist/core/http/utils.d.ts +0 -0
  49. package/dist/core/id-generator.d.ts +3 -0
  50. package/dist/core/logger.d.ts +29 -0
  51. package/dist/core/router.d.ts +16 -0
  52. package/dist/core/server.d.ts +25 -0
  53. package/dist/core/storage.d.ts +24 -0
  54. package/dist/index.d.ts +1 -0
  55. package/dist/listeners/api/__tests__/api.controller.test.d.ts +1 -0
  56. package/dist/listeners/api/__tests__/api.extractor.test.d.ts +1 -0
  57. package/dist/listeners/api/__tests__/api.listener.test.d.ts +1 -0
  58. package/dist/listeners/api/__tests__/api.routes.test.d.ts +1 -0
  59. package/dist/listeners/api/__tests__/api.sse.test.d.ts +1 -0
  60. package/dist/listeners/api/api.controllers.d.ts +9 -0
  61. package/dist/listeners/api/api.extractor.d.ts +5 -0
  62. package/dist/listeners/api/api.listener.d.ts +17 -0
  63. package/dist/listeners/api/api.routes.d.ts +5 -0
  64. package/dist/listeners/api/api.sse.d.ts +10 -0
  65. package/dist/listeners/dns/__tests__/dns.test.d.ts +1 -0
  66. package/dist/listeners/dns/dns.extractor.d.ts +8 -0
  67. package/dist/listeners/dns/dns.listener.d.ts +15 -0
  68. package/dist/listeners/http/__tests__/http.extractor.test.d.ts +1 -0
  69. package/dist/listeners/http/__tests__/http.listener.test.d.ts +1 -0
  70. package/dist/listeners/http/http.extractor.d.ts +11 -0
  71. package/dist/listeners/http/http.listener.d.ts +17 -0
  72. package/dist/listeners/listener.interface.d.ts +4 -0
  73. package/dist/listeners/smtp/__tests__/smtp.extractor.test.d.ts +1 -0
  74. package/dist/listeners/smtp/__tests__/smtp.listener.test.d.ts +1 -0
  75. package/dist/listeners/smtp/smtp.extractor.d.ts +12 -0
  76. package/dist/listeners/smtp/smtp.listener.d.ts +13 -0
  77. package/dist/listeners/ssrf/__tests__/ssrf.extractor.test.d.ts +1 -0
  78. package/dist/listeners/ssrf/__tests__/ssrf.listener.test.d.ts +1 -0
  79. package/dist/listeners/ssrf/__tests__/ssrf.listener.test.js +4 -16
  80. package/dist/listeners/ssrf/ssrf.extractor.d.ts +10 -0
  81. package/dist/listeners/ssrf/ssrf.listener.d.ts +8 -0
  82. package/dist/listeners/tcp/tcp.extractor.d.ts +4 -0
  83. package/dist/listeners/tcp/tcp.listener.d.ts +18 -0
  84. package/dist/listeners/webhook/__tests__/webhook.extractor.test.d.ts +1 -0
  85. package/dist/listeners/webhook/__tests__/webhook.listener.test.d.ts +1 -0
  86. package/dist/listeners/webhook/webhook.extractor.d.ts +8 -0
  87. package/dist/listeners/webhook/webhook.listener.d.ts +8 -0
  88. package/dist/listeners/websocket/__tests__/websocket.extractor.test.d.ts +1 -0
  89. package/dist/listeners/websocket/__tests__/websocket.listener.test.d.ts +1 -0
  90. package/dist/listeners/websocket/websocket.extractor.d.ts +10 -0
  91. package/dist/listeners/websocket/websocket.listener.d.ts +8 -0
  92. package/dist/storage-adapters/adapters/__tests__/memory.storage.test.d.ts +1 -0
  93. package/dist/storage-adapters/adapters/memory.storage.d.ts +21 -0
  94. package/dist/storage-adapters/adapters/redis.storage.d.ts +0 -0
  95. package/dist/storage-adapters/adapters/sqlite.storage.d.ts +0 -0
  96. package/dist/storage-adapters/storage.interface.d.ts +18 -0
  97. package/dist/types/event.types.d.ts +118 -0
  98. package/dist/utils/token.d.ts +0 -0
  99. package/jest.config.js +14 -14
  100. package/package.json +45 -45
  101. package/sadmin list shadows +9 -9
  102. package/src/api/controllers/__tests__/tasks.controller.test.ts +74 -74
  103. package/src/api/controllers/events.controller.ts +10 -10
  104. package/src/api/controllers/health.controller.ts +7 -7
  105. package/src/api/controllers/tasks.controller.ts +41 -41
  106. package/src/api/dto/__tests__/create-task.dto.test.ts +41 -41
  107. package/src/api/dto/__tests__/filter-tasks.dto.test.ts +35 -35
  108. package/src/api/dto/create-task.dto.ts +33 -33
  109. package/src/api/dto/filter-tasks.dto.ts +33 -33
  110. package/src/api/services/__tests__/events.service.test.ts +41 -41
  111. package/src/api/services/__tests__/tasks.service.test.ts +41 -41
  112. package/src/api/services/events.service.ts +17 -17
  113. package/src/api/services/tasks.service.ts +79 -79
  114. package/src/api/sse/events.stream.ts +90 -90
  115. package/src/core/__tests__/core-router.test.ts +30 -30
  116. package/src/core/__tests__/core-server.test.ts +44 -44
  117. package/src/core/__tests__/event.normalizer.test.ts +56 -56
  118. package/src/core/__tests__/event.router.test.ts +89 -89
  119. package/src/core/__tests__/logger.test.ts +32 -32
  120. package/src/core/__tests__/storage-manager.test.ts +74 -74
  121. package/src/core/event.normalizer.ts +147 -147
  122. package/src/core/event.router.ts +13 -13
  123. package/src/core/http/__tests__/adapter-node.test.ts +52 -52
  124. package/src/core/http/__tests__/body-parser-multipart.test.ts +41 -41
  125. package/src/core/http/__tests__/body-parser-raw.test.ts +28 -28
  126. package/src/core/http/__tests__/body-parser-text.test.ts +28 -28
  127. package/src/core/http/__tests__/compile-path.test.ts +39 -39
  128. package/src/core/http/__tests__/middleware-pipeline.test.ts +51 -51
  129. package/src/core/http/__tests__/request.test.ts +34 -34
  130. package/src/core/http/__tests__/response.test.ts +35 -35
  131. package/src/core/http/__tests__/router-match.test.ts +171 -171
  132. package/src/core/http/adapter-node.ts +51 -51
  133. package/src/core/http/buildRequest.ts +18 -18
  134. package/src/core/http/compile-path.ts +32 -32
  135. package/src/core/http/errors.ts +37 -37
  136. package/src/core/http/http-server.ts +52 -52
  137. package/src/core/http/middleware.ts +160 -160
  138. package/src/core/http/request.ts +55 -55
  139. package/src/core/http/response.ts +93 -93
  140. package/src/core/http/router.ts +138 -138
  141. package/src/core/id-generator.ts +8 -8
  142. package/src/core/logger.ts +113 -113
  143. package/src/core/router.ts +44 -44
  144. package/src/core/server.ts +85 -85
  145. package/src/core/storage.ts +64 -64
  146. package/src/index.ts +89 -89
  147. package/src/listeners/api/__tests__/api.controller.test.ts +116 -116
  148. package/src/listeners/api/__tests__/api.extractor.test.ts +46 -46
  149. package/src/listeners/api/__tests__/api.listener.test.ts +82 -82
  150. package/src/listeners/api/__tests__/api.routes.test.ts +155 -155
  151. package/src/listeners/api/__tests__/api.sse.test.ts +105 -105
  152. package/src/listeners/api/api.controllers.ts +67 -67
  153. package/src/listeners/api/api.extractor.ts +43 -43
  154. package/src/listeners/api/api.listener.ts +50 -50
  155. package/src/listeners/api/api.routes.ts +76 -76
  156. package/src/listeners/api/api.sse.ts +38 -38
  157. package/src/listeners/dns/__tests__/dns.test.ts +118 -118
  158. package/src/listeners/dns/dns.extractor.ts +14 -14
  159. package/src/listeners/dns/dns.listener.ts +61 -61
  160. package/src/listeners/http/__tests__/http.extractor.test.ts +59 -59
  161. package/src/listeners/http/__tests__/http.listener.test.ts +133 -133
  162. package/src/listeners/http/http.extractor.ts +15 -15
  163. package/src/listeners/http/http.listener.ts +110 -110
  164. package/src/listeners/listener.interface.ts +4 -4
  165. package/src/listeners/smtp/__tests__/smtp.extractor.test.ts +69 -69
  166. package/src/listeners/smtp/__tests__/smtp.listener.test.ts +150 -150
  167. package/src/listeners/smtp/smtp.extractor.ts +18 -18
  168. package/src/listeners/smtp/smtp.listener.ts +60 -60
  169. package/src/listeners/ssrf/__tests__/ssrf.extractor.test.ts +41 -41
  170. package/src/listeners/ssrf/__tests__/ssrf.listener.test.ts +87 -87
  171. package/src/listeners/ssrf/ssrf.extractor.ts +14 -14
  172. package/src/listeners/ssrf/ssrf.listener.ts +37 -37
  173. package/src/listeners/tcp/tcp.extractor.ts +16 -16
  174. package/src/listeners/tcp/tcp.listener.ts +61 -61
  175. package/src/listeners/webhook/__tests__/webhook.extractor.test.ts +35 -35
  176. package/src/listeners/webhook/__tests__/webhook.listener.test.ts +122 -122
  177. package/src/listeners/webhook/webhook.extractor.ts +12 -12
  178. package/src/listeners/webhook/webhook.listener.ts +58 -58
  179. package/src/listeners/websocket/__tests__/websocket.extractor.test.ts +33 -33
  180. package/src/listeners/websocket/__tests__/websocket.listener.test.ts +90 -90
  181. package/src/listeners/websocket/websocket.extractor.ts +11 -11
  182. package/src/listeners/websocket/websocket.listener.ts +40 -40
  183. package/src/storage-adapters/adapters/__tests__/memory.storage.test.ts +75 -75
  184. package/src/storage-adapters/adapters/memory.storage.ts +64 -64
  185. package/src/storage-adapters/storage.interface.ts +26 -26
  186. package/src/types/event.types.ts +147 -147
  187. package/tsconfig.json +21 -21
@@ -0,0 +1,8 @@
1
+ import { CoreRouter } from "../../core/router";
2
+ export declare class WebSocketListener {
3
+ private router;
4
+ private server;
5
+ private logger;
6
+ constructor(router: CoreRouter, port: number);
7
+ stop(): void;
8
+ }
@@ -0,0 +1,21 @@
1
+ import { Storage } from "../storage.interface";
2
+ import { AnyNormalizedEvent } from "../../types/event.types";
3
+ export declare class MemoryStorage implements Storage {
4
+ private events;
5
+ save(event: AnyNormalizedEvent): Promise<void>;
6
+ getEvent(id: string): Promise<AnyNormalizedEvent | null>;
7
+ listEvents(params: {
8
+ type?: string;
9
+ page?: number;
10
+ limit?: number;
11
+ }): Promise<AnyNormalizedEvent[]>;
12
+ getAll(): Promise<AnyNormalizedEvent[]>;
13
+ deleteEvent(id: string): Promise<boolean>;
14
+ clearEvents(): Promise<void>;
15
+ getStats(): Promise<{
16
+ total: number;
17
+ byType: Record<string, number>;
18
+ }>;
19
+ getById(id: string): Promise<AnyNormalizedEvent | null>;
20
+ delete(id: string): Promise<boolean>;
21
+ }
@@ -0,0 +1,18 @@
1
+ import { AnyNormalizedEvent } from "../types/event.types";
2
+ export interface StorageListParams {
3
+ type?: string;
4
+ page?: number;
5
+ limit?: number;
6
+ }
7
+ export interface Storage {
8
+ save(event: AnyNormalizedEvent): Promise<void>;
9
+ getEvent(id: string): Promise<AnyNormalizedEvent | null>;
10
+ listEvents(params: StorageListParams): Promise<AnyNormalizedEvent[]>;
11
+ deleteEvent(id: string): Promise<boolean>;
12
+ clearEvents(): Promise<void>;
13
+ getAll(): Promise<AnyNormalizedEvent[]>;
14
+ getStats(): Promise<{
15
+ total: number;
16
+ byType: Record<string, number>;
17
+ }>;
18
+ }
@@ -0,0 +1,118 @@
1
+ export interface RawEvent {
2
+ ip: string;
3
+ method: string;
4
+ path: string;
5
+ headers: Record<string, string | string[] | undefined>;
6
+ query: Record<string, any>;
7
+ body: any;
8
+ raw: any;
9
+ }
10
+ export interface RawDnsEvent {
11
+ ip: string;
12
+ query: string;
13
+ recordType: string;
14
+ raw: any;
15
+ }
16
+ export interface RawSmtpEvent {
17
+ ip: string;
18
+ from: string;
19
+ to: string[];
20
+ subject: string;
21
+ body: string;
22
+ raw: any;
23
+ }
24
+ export interface RawTcpEvent {
25
+ ip: string;
26
+ port: number;
27
+ data: string;
28
+ raw: any;
29
+ }
30
+ export interface RawSsrfEvent {
31
+ ip: string;
32
+ method: string | undefined;
33
+ path: string | undefined;
34
+ headers: Record<string, string | string[] | undefined>;
35
+ query: Record<string, any>;
36
+ raw: any;
37
+ }
38
+ export interface RawWebhookEvent {
39
+ ip: string;
40
+ headers: Record<string, string | string[] | undefined>;
41
+ body: any;
42
+ raw: any;
43
+ }
44
+ export interface RawWebSocketEvent {
45
+ ip: string;
46
+ message: string;
47
+ raw: any;
48
+ }
49
+ export interface NormalizedHttpEvent {
50
+ id: string;
51
+ type: "http";
52
+ timestamp: number;
53
+ sourceIp: string;
54
+ request: {
55
+ method: string;
56
+ path: string;
57
+ headers: Record<string, string | string[] | undefined>;
58
+ query: Record<string, any>;
59
+ body: any;
60
+ };
61
+ }
62
+ export interface NormalizedDnsEvent {
63
+ id: string;
64
+ type: "dns";
65
+ timestamp: number;
66
+ ip: string;
67
+ query: string;
68
+ recordType: string;
69
+ raw: any;
70
+ }
71
+ export interface NormalizedSmtpEvent {
72
+ id: string;
73
+ type: "smtp";
74
+ timestamp: number;
75
+ ip: string;
76
+ from: string;
77
+ to: string[];
78
+ subject: string;
79
+ body: string;
80
+ raw: any;
81
+ }
82
+ export interface NormalizedTcpEvent {
83
+ id: string;
84
+ type: "tcp";
85
+ timestamp: number;
86
+ ip: string;
87
+ port: number;
88
+ data: string;
89
+ raw: any;
90
+ }
91
+ export interface NormalizedSsrfEvent {
92
+ id: string;
93
+ type: "ssrf";
94
+ timestamp: number;
95
+ sourceIp: string;
96
+ request: {
97
+ method: string | undefined;
98
+ path: string | undefined;
99
+ headers: Record<string, string | string[] | undefined>;
100
+ query: Record<string, any>;
101
+ };
102
+ }
103
+ export interface NormalizedWebhookEvent {
104
+ id: string;
105
+ type: "webhook";
106
+ timestamp: number;
107
+ sourceIp: string;
108
+ headers: Record<string, string | string[] | undefined>;
109
+ body: any;
110
+ }
111
+ export interface NormalizedWebSocketEvent {
112
+ id: string;
113
+ type: "websocket";
114
+ timestamp: number;
115
+ sourceIp: string;
116
+ message: string;
117
+ }
118
+ export type AnyNormalizedEvent = NormalizedHttpEvent | NormalizedDnsEvent | NormalizedSmtpEvent | NormalizedTcpEvent | NormalizedSsrfEvent | NormalizedWebhookEvent | NormalizedWebSocketEvent;
File without changes
package/jest.config.js CHANGED
@@ -1,14 +1,14 @@
1
- const { createDefaultPreset } = require("ts-jest");
2
-
3
- const tsJestTransformCfg = createDefaultPreset().transform;
4
-
5
- /** @type {import("jest").Config} **/
6
- module.exports = {
7
- testEnvironment: "node",
8
- transform: {
9
- ...tsJestTransformCfg,
10
- },
11
-
12
- // 🔥 Empêche Jest d'exécuter les tests compilés dans dist/
13
- testPathIgnorePatterns: ["/dist/"],
14
- };
1
+ const { createDefaultPreset } = require("ts-jest");
2
+
3
+ const tsJestTransformCfg = createDefaultPreset().transform;
4
+
5
+ /** @type {import("jest").Config} **/
6
+ module.exports = {
7
+ testEnvironment: "node",
8
+ transform: {
9
+ ...tsJestTransformCfg,
10
+ },
11
+
12
+ // 🔥 Empêche Jest d'exécuter les tests compilés dans dist/
13
+ testPathIgnorePatterns: ["/dist/"],
14
+ };
package/package.json CHANGED
@@ -1,45 +1,45 @@
1
- {
2
- "name": "@j3r3mcdev/oast-server",
3
- "version": "1.1.1",
4
- "description": "Modular OAST callback server for security auditing",
5
- "main": "dist/index.js",
6
- "types": "dist/index.d.ts",
7
- "scripts": {
8
- "dev": "ts-node-dev --respawn --transpile-only src/core/server.ts",
9
- "build": "tsc -p tsconfig.json",
10
- "start": "node dist/core/server.js",
11
- "clean": "rimraf dist",
12
- "test": "jest --passWithNoTests"
13
- },
14
- "keywords": [
15
- "oast",
16
- "security",
17
- "ssrf",
18
- "callback",
19
- "audit",
20
- "pentest"
21
- ],
22
- "author": "Jérémy",
23
- "license": "MIT",
24
- "dependencies": {
25
- "body-parser": "^1.20.2",
26
- "cors": "^2.8.5",
27
- "dotenv": "^16.4.5",
28
- "express": "^4.19.2",
29
- "ioredis": "^5.4.1",
30
- "ws": "^8.21.0"
31
- },
32
- "devDependencies": {
33
- "@types/body-parser": "^1.19.5",
34
- "@types/cors": "^2.8.17",
35
- "@types/express": "^4.17.21",
36
- "@types/jest": "^29.5.14",
37
- "@types/node": "^20.12.7",
38
- "@types/ws": "^8.18.1",
39
- "jest": "^29.7.0",
40
- "rimraf": "^5.0.5",
41
- "ts-jest": "^29.4.11",
42
- "ts-node-dev": "^2.0.0",
43
- "typescript": "^5.4.5"
44
- }
45
- }
1
+ {
2
+ "name": "@j3r3mcdev/oast-server",
3
+ "version": "1.1.2",
4
+ "description": "Modular OAST callback server for security auditing",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "dev": "ts-node-dev --respawn --transpile-only src/core/server.ts",
9
+ "build": "tsc -p tsconfig.json",
10
+ "start": "node dist/core/server.js",
11
+ "clean": "rimraf dist",
12
+ "test": "jest --passWithNoTests"
13
+ },
14
+ "keywords": [
15
+ "oast",
16
+ "security",
17
+ "ssrf",
18
+ "callback",
19
+ "audit",
20
+ "pentest"
21
+ ],
22
+ "author": "Jérémy",
23
+ "license": "MIT",
24
+ "dependencies": {
25
+ "body-parser": "^1.20.2",
26
+ "cors": "^2.8.5",
27
+ "dotenv": "^16.4.5",
28
+ "express": "^4.19.2",
29
+ "ioredis": "^5.4.1",
30
+ "ws": "^8.21.0"
31
+ },
32
+ "devDependencies": {
33
+ "@types/body-parser": "^1.19.5",
34
+ "@types/cors": "^2.8.17",
35
+ "@types/express": "^4.17.21",
36
+ "@types/jest": "^29.5.14",
37
+ "@types/node": "^20.12.7",
38
+ "@types/ws": "^8.18.1",
39
+ "jest": "^29.7.0",
40
+ "rimraf": "^5.0.5",
41
+ "ts-jest": "^29.4.11",
42
+ "ts-node-dev": "^2.0.0",
43
+ "typescript": "^5.4.5"
44
+ }
45
+ }
@@ -1,9 +1,9 @@
1
- 8faa343 (HEAD -> feat/core-event, origin/main, main) HEAD@{0}: checkout: moving from main to feat/core-event
2
- 8faa343 (HEAD -> feat/core-event, origin/main, main) HEAD@{1}: commit: ADD FULL architecture
3
- 8f8f441 HEAD@{2}: commit: ADD CI/CD
4
- 0c987a0 HEAD@{3}: commit: ADD CI/CD
5
- 8aad148 HEAD@{4}: commit: ADD CI/CD
6
- e1f2959 HEAD@{5}: commit: ADD CI/CD
7
- 271e3b1 HEAD@{6}: commit: ADD Architecture & package.json & tsconfig.json
8
- b840cd3 HEAD@{7}: Branch: renamed refs/heads/master to refs/heads/main
9
- b840cd3 HEAD@{9}: commit (initial): Initial project structure
1
+ 8faa343 (HEAD -> feat/core-event, origin/main, main) HEAD@{0}: checkout: moving from main to feat/core-event
2
+ 8faa343 (HEAD -> feat/core-event, origin/main, main) HEAD@{1}: commit: ADD FULL architecture
3
+ 8f8f441 HEAD@{2}: commit: ADD CI/CD
4
+ 0c987a0 HEAD@{3}: commit: ADD CI/CD
5
+ 8aad148 HEAD@{4}: commit: ADD CI/CD
6
+ e1f2959 HEAD@{5}: commit: ADD CI/CD
7
+ 271e3b1 HEAD@{6}: commit: ADD Architecture & package.json & tsconfig.json
8
+ b840cd3 HEAD@{7}: Branch: renamed refs/heads/master to refs/heads/main
9
+ b840cd3 HEAD@{9}: commit (initial): Initial project structure
@@ -1,74 +1,74 @@
1
- import { describe, it, expect, jest, beforeEach } from "@jest/globals";
2
- import { TasksController } from "../tasks.controller";
3
- import { TasksService } from "../../services/tasks.service";
4
-
5
- describe("TasksController", () => {
6
- let service: jest.Mocked<TasksService>;
7
- let controller: TasksController;
8
-
9
- beforeEach(() => {
10
- service = {
11
- create: jest.fn() as jest.MockedFunction<TasksService["create"]>,
12
- get: jest.fn() as jest.MockedFunction<TasksService["get"]>,
13
- list: jest.fn() as jest.MockedFunction<TasksService["list"]>,
14
- cancel: jest.fn() as jest.MockedFunction<TasksService["cancel"]>,
15
- } as unknown as jest.Mocked<TasksService>;
16
-
17
- controller = new TasksController(service);
18
- });
19
-
20
- it("crée une tâche", async () => {
21
- const fakeTask = {
22
- id: "123",
23
- type: "x",
24
- payload: {},
25
- priority: "normal",
26
- metadata: {},
27
- status: "pending",
28
- createdAt: Date.now(),
29
- updatedAt: Date.now(),
30
- } as const;
31
-
32
- service.create.mockReturnValue(fakeTask);
33
-
34
- const req = { body: { type: "x", payload: {} } };
35
-
36
- const result = await controller.create({ req, res: {}, params: {} });
37
-
38
- expect(service.create).toHaveBeenCalled();
39
- expect(result).toEqual({
40
- status: 201,
41
- body: fakeTask,
42
- });
43
- });
44
-
45
- it("retourne 404 si tâche absente", async () => {
46
- service.get.mockReturnValue(undefined);
47
-
48
- const result = await controller.getOne({
49
- req: {},
50
- res: {},
51
- params: { id: "123" },
52
- });
53
-
54
- expect(result).toEqual({
55
- status: 404,
56
- body: { error: "Task not found" },
57
- });
58
- });
59
-
60
- it("annule une tâche", async () => {
61
- service.cancel.mockReturnValue(true);
62
-
63
- const result = await controller.cancel({
64
- req: {},
65
- res: {},
66
- params: { id: "123" },
67
- });
68
-
69
- expect(result).toEqual({
70
- status: 200,
71
- body: { cancelled: true },
72
- });
73
- });
74
- });
1
+ import { describe, it, expect, jest, beforeEach } from "@jest/globals";
2
+ import { TasksController } from "../tasks.controller";
3
+ import { TasksService } from "../../services/tasks.service";
4
+
5
+ describe("TasksController", () => {
6
+ let service: jest.Mocked<TasksService>;
7
+ let controller: TasksController;
8
+
9
+ beforeEach(() => {
10
+ service = {
11
+ create: jest.fn() as jest.MockedFunction<TasksService["create"]>,
12
+ get: jest.fn() as jest.MockedFunction<TasksService["get"]>,
13
+ list: jest.fn() as jest.MockedFunction<TasksService["list"]>,
14
+ cancel: jest.fn() as jest.MockedFunction<TasksService["cancel"]>,
15
+ } as unknown as jest.Mocked<TasksService>;
16
+
17
+ controller = new TasksController(service);
18
+ });
19
+
20
+ it("crée une tâche", async () => {
21
+ const fakeTask = {
22
+ id: "123",
23
+ type: "x",
24
+ payload: {},
25
+ priority: "normal",
26
+ metadata: {},
27
+ status: "pending",
28
+ createdAt: Date.now(),
29
+ updatedAt: Date.now(),
30
+ } as const;
31
+
32
+ service.create.mockReturnValue(fakeTask);
33
+
34
+ const req = { body: { type: "x", payload: {} } };
35
+
36
+ const result = await controller.create({ req, res: {}, params: {} });
37
+
38
+ expect(service.create).toHaveBeenCalled();
39
+ expect(result).toEqual({
40
+ status: 201,
41
+ body: fakeTask,
42
+ });
43
+ });
44
+
45
+ it("retourne 404 si tâche absente", async () => {
46
+ service.get.mockReturnValue(undefined);
47
+
48
+ const result = await controller.getOne({
49
+ req: {},
50
+ res: {},
51
+ params: { id: "123" },
52
+ });
53
+
54
+ expect(result).toEqual({
55
+ status: 404,
56
+ body: { error: "Task not found" },
57
+ });
58
+ });
59
+
60
+ it("annule une tâche", async () => {
61
+ service.cancel.mockReturnValue(true);
62
+
63
+ const result = await controller.cancel({
64
+ req: {},
65
+ res: {},
66
+ params: { id: "123" },
67
+ });
68
+
69
+ expect(result).toEqual({
70
+ status: 200,
71
+ body: { cancelled: true },
72
+ });
73
+ });
74
+ });
@@ -1,10 +1,10 @@
1
- import { EventsService } from "../services/events.service";
2
-
3
- export class EventsController {
4
- constructor(private readonly events: EventsService) {}
5
-
6
- stream = async ({ res, query }: any) => {
7
- const channels = query.channels?.split(",") ?? [];
8
- return this.events.connect(res, channels);
9
- };
10
- }
1
+ import { EventsService } from "../services/events.service";
2
+
3
+ export class EventsController {
4
+ constructor(private readonly events: EventsService) {}
5
+
6
+ stream = async ({ res, query }: any) => {
7
+ const channels = query.channels?.split(",") ?? [];
8
+ return this.events.connect(res, channels);
9
+ };
10
+ }
@@ -1,7 +1,7 @@
1
- import { Request, Response } from "express";
2
-
3
- export class HealthController {
4
- check = (req: Request, res: Response) => {
5
- res.json({ status: "ok", timestamp: Date.now() });
6
- };
7
- }
1
+ import { Request, Response } from "express";
2
+
3
+ export class HealthController {
4
+ check = (req: Request, res: Response) => {
5
+ res.json({ status: "ok", timestamp: Date.now() });
6
+ };
7
+ }
@@ -1,41 +1,41 @@
1
- import { TasksService } from "../services/tasks.service";
2
- import { CreateTaskDtoValidator } from "../dto/create-task.dto";
3
- import { FilterTasksDtoValidator } from "../dto/filter-tasks.dto";
4
-
5
- export interface HandlerContext {
6
- params: Record<string, string>;
7
- req: any;
8
- res: any;
9
- }
10
-
11
- export class TasksController {
12
- constructor(private readonly tasks: TasksService) {}
13
-
14
- list = async ({ req }: HandlerContext) => {
15
- const dto = FilterTasksDtoValidator.validate(req.query);
16
- const result = await this.tasks.list(dto);
17
- return { status: 200, body: result };
18
- };
19
-
20
- create = async ({ req }: HandlerContext) => {
21
- const dto = CreateTaskDtoValidator.validate(req.body);
22
- const task = await this.tasks.create(dto);
23
- return { status: 201, body: task };
24
- };
25
-
26
- getOne = async ({ params }: HandlerContext) => {
27
- const task = await this.tasks.get(params.id);
28
- if (!task) {
29
- return { status: 404, body: { error: "Task not found" } };
30
- }
31
- return { status: 200, body: task };
32
- };
33
-
34
- cancel = async ({ params }: HandlerContext) => {
35
- const ok = await this.tasks.cancel(params.id);
36
- if (!ok) {
37
- return { status: 404, body: { error: "Task not found" } };
38
- }
39
- return { status: 200, body: { cancelled: true } };
40
- };
41
- }
1
+ import { TasksService } from "../services/tasks.service";
2
+ import { CreateTaskDtoValidator } from "../dto/create-task.dto";
3
+ import { FilterTasksDtoValidator } from "../dto/filter-tasks.dto";
4
+
5
+ export interface HandlerContext {
6
+ params: Record<string, string>;
7
+ req: any;
8
+ res: any;
9
+ }
10
+
11
+ export class TasksController {
12
+ constructor(private readonly tasks: TasksService) {}
13
+
14
+ list = async ({ req }: HandlerContext) => {
15
+ const dto = FilterTasksDtoValidator.validate(req.query);
16
+ const result = await this.tasks.list(dto);
17
+ return { status: 200, body: result };
18
+ };
19
+
20
+ create = async ({ req }: HandlerContext) => {
21
+ const dto = CreateTaskDtoValidator.validate(req.body);
22
+ const task = await this.tasks.create(dto);
23
+ return { status: 201, body: task };
24
+ };
25
+
26
+ getOne = async ({ params }: HandlerContext) => {
27
+ const task = await this.tasks.get(params.id);
28
+ if (!task) {
29
+ return { status: 404, body: { error: "Task not found" } };
30
+ }
31
+ return { status: 200, body: task };
32
+ };
33
+
34
+ cancel = async ({ params }: HandlerContext) => {
35
+ const ok = await this.tasks.cancel(params.id);
36
+ if (!ok) {
37
+ return { status: 404, body: { error: "Task not found" } };
38
+ }
39
+ return { status: 200, body: { cancelled: true } };
40
+ };
41
+ }