Spaces:
Paused
Paused
Download Models/EventParticipationLog.js from imkrish/campverse-backend: direct link, hf CLI and curl.
- Browser
- Download file 2.3 kB
-
https://huggingface.co/spaces/imkrish/campverse-backend/resolve/main/Models/EventParticipationLog.js
- Command line
-
hf download hf://spaces/imkrish/campverse-backend/Models/EventParticipationLog.js
-
curl -L -o EventParticipationLog.js https://huggingface.co/spaces/imkrish/campverse-backend/resolve/main/Models/EventParticipationLog.js
2.3 kB
| const mongoose = require('mongoose'); | |
| /** | |
| * EventParticipationLog Schema for CampVerse | |
| * Includes payment info, attendance timestamp, and QR token for ticketing | |
| */ | |
| const eventParticipationLogSchema = new mongoose.Schema({ | |
| userId: { type: mongoose.Schema.Types.ObjectId, ref: 'User', required: true }, | |
| eventId: { | |
| type: mongoose.Schema.Types.ObjectId, | |
| ref: 'Event', | |
| required: true, | |
| }, | |
| status: { | |
| type: String, | |
| enum: ['registered', 'waitlisted', 'attended'], | |
| required: true, | |
| }, | |
| timestamp: { type: Date, default: Date.now }, | |
| registeredAt: { type: Date, default: Date.now }, | |
| paymentType: { type: String, enum: ['free', 'paid'], default: 'free' }, | |
| paymentStatus: { | |
| type: String, | |
| enum: ['success', 'pending', 'failed'], | |
| default: 'success', | |
| }, | |
| attendanceTimestamp: { type: Date }, | |
| qrToken: { type: String }, // Secure token for QR code validation (legacy field) | |
| attendanceMarkedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' }, // Host/co-host who scanned | |
| attendanceMarkedAt: { type: Date }, // When attendance was marked (scan time) | |
| // Enhanced QR Code System | |
| qrCode: { | |
| token: { type: String, unique: true, sparse: true }, // Unique QR token | |
| imageUrl: { type: String }, // Cloud storage URL for QR image | |
| generatedAt: { type: Date, default: Date.now }, | |
| expiresAt: { type: Date }, // Event end + 2 hours | |
| isUsed: { type: Boolean, default: false }, | |
| usedAt: { type: Date }, | |
| usedBy: { type: mongoose.Schema.Types.ObjectId, ref: 'User' } // Host who scanned | |
| } | |
| }); | |
| // Unique index to prevent duplicate registrations | |
| eventParticipationLogSchema.index({ userId: 1, eventId: 1 }, { unique: true }); | |
| // Performance indexes for common queries | |
| eventParticipationLogSchema.index({ eventId: 1, status: 1 }); // For capacity checks | |
| eventParticipationLogSchema.index({ userId: 1, status: 1 }); // For user's registrations | |
| eventParticipationLogSchema.index({ qrToken: 1 }, { sparse: true }); // For QR scanning (legacy) | |
| eventParticipationLogSchema.index({ 'qrCode.expiresAt': 1 }, { sparse: true }); // For cleanup | |
| eventParticipationLogSchema.index({ eventId: 1, status: 1, userId: 1 }); // Compound for analytics | |
| module.exports = mongoose.model( | |
| 'EventParticipationLog', | |
| eventParticipationLogSchema, | |
| ); | |