@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.
- package/build/errors/bad-request-error.d.ts +9 -0
- package/build/errors/bad-request-error.js +18 -0
- package/build/errors/bad-request-error.js.map +1 -0
- package/build/errors/custom-error.d.ts +8 -0
- package/build/errors/custom-error.js +12 -0
- package/build/errors/custom-error.js.map +1 -0
- package/build/errors/database-connection-error.d.ts +9 -0
- package/build/errors/database-connection-error.js +22 -0
- package/build/errors/database-connection-error.js.map +1 -0
- package/build/errors/not-authorized-error.d.ts +8 -0
- package/build/errors/not-authorized-error.js +16 -0
- package/build/errors/not-authorized-error.js.map +1 -0
- package/build/errors/not-found-error.d.ts +8 -0
- package/build/errors/not-found-error.js +21 -0
- package/build/errors/not-found-error.js.map +1 -0
- package/build/errors/request-validation-error.d.ts +14 -0
- package/build/errors/request-validation-error.js +23 -0
- package/build/errors/request-validation-error.js.map +1 -0
- package/build/events/base-listener.d.ts +18 -0
- package/build/events/base-listener.js +47 -0
- package/build/events/base-listener.js.map +1 -0
- package/build/events/base-publisher.d.ts +13 -0
- package/build/events/base-publisher.js +26 -0
- package/build/events/base-publisher.js.map +1 -0
- package/build/events/subjects.d.ts +4 -0
- package/build/events/subjects.js +9 -0
- package/build/events/subjects.js.map +1 -0
- package/build/events/ticket-created-event.d.ts +9 -0
- package/build/events/ticket-created-event.js +3 -0
- package/build/events/ticket-created-event.js.map +1 -0
- package/build/events/ticket-updated-event.d.ts +10 -0
- package/build/events/ticket-updated-event.js +3 -0
- package/build/events/ticket-updated-event.js.map +1 -0
- package/build/index.d.ts +15 -0
- package/build/index.js +32 -0
- package/build/index.js.map +1 -0
- package/build/middlewares/current-user.d.ts +14 -0
- package/build/middlewares/current-user.js +27 -0
- package/build/middlewares/current-user.js.map +1 -0
- package/build/middlewares/error-handler.d.ts +2 -0
- package/build/middlewares/error-handler.js +14 -0
- package/build/middlewares/error-handler.js.map +1 -0
- package/build/middlewares/require-auth.d.ts +2 -0
- package/build/middlewares/require-auth.js +13 -0
- package/build/middlewares/require-auth.js.map +1 -0
- package/build/middlewares/validate-request.d.ts +2 -0
- package/build/middlewares/validate-request.js +16 -0
- package/build/middlewares/validate-request.js.map +1 -0
- package/package.json +8 -7
|
@@ -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,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,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,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,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,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 @@
|
|
|
1
|
+
{"version":3,"file":"ticket-created-event.js","sourceRoot":"","sources":["../../src/events/ticket-created-event.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ticket-updated-event.js","sourceRoot":"","sources":["../../src/events/ticket-updated-event.ts"],"names":[],"mappings":""}
|
package/build/index.d.ts
ADDED
|
@@ -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,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,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,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.
|
|
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/
|
|
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
|
}
|