@tabletennisshop/common 1.0.52 → 1.0.55

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.
@@ -0,0 +1,24 @@
1
+ export declare enum SubjectsEnum {
2
+ UserCreated = "user:created",
3
+ UserUpdated = "user:updated",
4
+ UserDeleted = "user:deleted",
5
+ ProductCreated = "product:created",
6
+ ProductUpdated = "product:updated",
7
+ ProductDeleted = "product:deleted",
8
+ OrderCreated = "order:created",
9
+ OrderUpdated = "order:updated",
10
+ OrderDeleted = "order:deleted",
11
+ TokenCreated = "token:created",
12
+ TokenUpdated = "token:updated",
13
+ TokenDeleted = "token:deleted",
14
+ TokenExpired = "token:expired",
15
+ CartCreated = "cart:created",
16
+ CartUpdated = "cart:updated",
17
+ CartDeleted = "cart:deleted",
18
+ RatingCreated = "rating:created",
19
+ RatingUpdated = "rating:updated",
20
+ RatingDeleted = "rating:deleted",
21
+ InventoryCreated = "inventory:created",
22
+ InventoryUpdated = "inventory:updated",
23
+ InventoryDeleted = "inventory:deleted"
24
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubjectsEnum = void 0;
4
+ var SubjectsEnum;
5
+ (function (SubjectsEnum) {
6
+ SubjectsEnum["UserCreated"] = "user:created";
7
+ SubjectsEnum["UserUpdated"] = "user:updated";
8
+ SubjectsEnum["UserDeleted"] = "user:deleted";
9
+ SubjectsEnum["ProductCreated"] = "product:created";
10
+ SubjectsEnum["ProductUpdated"] = "product:updated";
11
+ SubjectsEnum["ProductDeleted"] = "product:deleted";
12
+ SubjectsEnum["OrderCreated"] = "order:created";
13
+ SubjectsEnum["OrderUpdated"] = "order:updated";
14
+ SubjectsEnum["OrderDeleted"] = "order:deleted";
15
+ SubjectsEnum["TokenCreated"] = "token:created";
16
+ SubjectsEnum["TokenUpdated"] = "token:updated";
17
+ SubjectsEnum["TokenDeleted"] = "token:deleted";
18
+ SubjectsEnum["TokenExpired"] = "token:expired";
19
+ SubjectsEnum["CartCreated"] = "cart:created";
20
+ SubjectsEnum["CartUpdated"] = "cart:updated";
21
+ SubjectsEnum["CartDeleted"] = "cart:deleted";
22
+ SubjectsEnum["RatingCreated"] = "rating:created";
23
+ SubjectsEnum["RatingUpdated"] = "rating:updated";
24
+ SubjectsEnum["RatingDeleted"] = "rating:deleted";
25
+ SubjectsEnum["InventoryCreated"] = "inventory:created";
26
+ SubjectsEnum["InventoryUpdated"] = "inventory:updated";
27
+ SubjectsEnum["InventoryDeleted"] = "inventory:deleted";
28
+ })(SubjectsEnum || (exports.SubjectsEnum = SubjectsEnum = {}));
@@ -0,0 +1,16 @@
1
+ import { SubjectsEnum } from "../enums/event-subject.enum";
2
+ import { ICartAttrs } from "../models/cart.model";
3
+ export interface CartCreatedEventInterface {
4
+ subject: SubjectsEnum.CartCreated;
5
+ data: ICartAttrs;
6
+ }
7
+ export interface CartUpdatedEventInterface {
8
+ subject: SubjectsEnum.CartUpdated;
9
+ data: Partial<ICartAttrs>;
10
+ }
11
+ export interface CartDeletedEventInterface {
12
+ subject: SubjectsEnum.CartDeleted;
13
+ data: {
14
+ id: string;
15
+ };
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,18 @@
1
+ import { Message, Stan } from "node-nats-streaming";
2
+ import { SubjectsEnum } from "../enums/event-subject.enum";
3
+ interface Event {
4
+ subject: SubjectsEnum;
5
+ data: any;
6
+ }
7
+ export declare abstract class ListenerAbstract<T extends Event> {
8
+ abstract subject: T['subject'];
9
+ abstract queueGroupName: string;
10
+ abstract onMessage(data: T['data'], msg: any): void;
11
+ protected client: Stan;
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,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ListenerAbstract = void 0;
4
+ class ListenerAbstract {
5
+ constructor(client) {
6
+ this.ackWait = 5 * 1000; // 5 seconds
7
+ this.client = client;
8
+ }
9
+ subscriptionOptions() {
10
+ return this.client
11
+ .subscriptionOptions()
12
+ .setDeliverAllAvailable() // When the listener starts, it will receive all messages that have ever been published to the subject, not just new ones. Useful for replaying events.
13
+ .setManualAckMode(true) // Handle ACK Mode Manually
14
+ .setAckWait(this.ackWait) // Wait 5 seconds before resending the message
15
+ // Assigns a durable name to the subscription.
16
+ // This allows the server to remember the last acknowledged message for this listener,
17
+ // so if it disconnects and reconnects,
18
+ // it will only receive new messages (not ones it already processed).
19
+ .setDurableName(this.queueGroupName);
20
+ }
21
+ listen() {
22
+ const subcriptions = this.client.subscribe(this.subject, this.queueGroupName, this.subscriptionOptions());
23
+ subcriptions.on("message", (msg) => {
24
+ console.log(`Message received: ${this.subject} / ${this.queueGroupName}`);
25
+ const parsedData = this.parseMessage(msg);
26
+ this.onMessage(parsedData, msg);
27
+ });
28
+ }
29
+ parseMessage(msg) {
30
+ const data = msg.getData();
31
+ return typeof data === 'string'
32
+ ? JSON.parse(data)
33
+ : JSON.parse(data.toString('utf8'));
34
+ }
35
+ }
36
+ exports.ListenerAbstract = ListenerAbstract;
@@ -0,0 +1,16 @@
1
+ import { SubjectsEnum } from "../enums/event-subject.enum";
2
+ import { OrderAttrs } from "../models/order.model";
3
+ export interface OrderCreatedEventInterface {
4
+ subject: SubjectsEnum.OrderCreated;
5
+ data: OrderAttrs;
6
+ }
7
+ export interface OrderUpdatedEventInterface {
8
+ subject: SubjectsEnum.OrderUpdated;
9
+ data: Partial<OrderAttrs>;
10
+ }
11
+ export interface OrderDeletedEventInterface {
12
+ subject: SubjectsEnum.OrderDeleted;
13
+ data: {
14
+ id: string;
15
+ };
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,13 @@
1
+ import { Stan } from 'node-nats-streaming';
2
+ import { SubjectsEnum } from '../enums/event-subject.enum';
3
+ interface Event {
4
+ subject: SubjectsEnum;
5
+ data: any;
6
+ }
7
+ export declare abstract class PublisherAbstract<T extends Event> {
8
+ abstract subject: T['subject'];
9
+ protected client: Stan;
10
+ constructor(client: Stan);
11
+ publish(data: T['data']): Promise<void>;
12
+ }
13
+ export {};
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PublisherAbstract = void 0;
4
+ class PublisherAbstract {
5
+ constructor(client) {
6
+ this.client = client;
7
+ }
8
+ publish(data) {
9
+ return new Promise((resolve, reject) => {
10
+ this.client.publish(this.subject, JSON.stringify(data), (err) => {
11
+ if (err) {
12
+ return reject(err);
13
+ }
14
+ console.log('Event published to subject', this.subject);
15
+ resolve();
16
+ });
17
+ });
18
+ }
19
+ }
20
+ exports.PublisherAbstract = PublisherAbstract;
@@ -0,0 +1,16 @@
1
+ import { SubjectsEnum } from "../enums/event-subject.enum";
2
+ import { IRatingAttrs } from "../models/rating.model";
3
+ export interface RatingCreatedEventInterface {
4
+ subject: SubjectsEnum.RatingCreated;
5
+ data: IRatingAttrs;
6
+ }
7
+ export interface RatingUpdatedEventInterface {
8
+ subject: SubjectsEnum.RatingUpdated;
9
+ data: Partial<IRatingAttrs>;
10
+ }
11
+ export interface RatingDeletedEventInterface {
12
+ subject: SubjectsEnum.RatingDeleted;
13
+ data: {
14
+ id: string;
15
+ };
16
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,18 @@
1
+ import { SubjectsEnum } from "../enums/event-subject.enum";
2
+ import { UserAttrs } from "../models/user.model";
3
+ type OptionalUser = Partial<UserAttrs>;
4
+ export interface UserUpdatedEventInterface {
5
+ subject: SubjectsEnum.UserUpdated;
6
+ data: OptionalUser;
7
+ }
8
+ export interface UserDeletedEventInterface {
9
+ subject: SubjectsEnum.UserDeleted;
10
+ data: {
11
+ id: string;
12
+ };
13
+ }
14
+ export interface UserCreatedEventInterface {
15
+ subject: SubjectsEnum.UserCreated;
16
+ data: UserAttrs;
17
+ }
18
+ export {};
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/build/index.d.ts CHANGED
@@ -12,16 +12,19 @@ export * from './models/racket.model';
12
12
  export * from './models/rating.model';
13
13
  export * from './models/shirt.model';
14
14
  export * from './models/sponge.model';
15
- export * from './models/address.schema';
16
15
  export * from './models/order.model';
17
16
  export * from './models/cart.model';
18
17
  export * from './models/inventory.model';
19
18
  export * from './models/status-timestamp.schema';
20
- export * from './models/vendor.model';
21
- export * from './models/vendor-purchased.model';
22
19
  export * from './helper/password';
23
20
  export * from './enums/product-type.enum';
24
21
  export * from './enums/order-status.enum';
25
22
  export * from './enums/payment-method.enum';
26
23
  export * from './enums/user-status.enum';
27
24
  export * from './enums/user.enum';
25
+ export * from './events/CartEventInterface';
26
+ export * from './events/ListenerAbstract';
27
+ export * from './events/OrderEventInterface';
28
+ export * from './events/PublisherAbstract';
29
+ export * from './events/RatingEventInterface';
30
+ export * from './events/UserEventInterface';
package/build/index.js CHANGED
@@ -28,16 +28,19 @@ __exportStar(require("./models/racket.model"), exports);
28
28
  __exportStar(require("./models/rating.model"), exports);
29
29
  __exportStar(require("./models/shirt.model"), exports);
30
30
  __exportStar(require("./models/sponge.model"), exports);
31
- __exportStar(require("./models/address.schema"), exports);
32
31
  __exportStar(require("./models/order.model"), exports);
33
32
  __exportStar(require("./models/cart.model"), exports);
34
33
  __exportStar(require("./models/inventory.model"), exports);
35
34
  __exportStar(require("./models/status-timestamp.schema"), exports);
36
- __exportStar(require("./models/vendor.model"), exports);
37
- __exportStar(require("./models/vendor-purchased.model"), exports);
38
35
  __exportStar(require("./helper/password"), exports);
39
36
  __exportStar(require("./enums/product-type.enum"), exports);
40
37
  __exportStar(require("./enums/order-status.enum"), exports);
41
38
  __exportStar(require("./enums/payment-method.enum"), exports);
42
39
  __exportStar(require("./enums/user-status.enum"), exports);
43
40
  __exportStar(require("./enums/user.enum"), exports);
41
+ __exportStar(require("./events/CartEventInterface"), exports);
42
+ __exportStar(require("./events/ListenerAbstract"), exports);
43
+ __exportStar(require("./events/OrderEventInterface"), exports);
44
+ __exportStar(require("./events/PublisherAbstract"), exports);
45
+ __exportStar(require("./events/RatingEventInterface"), exports);
46
+ __exportStar(require("./events/UserEventInterface"), exports);
@@ -0,0 +1,2 @@
1
+ import { NextFunction, Request, Response } from "express";
2
+ export declare const CheckType: (roles: string[]) => (req: Request, res: Response, next: NextFunction) => void;
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CheckType = void 0;
4
+ const CheckType = (roles) => {
5
+ return (req, res, next) => {
6
+ const currentUser = req.currentUser;
7
+ if (!currentUser) {
8
+ throw new Error("Not Authorized");
9
+ }
10
+ if (!currentUser.type || !roles.includes(currentUser.type)) {
11
+ throw new Error("Not Authorized");
12
+ }
13
+ next();
14
+ };
15
+ };
16
+ exports.CheckType = CheckType;
@@ -2,6 +2,7 @@ import { Request, Response, NextFunction } from "express";
2
2
  interface UserPayload {
3
3
  username: string;
4
4
  email: string;
5
+ type: string;
5
6
  }
6
7
  declare global {
7
8
  namespace Express {
@@ -1,5 +1,4 @@
1
1
  import { Document, Model, Types } from 'mongoose';
2
- import { IAddress } from './address.schema';
3
2
  import { OrderStatusEnum } from '../enums/order-status.enum';
4
3
  import { IStatusTimestamps } from './status-timestamp.schema';
5
4
  import { PaymentMethodEnum } from '../enums/payment-method.enum';
@@ -11,7 +10,6 @@ export interface IOrderProduct {
11
10
  }
12
11
  export interface OrderAttrs {
13
12
  user_id: Types.ObjectId;
14
- address: IAddress;
15
13
  products: IOrderProduct[];
16
14
  status: OrderStatusEnum;
17
15
  statusTimestamps: IStatusTimestamps;
@@ -19,7 +17,6 @@ export interface OrderAttrs {
19
17
  }
20
18
  export interface OrderDoc extends Document {
21
19
  user_id: Types.ObjectId;
22
- address: IAddress;
23
20
  products: IOrderProduct[];
24
21
  status: OrderStatusEnum;
25
22
  statusTimestamps: IStatusTimestamps;
@@ -2,13 +2,11 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.OrderModel = void 0;
4
4
  const mongoose_1 = require("mongoose");
5
- const address_schema_1 = require("./address.schema");
6
5
  const order_status_enum_1 = require("../enums/order-status.enum");
7
6
  const status_timestamp_schema_1 = require("./status-timestamp.schema");
8
7
  const payment_method_enum_1 = require("../enums/payment-method.enum");
9
8
  const OrderSchema = new mongoose_1.Schema({
10
9
  user_id: { type: mongoose_1.Schema.Types.ObjectId, ref: 'User', required: true }, // FK to User
11
- address: { type: address_schema_1.AddressSchema, required: true },
12
10
  products: {
13
11
  type: [
14
12
  {
@@ -1,12 +1,11 @@
1
1
  import { Model, Document } from 'mongoose';
2
- import { IAddress } from './address.schema';
3
2
  import { UserStatusEnum } from '../enums/user-status.enum';
4
3
  export interface UserAttrs {
5
4
  username: string;
6
5
  email: string;
7
6
  password: string;
8
7
  full_name: string;
9
- addresses: IAddress[];
8
+ address: string;
10
9
  type: string;
11
10
  status: UserStatusEnum;
12
11
  }
@@ -15,7 +14,7 @@ interface UserDoc extends Document {
15
14
  email: string;
16
15
  password: string;
17
16
  full_name: string;
18
- addresses: IAddress[];
17
+ address: string;
19
18
  type: string;
20
19
  status: UserStatusEnum;
21
20
  createdAt: Date;
@@ -13,17 +13,13 @@ exports.UserModel = void 0;
13
13
  const mongoose_1 = require("mongoose");
14
14
  const password_1 = require("../helper/password");
15
15
  const user_enum_1 = require("../enums/user.enum");
16
- const address_schema_1 = require("./address.schema");
17
16
  const user_status_enum_1 = require("../enums/user-status.enum");
18
17
  const UserSchema = new mongoose_1.Schema({
19
18
  username: { type: String, required: true, unique: true, minlength: 5 },
20
19
  email: { type: String, required: true, unique: true },
21
20
  password: { type: String, required: true, minlength: 4 },
22
21
  full_name: { type: String, required: true },
23
- addresses: {
24
- type: [address_schema_1.AddressSchema], // Use the AddressSchema defined in address.schema.ts
25
- required: true
26
- },
22
+ address: { type: String, required: true },
27
23
  type: { type: String, enum: Object.values(user_enum_1.UserEnum), required: true },
28
24
  status: { type: String, enum: Object.values(user_status_enum_1.UserStatusEnum), required: true }
29
25
  }, {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tabletennisshop/common",
3
- "version": "1.0.52",
3
+ "version": "1.0.55",
4
4
  "description": "",
5
5
  "main": "./build/index.js",
6
6
  "types": "build/index.d.ts",
@@ -29,6 +29,7 @@
29
29
  "express-validator": "^7.2.1",
30
30
  "jsonwebtoken": "^9.0.2",
31
31
  "mongoose": "^8.15.1",
32
+ "node-nats-streaming": "^0.3.2",
32
33
  "uninstall": "^0.0.0"
33
34
  },
34
35
  "devDependencies": {
@@ -1,17 +0,0 @@
1
- import { Schema } from "mongoose";
2
- export interface IAddress {
3
- province: string;
4
- district: string;
5
- ward: string;
6
- address: string;
7
- phone_number: string;
8
- }
9
- export declare const AddressSchema: Schema<IAddress, import("mongoose").Model<IAddress, any, any, any, import("mongoose").Document<unknown, any, IAddress, any> & IAddress & {
10
- _id: import("mongoose").Types.ObjectId;
11
- } & {
12
- __v: number;
13
- }, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, IAddress, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<IAddress>, {}> & import("mongoose").FlatRecord<IAddress> & {
14
- _id: import("mongoose").Types.ObjectId;
15
- } & {
16
- __v: number;
17
- }>;
@@ -1,13 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AddressSchema = void 0;
4
- //This is subdocument schema
5
- const mongoose_1 = require("mongoose");
6
- exports.AddressSchema = new mongoose_1.Schema({
7
- province: { type: String, required: true },
8
- district: { type: String, required: true },
9
- ward: { type: String, required: true },
10
- address: { type: String, required: true },
11
- phone_number: { type: String, required: true },
12
- }, { _id: false } //This schema don't need Address Schema
13
- );
@@ -1,20 +0,0 @@
1
- import { Types, Document, Model } from 'mongoose';
2
- export interface IVendorPurchase {
3
- vendor_id: Types.ObjectId;
4
- products: {
5
- product_id: Types.ObjectId;
6
- serials?: string[];
7
- price: number;
8
- quantity: number;
9
- }[];
10
- date: Date;
11
- }
12
- interface VendorPurchaseDoc extends IVendorPurchase, Document {
13
- createdAt: Date;
14
- updatedAt: Date;
15
- }
16
- interface VendorPurchaseModel extends Model<VendorPurchaseDoc> {
17
- build(attrs: IVendorPurchase): VendorPurchaseDoc;
18
- }
19
- export declare const VendorPurchaseModel: VendorPurchaseModel;
20
- export {};
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VendorPurchaseModel = void 0;
4
- const mongoose_1 = require("mongoose");
5
- const VendorPurchaseSchema = new mongoose_1.Schema({
6
- vendor_id: { type: mongoose_1.Schema.Types.ObjectId, ref: 'Vendor', required: true },
7
- products: {
8
- type: [{
9
- product_id: { type: mongoose_1.Schema.Types.ObjectId, ref: 'Product', required: true },
10
- serials: { type: [String], required: false },
11
- price: { type: Number, required: true },
12
- quantity: { type: Number, required: true },
13
- }],
14
- required: true
15
- },
16
- date: { type: Date, required: true },
17
- }, {
18
- collection: 'vendor_purchase',
19
- timestamps: true,
20
- });
21
- VendorPurchaseSchema.statics.build = (attrs) => {
22
- return new exports.VendorPurchaseModel(attrs);
23
- };
24
- exports.VendorPurchaseModel = (0, mongoose_1.model)('VendorPurchase', VendorPurchaseSchema);
@@ -1,15 +0,0 @@
1
- import { Document, Model } from "mongoose";
2
- import { IAddress } from "./address.schema";
3
- export interface VendorAttrs {
4
- name: string;
5
- addresses: IAddress[];
6
- }
7
- interface VendorDoc extends Document {
8
- name: string;
9
- addresses: IAddress[];
10
- }
11
- interface VendorModel extends Model<VendorDoc> {
12
- build(attr: VendorAttrs): VendorDoc;
13
- }
14
- export declare const VendorModel: VendorModel;
15
- export {};
@@ -1,19 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.VendorModel = void 0;
4
- const mongoose_1 = require("mongoose");
5
- const address_schema_1 = require("./address.schema");
6
- const VendorSchema = new mongoose_1.Schema({
7
- name: { type: String, required: true },
8
- addresses: {
9
- type: [address_schema_1.AddressSchema],
10
- required: true
11
- }
12
- }, {
13
- timestamps: true,
14
- collection: "vendor"
15
- });
16
- VendorSchema.statics.build = (attrs) => {
17
- return new exports.VendorModel(attrs);
18
- };
19
- exports.VendorModel = (0, mongoose_1.model)('Vendor', VendorSchema);