@cfticketing/common 1.0.12 → 1.0.15

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 (49) hide show
  1. package/build/errors/bad-request-error.d.ts +9 -0
  2. package/build/errors/bad-request-error.js +18 -0
  3. package/build/errors/bad-request-error.js.map +1 -0
  4. package/build/errors/custom-error.d.ts +8 -0
  5. package/build/errors/custom-error.js +12 -0
  6. package/build/errors/custom-error.js.map +1 -0
  7. package/build/errors/database-connection-error.d.ts +9 -0
  8. package/build/errors/database-connection-error.js +22 -0
  9. package/build/errors/database-connection-error.js.map +1 -0
  10. package/build/errors/not-authorized-error.d.ts +8 -0
  11. package/build/errors/not-authorized-error.js +16 -0
  12. package/build/errors/not-authorized-error.js.map +1 -0
  13. package/build/errors/not-found-error.d.ts +8 -0
  14. package/build/errors/not-found-error.js +21 -0
  15. package/build/errors/not-found-error.js.map +1 -0
  16. package/build/errors/request-validation-error.d.ts +14 -0
  17. package/build/errors/request-validation-error.js +23 -0
  18. package/build/errors/request-validation-error.js.map +1 -0
  19. package/build/events/base-listener.d.ts +18 -0
  20. package/build/events/base-listener.js +47 -0
  21. package/build/events/base-listener.js.map +1 -0
  22. package/build/events/base-publisher.d.ts +13 -0
  23. package/build/events/base-publisher.js +26 -0
  24. package/build/events/base-publisher.js.map +1 -0
  25. package/build/events/subjects.d.ts +4 -0
  26. package/build/events/subjects.js +9 -0
  27. package/build/events/subjects.js.map +1 -0
  28. package/build/events/ticket-created-event.d.ts +9 -0
  29. package/build/events/ticket-created-event.js +3 -0
  30. package/build/events/ticket-created-event.js.map +1 -0
  31. package/build/events/ticket-updated-event.d.ts +10 -0
  32. package/build/events/ticket-updated-event.js +3 -0
  33. package/build/events/ticket-updated-event.js.map +1 -0
  34. package/build/index.d.ts +15 -0
  35. package/build/index.js +32 -0
  36. package/build/index.js.map +1 -0
  37. package/build/middlewares/current-user.d.ts +14 -0
  38. package/build/middlewares/current-user.js +27 -0
  39. package/build/middlewares/current-user.js.map +1 -0
  40. package/build/middlewares/error-handler.d.ts +2 -0
  41. package/build/middlewares/error-handler.js +14 -0
  42. package/build/middlewares/error-handler.js.map +1 -0
  43. package/build/middlewares/require-auth.d.ts +2 -0
  44. package/build/middlewares/require-auth.js +13 -0
  45. package/build/middlewares/require-auth.js.map +1 -0
  46. package/build/middlewares/validate-request.d.ts +2 -0
  47. package/build/middlewares/validate-request.js +16 -0
  48. package/build/middlewares/validate-request.js.map +1 -0
  49. package/package.json +8 -7
@@ -0,0 +1,9 @@
1
+ import { CustomError } from "./custom-error.js";
2
+ export declare class BadRequestError extends CustomError {
3
+ message: string;
4
+ statusCode: number;
5
+ constructor(message: string);
6
+ serializeErrors(): {
7
+ message: string;
8
+ }[];
9
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.BadRequestError = void 0;
4
+ const custom_error_js_1 = require("./custom-error.js");
5
+ class BadRequestError extends custom_error_js_1.CustomError {
6
+ constructor(message) {
7
+ super(message);
8
+ this.message = message;
9
+ this.statusCode = 400;
10
+ // Only because we are extending a built-in class
11
+ Object.setPrototypeOf(this, BadRequestError.prototype);
12
+ }
13
+ serializeErrors() {
14
+ return [{ message: this.message }];
15
+ }
16
+ }
17
+ exports.BadRequestError = BadRequestError;
18
+ //# sourceMappingURL=bad-request-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bad-request-error.js","sourceRoot":"","sources":["../../src/errors/bad-request-error.ts"],"names":[],"mappings":";;;AAAA,uDAAgD;AAEhD,MAAa,eAAgB,SAAQ,6BAAW;IAG9C,YAAmB,OAAe;QAChC,KAAK,CAAC,OAAO,CAAC,CAAC;QADE,YAAO,GAAP,OAAO,CAAQ;QAFlC,eAAU,GAAG,GAAG,CAAC;QAKf,iDAAiD;QACjD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,eAAe;QACb,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;CACF;AAbD,0CAaC"}
@@ -0,0 +1,8 @@
1
+ export declare abstract class CustomError extends Error {
2
+ abstract statusCode: number;
3
+ constructor(message: string);
4
+ abstract serializeErrors(): {
5
+ message: string;
6
+ field?: string;
7
+ }[];
8
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomError = void 0;
4
+ class CustomError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ // Only because we are extending a built-in class
8
+ Object.setPrototypeOf(this, CustomError.prototype);
9
+ }
10
+ }
11
+ exports.CustomError = CustomError;
12
+ //# sourceMappingURL=custom-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-error.js","sourceRoot":"","sources":["../../src/errors/custom-error.ts"],"names":[],"mappings":";;;AAAA,MAAsB,WAAY,SAAQ,KAAK;IAE7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QAEf,iDAAiD;QACjD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACrD,CAAC;CAGF;AAVD,kCAUC"}
@@ -0,0 +1,9 @@
1
+ import { CustomError } from "./custom-error.js";
2
+ export declare class DatabaseConnectionError extends CustomError {
3
+ statusCode: number;
4
+ reason: string;
5
+ constructor();
6
+ serializeErrors(): {
7
+ message: string;
8
+ }[];
9
+ }
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseConnectionError = void 0;
4
+ const custom_error_js_1 = require("./custom-error.js");
5
+ class DatabaseConnectionError extends custom_error_js_1.CustomError {
6
+ constructor() {
7
+ super("Error connecting to database");
8
+ this.statusCode = 500;
9
+ this.reason = "Error connecting to database";
10
+ // Only because we are extending a built-in class
11
+ Object.setPrototypeOf(this, DatabaseConnectionError.prototype);
12
+ }
13
+ serializeErrors() {
14
+ return [
15
+ {
16
+ message: this.reason,
17
+ },
18
+ ];
19
+ }
20
+ }
21
+ exports.DatabaseConnectionError = DatabaseConnectionError;
22
+ //# sourceMappingURL=database-connection-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-connection-error.js","sourceRoot":"","sources":["../../src/errors/database-connection-error.ts"],"names":[],"mappings":";;;AAAA,uDAAgD;AAEhD,MAAa,uBAAwB,SAAQ,6BAAW;IAGtD;QACE,KAAK,CAAC,8BAA8B,CAAC,CAAC;QAHxC,eAAU,GAAG,GAAG,CAAC;QACjB,WAAM,GAAG,8BAA8B,CAAC;QAItC,iDAAiD;QACjD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IACjE,CAAC;IACD,eAAe;QACb,OAAO;YACL;gBACE,OAAO,EAAE,IAAI,CAAC,MAAM;aACrB;SACF,CAAC;IACJ,CAAC;CACF;AAhBD,0DAgBC"}
@@ -0,0 +1,8 @@
1
+ import { CustomError } from "./custom-error.js";
2
+ export declare class NotAuthorizedError extends CustomError {
3
+ statusCode: number;
4
+ constructor();
5
+ serializeErrors(): {
6
+ message: string;
7
+ }[];
8
+ }
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotAuthorizedError = void 0;
4
+ const custom_error_js_1 = require("./custom-error.js");
5
+ class NotAuthorizedError extends custom_error_js_1.CustomError {
6
+ constructor() {
7
+ super("Not authorized");
8
+ this.statusCode = 401;
9
+ Object.setPrototypeOf(this, NotAuthorizedError.prototype);
10
+ }
11
+ serializeErrors() {
12
+ return [{ message: "Not authorized" }];
13
+ }
14
+ }
15
+ exports.NotAuthorizedError = NotAuthorizedError;
16
+ //# sourceMappingURL=not-authorized-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-authorized-error.js","sourceRoot":"","sources":["../../src/errors/not-authorized-error.ts"],"names":[],"mappings":";;;AAAA,uDAAgD;AAEhD,MAAa,kBAAmB,SAAQ,6BAAW;IAGjD;QACE,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAH1B,eAAU,GAAG,GAAG,CAAC;QAIf,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,CAAC,SAAS,CAAC,CAAC;IAC5D,CAAC;IAED,eAAe;QACb,OAAO,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,CAAC,CAAC;IACzC,CAAC;CACF;AAXD,gDAWC"}
@@ -0,0 +1,8 @@
1
+ import { CustomError } from "./custom-error.js";
2
+ export declare class NotFoundError extends CustomError {
3
+ statusCode: number;
4
+ constructor();
5
+ serializeErrors(): {
6
+ message: string;
7
+ }[];
8
+ }
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotFoundError = void 0;
4
+ const custom_error_js_1 = require("./custom-error.js");
5
+ class NotFoundError extends custom_error_js_1.CustomError {
6
+ constructor() {
7
+ super("Route not found");
8
+ this.statusCode = 404;
9
+ // Only because we are extending a built-in class
10
+ Object.setPrototypeOf(this, NotFoundError.prototype);
11
+ }
12
+ serializeErrors() {
13
+ return [
14
+ {
15
+ message: "Not Found",
16
+ },
17
+ ];
18
+ }
19
+ }
20
+ exports.NotFoundError = NotFoundError;
21
+ //# sourceMappingURL=not-found-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"not-found-error.js","sourceRoot":"","sources":["../../src/errors/not-found-error.ts"],"names":[],"mappings":";;;AAAA,uDAAgD;AAEhD,MAAa,aAAc,SAAQ,6BAAW;IAE5C;QACE,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAF3B,eAAU,GAAG,GAAG,CAAC;QAIf,iDAAiD;QACjD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IACD,eAAe;QACb,OAAO;YACL;gBACE,OAAO,EAAE,WAAW;aACrB;SACF,CAAC;IACJ,CAAC;CACF;AAfD,sCAeC"}
@@ -0,0 +1,14 @@
1
+ import { CustomError } from "./custom-error.js";
2
+ import type { ValidationError } from "express-validator";
3
+ export declare class RequestValidationError extends CustomError {
4
+ errors: ValidationError[];
5
+ statusCode: number;
6
+ constructor(errors: ValidationError[]);
7
+ serializeErrors(): ({
8
+ message: any;
9
+ field: string;
10
+ } | {
11
+ message: any;
12
+ field?: undefined;
13
+ })[];
14
+ }
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RequestValidationError = void 0;
4
+ const custom_error_js_1 = require("./custom-error.js");
5
+ class RequestValidationError extends custom_error_js_1.CustomError {
6
+ constructor(errors) {
7
+ super("Invalid request parameters");
8
+ this.errors = errors;
9
+ this.statusCode = 400;
10
+ Object.setPrototypeOf(this, RequestValidationError.prototype);
11
+ }
12
+ serializeErrors() {
13
+ return this.errors.map((err) => {
14
+ if (err.type === "field") {
15
+ return { message: err.msg, field: err.path };
16
+ }
17
+ // Generic fallback: for other error types
18
+ return { message: err.msg };
19
+ });
20
+ }
21
+ }
22
+ exports.RequestValidationError = RequestValidationError;
23
+ //# sourceMappingURL=request-validation-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-validation-error.js","sourceRoot":"","sources":["../../src/errors/request-validation-error.ts"],"names":[],"mappings":";;;AAAA,uDAAgD;AAGhD,MAAa,sBAAuB,SAAQ,6BAAW;IAGrD,YAAmB,MAAyB;QAC1C,KAAK,CAAC,4BAA4B,CAAC,CAAC;QADnB,WAAM,GAAN,MAAM,CAAmB;QAF5C,eAAU,GAAG,GAAG,CAAC;QAIf,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,sBAAsB,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;YAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACzB,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;YAC/C,CAAC;YAED,0CAA0C;YAC1C,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;QAC9B,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAlBD,wDAkBC"}
@@ -0,0 +1,18 @@
1
+ import { Message, Stan } from "node-nats-streaming";
2
+ import { Subjects } from "./subjects";
3
+ interface Event {
4
+ subject: Subjects;
5
+ data: any;
6
+ }
7
+ export declare abstract class Listener<T extends Event> {
8
+ abstract subject: T["subject"];
9
+ abstract queueGroupName: string;
10
+ abstract onMessage(data: T["data"], msg: Message): void;
11
+ private client;
12
+ protected ackWait: number;
13
+ constructor(client: Stan);
14
+ subscriptionOptions(): import("node-nats-streaming").SubscriptionOptions;
15
+ listen(): void;
16
+ parseMessage(msg: Message): any;
17
+ }
18
+ export {};
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Listener = void 0;
4
+ // Abstract class for a NATS event listener
5
+ // Cannot be instantiated directly — must be extended by a subclass
6
+ class Listener {
7
+ // Constructor: must provide a NATS client when creating a subclass
8
+ constructor(client) {
9
+ // Protected property: accessible inside this class and subclasses
10
+ this.ackWait = 5 * 1000; // 5 seconds to acknowledge messages
11
+ this.client = client; // store client in private property
12
+ }
13
+ // Method to configure subscription options for NATS
14
+ subscriptionOptions() {
15
+ return this.client
16
+ .subscriptionOptions()
17
+ .setManualAckMode(true) // require manual ack of messages
18
+ .setAckWait(this.ackWait) // wait time before message is redelivered
19
+ .setDurableName(this.queueGroupName); // durable subscription: remembers last processed message
20
+ }
21
+ // Main method to start listening to NATS messages
22
+ listen() {
23
+ const subscription = this.client.subscribe(this.subject, // topic
24
+ this.queueGroupName, // queue group
25
+ this.subscriptionOptions());
26
+ // Event handler for when a message arrives
27
+ subscription.on("message", (msg) => {
28
+ console.log(`Received message: ${this.subject} / ${this.queueGroupName}`);
29
+ // Parse the message into JSON
30
+ const parsedData = this.parseMessage(msg);
31
+ console.log(`Parsed data: ${JSON.stringify(parsedData)}`);
32
+ // Call the subclass's implementation of onMessage
33
+ this.onMessage(parsedData, msg);
34
+ // Automatically ack the message after processing
35
+ msg.ack();
36
+ });
37
+ }
38
+ // Helper method to parse incoming NATS messages
39
+ parseMessage(msg) {
40
+ const data = msg.getData();
41
+ return typeof data === "string"
42
+ ? JSON.parse(data) // if message is a string
43
+ : JSON.parse(data.toString("utf8")); // if message is a buffer
44
+ }
45
+ }
46
+ exports.Listener = Listener;
47
+ //# sourceMappingURL=base-listener.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-listener.js","sourceRoot":"","sources":["../../src/events/base-listener.ts"],"names":[],"mappings":";;;AAQA,2CAA2C;AAC3C,mEAAmE;AAEnE,MAAsB,QAAQ;IAY5B,mEAAmE;IACnE,YAAY,MAAY;QAJxB,kEAAkE;QACxD,YAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,oCAAoC;QAIhE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,mCAAmC;IAC3D,CAAC;IAED,oDAAoD;IACpD,mBAAmB;QACjB,OAAO,IAAI,CAAC,MAAM;aACf,mBAAmB,EAAE;aACrB,gBAAgB,CAAC,IAAI,CAAC,CAAC,iCAAiC;aACxD,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,0CAA0C;aACnE,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,yDAAyD;IACnG,CAAC;IAED,kDAAkD;IAClD,MAAM;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CACxC,IAAI,CAAC,OAAO,EAAE,QAAQ;QACtB,IAAI,CAAC,cAAc,EAAE,cAAc;QACnC,IAAI,CAAC,mBAAmB,EAAE,CAC3B,CAAC;QAEF,2CAA2C;QAC3C,YAAY,CAAC,EAAE,CAAC,SAAS,EAAE,CAAC,GAAY,EAAE,EAAE;YAC1C,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,OAAO,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;YAE1E,8BAA8B;YAC9B,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;YAE1D,kDAAkD;YAClD,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;YAEhC,iDAAiD;YACjD,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC;IAED,gDAAgD;IAChD,YAAY,CAAC,GAAY;QACvB,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC3B,OAAO,OAAO,IAAI,KAAK,QAAQ;YAC7B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,yBAAyB;YAC5C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,yBAAyB;IAClE,CAAC;CACF;AAzDD,4BAyDC"}
@@ -0,0 +1,13 @@
1
+ import { Stan } from "node-nats-streaming";
2
+ import { Subjects } from "./subjects";
3
+ interface Event {
4
+ subject: Subjects;
5
+ data: any;
6
+ }
7
+ export declare abstract class Publisher<T extends Event> {
8
+ abstract subject: T["subject"];
9
+ private client;
10
+ constructor(client: Stan);
11
+ publish(data: T["data"]): Promise<void>;
12
+ }
13
+ export {};
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Publisher = void 0;
4
+ // Abstract class for a NATS event publisher
5
+ // Cannot be instantiated directly — must be extended by a subclass
6
+ class Publisher {
7
+ // Constructor: must provide a NATS client when creating a subclass
8
+ constructor(client) {
9
+ this.client = client; // store client in private property
10
+ }
11
+ // Method to publish an event to NATS
12
+ publish(data) {
13
+ return new Promise((resolve, reject) => {
14
+ this.client.publish(this.subject, JSON.stringify(data), (err) => {
15
+ if (err) {
16
+ console.error(`Error publishing ${this.subject}: ${err.message}`);
17
+ return reject(err);
18
+ }
19
+ console.log(`Event Published to subject${this.subject}`);
20
+ resolve();
21
+ });
22
+ });
23
+ }
24
+ }
25
+ exports.Publisher = Publisher;
26
+ //# sourceMappingURL=base-publisher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-publisher.js","sourceRoot":"","sources":["../../src/events/base-publisher.ts"],"names":[],"mappings":";;;AAQA,4CAA4C;AAC5C,mEAAmE;AACnE,MAAsB,SAAS;IAO7B,mEAAmE;IACnE,YAAY,MAAY;QACtB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC,mCAAmC;IAC3D,CAAC;IAED,qCAAqC;IACrC,OAAO,CAAC,IAAe;QACrB,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9D,IAAI,GAAG,EAAE,CAAC;oBACR,OAAO,CAAC,KAAK,CAAC,oBAAoB,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;oBAClE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;gBACrB,CAAC;gBACD,OAAO,CAAC,GAAG,CAAC,6BAA6B,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;gBACzD,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAzBD,8BAyBC"}
@@ -0,0 +1,4 @@
1
+ export declare enum Subjects {
2
+ TicketCreated = "ticket:created",
3
+ TicketUpdated = "ticket:updated"
4
+ }
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Subjects = void 0;
4
+ var Subjects;
5
+ (function (Subjects) {
6
+ Subjects["TicketCreated"] = "ticket:created";
7
+ Subjects["TicketUpdated"] = "ticket:updated";
8
+ })(Subjects || (exports.Subjects = Subjects = {}));
9
+ //# sourceMappingURL=subjects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subjects.js","sourceRoot":"","sources":["../../src/events/subjects.ts"],"names":[],"mappings":";;;AAAA,IAAY,QAGX;AAHD,WAAY,QAAQ;IAClB,4CAAgC,CAAA;IAChC,4CAAgC,CAAA;AAClC,CAAC,EAHW,QAAQ,wBAAR,QAAQ,QAGnB"}
@@ -0,0 +1,9 @@
1
+ import { Subjects } from "./subjects";
2
+ export interface TicketCreatedEvent {
3
+ subject: Subjects.TicketCreated;
4
+ data: {
5
+ id: string;
6
+ title: string;
7
+ price: number;
8
+ };
9
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ticket-created-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-created-event.js","sourceRoot":"","sources":["../../src/events/ticket-created-event.ts"],"names":[],"mappings":""}
@@ -0,0 +1,10 @@
1
+ import { Subjects } from "./subjects";
2
+ export interface TicketUpdatedEvent {
3
+ subject: Subjects.TicketUpdated;
4
+ data: {
5
+ id: string;
6
+ title: string;
7
+ price: number;
8
+ userId: string;
9
+ };
10
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=ticket-updated-event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-updated-event.js","sourceRoot":"","sources":["../../src/events/ticket-updated-event.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ export * from "./errors/not-found-error.js";
2
+ export * from "./errors/bad-request-error.js";
3
+ export * from "./errors/database-connection-error.js";
4
+ export * from "./errors/not-authorized-error.js";
5
+ export * from "./errors/request-validation-error.js";
6
+ export * from "./errors/custom-error.js";
7
+ export * from "./middlewares/current-user.js";
8
+ export * from "./middlewares/error-handler.js";
9
+ export * from "./middlewares/require-auth.js";
10
+ export * from "./middlewares/validate-request.js";
11
+ export * from "./events/base-listener";
12
+ export * from "./events/base-publisher";
13
+ export * from "./events/subjects";
14
+ export * from "./events/ticket-updated-event";
15
+ export * from "./events/ticket-created-event";
package/build/index.js ADDED
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./errors/not-found-error.js"), exports);
18
+ __exportStar(require("./errors/bad-request-error.js"), exports);
19
+ __exportStar(require("./errors/database-connection-error.js"), exports);
20
+ __exportStar(require("./errors/not-authorized-error.js"), exports);
21
+ __exportStar(require("./errors/request-validation-error.js"), exports);
22
+ __exportStar(require("./errors/custom-error.js"), exports);
23
+ __exportStar(require("./middlewares/current-user.js"), exports);
24
+ __exportStar(require("./middlewares/error-handler.js"), exports);
25
+ __exportStar(require("./middlewares/require-auth.js"), exports);
26
+ __exportStar(require("./middlewares/validate-request.js"), exports);
27
+ __exportStar(require("./events/base-listener"), exports);
28
+ __exportStar(require("./events/base-publisher"), exports);
29
+ __exportStar(require("./events/subjects"), exports);
30
+ __exportStar(require("./events/ticket-updated-event"), exports);
31
+ __exportStar(require("./events/ticket-created-event"), exports);
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,8DAA4C;AAC5C,gEAA8C;AAC9C,wEAAsD;AACtD,mEAAiD;AACjD,uEAAqD;AACrD,2DAAyC;AAEzC,gEAA8C;AAC9C,iEAA+C;AAC/C,gEAA8C;AAC9C,oEAAkD;AAElD,yDAAuC;AACvC,0DAAwC;AACxC,oDAAkC;AAClC,gEAA8C;AAC9C,gEAA8C"}
@@ -0,0 +1,14 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ interface UserPayload {
3
+ id: string;
4
+ email: string;
5
+ }
6
+ declare global {
7
+ namespace Express {
8
+ interface Request {
9
+ currentUser?: UserPayload;
10
+ }
11
+ }
12
+ }
13
+ export declare const currentUser: (req: Request, res: Response, next: NextFunction) => void;
14
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.currentUser = void 0;
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ // Middleware to extract current user from JWT in session cookie
9
+ const currentUser = (req, res, next) => {
10
+ // If no session or no JWT, skip
11
+ if (!req.session || !req.session.jwt) {
12
+ return next();
13
+ }
14
+ try {
15
+ // Verify JWT using the secret key
16
+ const payload = jsonwebtoken_1.default.verify(req.session.jwt, process.env.JWT_KEY);
17
+ // Attach current user info to request object
18
+ req.currentUser = payload;
19
+ }
20
+ catch (err) {
21
+ console.warn("JWT verification failed:", err);
22
+ // Do not block request; just leave currentUser undefined
23
+ }
24
+ next();
25
+ };
26
+ exports.currentUser = currentUser;
27
+ //# sourceMappingURL=current-user.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"current-user.js","sourceRoot":"","sources":["../../src/middlewares/current-user.ts"],"names":[],"mappings":";;;;;;AACA,gEAA+B;AAiB/B,gEAAgE;AACzD,MAAM,WAAW,GAAG,CACzB,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,EAAE;IACF,gCAAgC;IAChC,IAAI,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACrC,OAAO,IAAI,EAAE,CAAC;IAChB,CAAC;IAED,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,OAAO,GAAG,sBAAG,CAAC,MAAM,CACxB,GAAG,CAAC,OAAO,CAAC,GAAG,EACf,OAAO,CAAC,GAAG,CAAC,OAAQ,CACN,CAAC;QAEjB,6CAA6C;QAC7C,GAAG,CAAC,WAAW,GAAG,OAAO,CAAC;IAC5B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;QAC9C,yDAAyD;IAC3D,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAzBW,QAAA,WAAW,eAyBtB"}
@@ -0,0 +1,2 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ export declare const errorHandler: (err: Error, req: Request, res: Response, next: NextFunction) => Response<any, Record<string, any>> | undefined;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.errorHandler = void 0;
4
+ const custom_error_js_1 = require("../errors/custom-error.js");
5
+ const errorHandler = (err, req, res, next) => {
6
+ if (err instanceof custom_error_js_1.CustomError) {
7
+ return res.status(err.statusCode).send({ errors: err.serializeErrors() });
8
+ }
9
+ res.status(400).send({
10
+ errors: [{ message: err.message || "Something went wrong" }],
11
+ });
12
+ };
13
+ exports.errorHandler = errorHandler;
14
+ //# sourceMappingURL=error-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/middlewares/error-handler.ts"],"names":[],"mappings":";;;AACA,+DAAwD;AAEjD,MAAM,YAAY,GAAG,CAC1B,GAAU,EACV,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,EAAE;IACF,IAAI,GAAG,YAAY,6BAAW,EAAE,CAAC;QAC/B,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,eAAe,EAAE,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,sBAAsB,EAAE,CAAC;KAC7D,CAAC,CAAC;AACL,CAAC,CAAC;AAbW,QAAA,YAAY,gBAavB"}
@@ -0,0 +1,2 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ export declare const requireAuth: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.requireAuth = void 0;
4
+ const not_authorized_error_js_1 = require("../errors/not-authorized-error.js");
5
+ const requireAuth = (req, res, next) => {
6
+ // User not logged in
7
+ if (!req.currentUser) {
8
+ throw new not_authorized_error_js_1.NotAuthorizedError();
9
+ }
10
+ next();
11
+ };
12
+ exports.requireAuth = requireAuth;
13
+ //# sourceMappingURL=require-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"require-auth.js","sourceRoot":"","sources":["../../src/middlewares/require-auth.ts"],"names":[],"mappings":";;;AACA,+EAAuE;AAEhE,MAAM,WAAW,GAAG,CACzB,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,EAAE;IACF,qBAAqB;IACrB,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACrB,MAAM,IAAI,4CAAkB,EAAE,CAAC;IACjC,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAXW,QAAA,WAAW,eAWtB"}
@@ -0,0 +1,2 @@
1
+ import type { Request, Response, NextFunction } from "express";
2
+ export declare const validateRequest: (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validateRequest = void 0;
4
+ const express_validator_1 = require("express-validator");
5
+ const request_validation_error_js_1 = require("../errors/request-validation-error.js");
6
+ const validateRequest = (req, res, next) => {
7
+ // Pull validation errors from express-validator
8
+ const errors = (0, express_validator_1.validationResult)(req);
9
+ // If errors exist, throw custom error
10
+ if (!errors.isEmpty()) {
11
+ throw new request_validation_error_js_1.RequestValidationError(errors.array());
12
+ }
13
+ next();
14
+ };
15
+ exports.validateRequest = validateRequest;
16
+ //# sourceMappingURL=validate-request.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate-request.js","sourceRoot":"","sources":["../../src/middlewares/validate-request.ts"],"names":[],"mappings":";;;AACA,yDAAqD;AACrD,uFAA+E;AAExE,MAAM,eAAe,GAAG,CAC7B,GAAY,EACZ,GAAa,EACb,IAAkB,EAClB,EAAE;IACF,gDAAgD;IAChD,MAAM,MAAM,GAAG,IAAA,oCAAgB,EAAC,GAAG,CAAC,CAAC;IAErC,sCAAsC;IACtC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;QACtB,MAAM,IAAI,oDAAsB,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,EAAE,CAAC;AACT,CAAC,CAAC;AAdW,QAAA,eAAe,mBAc1B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cfticketing/common",
3
- "version": "1.0.12",
3
+ "version": "1.0.15",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "./build/index.d.ts",
@@ -19,16 +19,17 @@
19
19
  "express": "^4.18.0 || ^5.0.0"
20
20
  },
21
21
  "devDependencies": {
22
- "typescript": "^5.9.3",
23
- "del-cli": "^7.0.0",
24
- "express": "^5.2.1",
25
- "@types/express": "^5.0.6",
26
22
  "@types/cookie-session": "^2.0.49",
27
- "@types/jsonwebtoken": "^9.0.10"
23
+ "@types/express": "^4.17.25",
24
+ "@types/jsonwebtoken": "^9.0.10",
25
+ "del-cli": "^7.0.0",
26
+ "express": "^4.21.2",
27
+ "typescript": "^5.9.3"
28
28
  },
29
29
  "dependencies": {
30
30
  "cookie-session": "^2.1.1",
31
31
  "express-validator": "^7.3.1",
32
- "jsonwebtoken": "^9.0.3"
32
+ "jsonwebtoken": "^9.0.3",
33
+ "node-nats-streaming": "^0.3.2"
33
34
  }
34
35
  }