@mac777/project-pinecone-models 1.0.0

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,61 @@
1
+ import mongoose from 'mongoose';
2
+ declare const paymentSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, {
3
+ createdAt: NativeDate;
4
+ status: "pending" | "refunded" | "succeeded" | "failed";
5
+ amount: number;
6
+ currency: string;
7
+ userId: mongoose.Types.ObjectId;
8
+ paymentId: string;
9
+ paymentMethod: "card" | "bkash";
10
+ orderId: mongoose.Types.ObjectId;
11
+ refundedAt?: NativeDate | null | undefined;
12
+ last4?: string | null | undefined;
13
+ failureCode?: string | null | undefined;
14
+ failureMessage?: string | null | undefined;
15
+ refundId?: string | null | undefined;
16
+ refundAmount?: number | null | undefined;
17
+ succeededAt?: NativeDate | null | undefined;
18
+ failedAt?: NativeDate | null | undefined;
19
+ brand?: "visa" | "mastercard" | "amex" | "discover" | null | undefined;
20
+ }, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
21
+ createdAt: NativeDate;
22
+ status: "pending" | "refunded" | "succeeded" | "failed";
23
+ amount: number;
24
+ currency: string;
25
+ userId: mongoose.Types.ObjectId;
26
+ paymentId: string;
27
+ paymentMethod: "card" | "bkash";
28
+ orderId: mongoose.Types.ObjectId;
29
+ refundedAt?: NativeDate | null | undefined;
30
+ last4?: string | null | undefined;
31
+ failureCode?: string | null | undefined;
32
+ failureMessage?: string | null | undefined;
33
+ refundId?: string | null | undefined;
34
+ refundAmount?: number | null | undefined;
35
+ succeededAt?: NativeDate | null | undefined;
36
+ failedAt?: NativeDate | null | undefined;
37
+ brand?: "visa" | "mastercard" | "amex" | "discover" | null | undefined;
38
+ }>, {}, mongoose.ResolveSchemaOptions<mongoose.DefaultSchemaOptions>> & mongoose.FlatRecord<{
39
+ createdAt: NativeDate;
40
+ status: "pending" | "refunded" | "succeeded" | "failed";
41
+ amount: number;
42
+ currency: string;
43
+ userId: mongoose.Types.ObjectId;
44
+ paymentId: string;
45
+ paymentMethod: "card" | "bkash";
46
+ orderId: mongoose.Types.ObjectId;
47
+ refundedAt?: NativeDate | null | undefined;
48
+ last4?: string | null | undefined;
49
+ failureCode?: string | null | undefined;
50
+ failureMessage?: string | null | undefined;
51
+ refundId?: string | null | undefined;
52
+ refundAmount?: number | null | undefined;
53
+ succeededAt?: NativeDate | null | undefined;
54
+ failedAt?: NativeDate | null | undefined;
55
+ brand?: "visa" | "mastercard" | "amex" | "discover" | null | undefined;
56
+ }> & {
57
+ _id: mongoose.Types.ObjectId;
58
+ } & {
59
+ __v: number;
60
+ }>;
61
+ export default paymentSchema;
@@ -0,0 +1,56 @@
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
+ const mongoose_1 = __importDefault(require("mongoose"));
7
+ // Payment schema for transaction logging
8
+ const paymentSchema = new mongoose_1.default.Schema({
9
+ // LINKS
10
+ orderId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true, index: true }, // Which order
11
+ userId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true, index: true }, // Who paid
12
+ paymentId: { type: String, required: true, unique: true, index: true }, // Stripe PI (unique)
13
+ // MONEY
14
+ amount: { type: Number, required: true },
15
+ currency: { type: String, required: true, default: 'BDT' },
16
+ // STATUS
17
+ status: {
18
+ type: String,
19
+ required: true,
20
+ enum: ['pending', 'succeeded', 'failed', 'refunded'],
21
+ default: 'pending'
22
+ },
23
+ // METADATA
24
+ paymentMethod: { type: String, required: true, enum: ['bkash', 'card'] },
25
+ last4: String, // Card last 4 digits (for receipt)
26
+ brand: { type: String, enum: ['visa', 'mastercard', 'amex', 'discover'] }, // Card brand
27
+ // FAILURE (if failed)
28
+ failureCode: String, // "insufficient_funds", "card_declined", etc.
29
+ failureMessage: String,
30
+ // REFUND (if refunded)
31
+ refundId: String, // Stripe refund ID
32
+ refundAmount: Number,
33
+ refundedAt: Date,
34
+ // TIMESTAMPS
35
+ createdAt: { type: Date, default: Date.now },
36
+ succeededAt: Date,
37
+ failedAt: Date,
38
+ });
39
+ // Indexes for performance
40
+ paymentSchema.index({ orderId: 1 });
41
+ paymentSchema.index({ userId: 1, createdAt: -1 });
42
+ paymentSchema.index({ status: 1, createdAt: -1 });
43
+ // Pre-save middleware to set timestamps based on status
44
+ paymentSchema.pre('save', function (next) {
45
+ if (this.isModified('status')) {
46
+ const now = new Date();
47
+ if (this.status === 'succeeded' && !this.succeededAt) {
48
+ this.succeededAt = now;
49
+ }
50
+ else if (this.status === 'failed' && !this.failedAt) {
51
+ this.failedAt = now;
52
+ }
53
+ }
54
+ next();
55
+ });
56
+ exports.default = paymentSchema;
@@ -0,0 +1,73 @@
1
+ import mongoose from 'mongoose';
2
+ declare const ticketSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, {
3
+ status: "cancelled" | "refunded" | "valid" | "used" | "transferred";
4
+ price: number;
5
+ userId: mongoose.Types.ObjectId;
6
+ ticketVariantId: mongoose.Types.ObjectId;
7
+ eventId: mongoose.Types.ObjectId;
8
+ orderId: mongoose.Types.ObjectId;
9
+ ticketNumber: string;
10
+ eventTitle: string;
11
+ eventDate: NativeDate;
12
+ eventVenue: string;
13
+ ticketType: string;
14
+ qrCode: string;
15
+ qrCodeUrl: string;
16
+ checkInStatus: "not_checked_in" | "checked_in";
17
+ issuedAt: NativeDate;
18
+ validUntil: NativeDate;
19
+ secretHash: string;
20
+ checkedInAt?: NativeDate | null | undefined;
21
+ checkedInBy?: mongoose.Types.ObjectId | null | undefined;
22
+ transferredTo?: mongoose.Types.ObjectId | null | undefined;
23
+ transferredAt?: NativeDate | null | undefined;
24
+ }, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
25
+ status: "cancelled" | "refunded" | "valid" | "used" | "transferred";
26
+ price: number;
27
+ userId: mongoose.Types.ObjectId;
28
+ ticketVariantId: mongoose.Types.ObjectId;
29
+ eventId: mongoose.Types.ObjectId;
30
+ orderId: mongoose.Types.ObjectId;
31
+ ticketNumber: string;
32
+ eventTitle: string;
33
+ eventDate: NativeDate;
34
+ eventVenue: string;
35
+ ticketType: string;
36
+ qrCode: string;
37
+ qrCodeUrl: string;
38
+ checkInStatus: "not_checked_in" | "checked_in";
39
+ issuedAt: NativeDate;
40
+ validUntil: NativeDate;
41
+ secretHash: string;
42
+ checkedInAt?: NativeDate | null | undefined;
43
+ checkedInBy?: mongoose.Types.ObjectId | null | undefined;
44
+ transferredTo?: mongoose.Types.ObjectId | null | undefined;
45
+ transferredAt?: NativeDate | null | undefined;
46
+ }>, {}, mongoose.ResolveSchemaOptions<mongoose.DefaultSchemaOptions>> & mongoose.FlatRecord<{
47
+ status: "cancelled" | "refunded" | "valid" | "used" | "transferred";
48
+ price: number;
49
+ userId: mongoose.Types.ObjectId;
50
+ ticketVariantId: mongoose.Types.ObjectId;
51
+ eventId: mongoose.Types.ObjectId;
52
+ orderId: mongoose.Types.ObjectId;
53
+ ticketNumber: string;
54
+ eventTitle: string;
55
+ eventDate: NativeDate;
56
+ eventVenue: string;
57
+ ticketType: string;
58
+ qrCode: string;
59
+ qrCodeUrl: string;
60
+ checkInStatus: "not_checked_in" | "checked_in";
61
+ issuedAt: NativeDate;
62
+ validUntil: NativeDate;
63
+ secretHash: string;
64
+ checkedInAt?: NativeDate | null | undefined;
65
+ checkedInBy?: mongoose.Types.ObjectId | null | undefined;
66
+ transferredTo?: mongoose.Types.ObjectId | null | undefined;
67
+ transferredAt?: NativeDate | null | undefined;
68
+ }> & {
69
+ _id: mongoose.Types.ObjectId;
70
+ } & {
71
+ __v: number;
72
+ }>;
73
+ export default ticketSchema;
package/dist/Ticket.js ADDED
@@ -0,0 +1,90 @@
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
+ const mongoose_1 = __importDefault(require("mongoose"));
7
+ // Ticket schema for individual issued tickets
8
+ const ticketSchema = new mongoose_1.default.Schema({
9
+ ticketNumber: { type: String, required: true, unique: true, index: true }, // Human-readable: "TKT-EVT123-A3K9-01"
10
+ // BELONGS TO
11
+ orderId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true, index: true }, // Parent order
12
+ eventId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true, index: true }, // Which event
13
+ userId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true, index: true }, // Owner
14
+ ticketVariantId: { type: mongoose_1.default.Schema.Types.ObjectId, required: true }, // Which type (VIP, GA, etc)
15
+ // DETAILS (denormalized for speed)
16
+ eventTitle: { type: String, required: true },
17
+ eventDate: { type: Date, required: true },
18
+ eventVenue: { type: String, required: true },
19
+ ticketType: { type: String, required: true }, // "VIP Pass"
20
+ price: { type: Number, required: true },
21
+ // QR CODE
22
+ qrCode: { type: String, unique: true, required: true }, // Unique hash: SHA256(ticketId + secret)
23
+ qrCodeUrl: { type: String, required: true }, // ImageKit/S3 URL to QR image
24
+ // STATUS
25
+ status: {
26
+ type: String,
27
+ required: true,
28
+ enum: ['valid', 'used', 'cancelled', 'refunded', 'transferred'],
29
+ default: 'valid',
30
+ index: true
31
+ },
32
+ // CHECK-IN
33
+ checkInStatus: {
34
+ type: String,
35
+ required: true,
36
+ enum: ['not_checked_in', 'checked_in'],
37
+ default: 'not_checked_in'
38
+ },
39
+ checkedInAt: Date,
40
+ checkedInBy: mongoose_1.default.Schema.Types.ObjectId, // Staff/scanner user ID
41
+ // TRANSFER (if user transfers ticket to friend)
42
+ transferredTo: mongoose_1.default.Schema.Types.ObjectId, // New owner user ID
43
+ transferredAt: Date,
44
+ // LIFECYCLE
45
+ issuedAt: { type: Date, default: Date.now }, // When ticket was created
46
+ validUntil: { type: Date, required: true }, // Event end date (after this, ticket expires)
47
+ // SECURITY
48
+ secretHash: { type: String, required: true }, // Internal validation hash (never exposed)
49
+ });
50
+ // Pre-save middleware to set default validUntil if not provided
51
+ ticketSchema.pre('save', function (next) {
52
+ if (this.isNew && !this.validUntil && this.eventDate) {
53
+ // Set validUntil to end of event day if eventDate is provided
54
+ const eventEnd = new Date(this.eventDate);
55
+ eventEnd.setHours(23, 59, 59, 999); // End of the event day
56
+ this.validUntil = eventEnd;
57
+ }
58
+ next();
59
+ });
60
+ // Virtual for checking if ticket is expired
61
+ ticketSchema.virtual('isExpired').get(function () {
62
+ return new Date() > this.validUntil;
63
+ });
64
+ // Method to check if ticket can be used
65
+ ticketSchema.methods.canBeUsed = function () {
66
+ return this.status === 'valid' &&
67
+ this.checkInStatus === 'not_checked_in' &&
68
+ !this.isExpired;
69
+ };
70
+ // Method to mark as used (check-in)
71
+ ticketSchema.methods.checkIn = function (staffUserId) {
72
+ if (!this.canBeUsed()) {
73
+ throw new Error('Ticket cannot be checked in');
74
+ }
75
+ this.checkInStatus = 'checked_in';
76
+ this.checkedInAt = new Date();
77
+ this.checkedInBy = new mongoose_1.default.Types.ObjectId(staffUserId);
78
+ return this.save();
79
+ };
80
+ // Method to transfer ticket
81
+ ticketSchema.methods.transfer = function (newOwnerId) {
82
+ if (this.status !== 'valid') {
83
+ throw new Error('Only valid tickets can be transferred');
84
+ }
85
+ this.transferredTo = new mongoose_1.default.Types.ObjectId(newOwnerId);
86
+ this.transferredAt = new Date();
87
+ this.userId = new mongoose_1.default.Types.ObjectId(newOwnerId); // Update ownership
88
+ return this.save();
89
+ };
90
+ exports.default = ticketSchema;
package/dist/User.d.ts ADDED
@@ -0,0 +1,41 @@
1
+ import mongoose from "mongoose";
2
+ declare const userSchema: mongoose.Schema<any, mongoose.Model<any, any, any, any, any, any>, {}, {}, {}, {}, {
3
+ timestamps: true;
4
+ }, {
5
+ email: string;
6
+ role: "user" | "host" | "admin";
7
+ provider: "google" | "local";
8
+ firstName: string;
9
+ lastName: string;
10
+ password?: string | null | undefined;
11
+ organization?: string | null | undefined;
12
+ refreshToken?: string | null | undefined;
13
+ googleId?: string | null | undefined;
14
+ } & mongoose.DefaultTimestampProps, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
15
+ email: string;
16
+ role: "user" | "host" | "admin";
17
+ provider: "google" | "local";
18
+ firstName: string;
19
+ lastName: string;
20
+ password?: string | null | undefined;
21
+ organization?: string | null | undefined;
22
+ refreshToken?: string | null | undefined;
23
+ googleId?: string | null | undefined;
24
+ } & mongoose.DefaultTimestampProps>, {}, mongoose.ResolveSchemaOptions<{
25
+ timestamps: true;
26
+ }>> & mongoose.FlatRecord<{
27
+ email: string;
28
+ role: "user" | "host" | "admin";
29
+ provider: "google" | "local";
30
+ firstName: string;
31
+ lastName: string;
32
+ password?: string | null | undefined;
33
+ organization?: string | null | undefined;
34
+ refreshToken?: string | null | undefined;
35
+ googleId?: string | null | undefined;
36
+ } & mongoose.DefaultTimestampProps> & {
37
+ _id: mongoose.Types.ObjectId;
38
+ } & {
39
+ __v: number;
40
+ }>;
41
+ export default userSchema;
package/dist/User.js ADDED
@@ -0,0 +1,50 @@
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
+ const mongoose_1 = __importDefault(require("mongoose"));
7
+ const userSchema = new mongoose_1.default.Schema({
8
+ firstName: {
9
+ type: String,
10
+ required: true
11
+ },
12
+ lastName: {
13
+ type: String,
14
+ required: true
15
+ },
16
+ email: {
17
+ type: String,
18
+ required: true,
19
+ unique: true
20
+ },
21
+ password: {
22
+ type: String,
23
+ required: false
24
+ },
25
+ organization: {
26
+ type: String,
27
+ required: false
28
+ },
29
+ role: {
30
+ type: String,
31
+ enum: ['user', 'host', 'admin'],
32
+ default: 'user'
33
+ },
34
+ refreshToken: {
35
+ type: String,
36
+ required: false
37
+ },
38
+ provider: {
39
+ type: String,
40
+ enum: ['google', 'local'],
41
+ default: 'local'
42
+ },
43
+ googleId: {
44
+ type: String,
45
+ required: false
46
+ }
47
+ }, {
48
+ timestamps: true
49
+ });
50
+ exports.default = userSchema;
@@ -0,0 +1,7 @@
1
+ export { default as eventSchema } from './Event';
2
+ export { default as ticketSchema } from './Ticket';
3
+ export { default as mediaSchema } from './Media';
4
+ export { default as bkashSchema } from './Bkash';
5
+ export { default as paymentSchema } from './Payment';
6
+ export { default as orderSchema } from './Order';
7
+ export { default as userSchema } from './User';
package/dist/index.js ADDED
@@ -0,0 +1,21 @@
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.userSchema = exports.orderSchema = exports.paymentSchema = exports.bkashSchema = exports.mediaSchema = exports.ticketSchema = exports.eventSchema = void 0;
7
+ // Shared database models for Pinecone microservices
8
+ var Event_1 = require("./Event");
9
+ Object.defineProperty(exports, "eventSchema", { enumerable: true, get: function () { return __importDefault(Event_1).default; } });
10
+ var Ticket_1 = require("./Ticket");
11
+ Object.defineProperty(exports, "ticketSchema", { enumerable: true, get: function () { return __importDefault(Ticket_1).default; } });
12
+ var Media_1 = require("./Media");
13
+ Object.defineProperty(exports, "mediaSchema", { enumerable: true, get: function () { return __importDefault(Media_1).default; } });
14
+ var Bkash_1 = require("./Bkash");
15
+ Object.defineProperty(exports, "bkashSchema", { enumerable: true, get: function () { return __importDefault(Bkash_1).default; } });
16
+ var Payment_1 = require("./Payment");
17
+ Object.defineProperty(exports, "paymentSchema", { enumerable: true, get: function () { return __importDefault(Payment_1).default; } });
18
+ var Order_1 = require("./Order");
19
+ Object.defineProperty(exports, "orderSchema", { enumerable: true, get: function () { return __importDefault(Order_1).default; } });
20
+ var User_1 = require("./User");
21
+ Object.defineProperty(exports, "userSchema", { enumerable: true, get: function () { return __importDefault(User_1).default; } });
package/package.json ADDED
@@ -0,0 +1,22 @@
1
+ {
2
+ "name": "@mac777/project-pinecone-models",
3
+ "version": "1.0.0",
4
+ "main": "dist/index.js",
5
+ "types": "dist/index.d.ts",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "dev": "tsc -w"
9
+ },
10
+ "dependencies": {
11
+ "mongoose": "^8.0.0",
12
+ "zod": "^3.22.4",
13
+ "zxcvbn": "^4.4.2"
14
+ },
15
+ "files": ["dist"],
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "devDependencies": {
20
+ "typescript": "^5.0.0"
21
+ }
22
+ }