From 4864dedf7c79edaf63e8579137557aa60378c678 Mon Sep 17 00:00:00 2001 From: ayush00git Date: Fri, 3 Apr 2026 23:49:16 +0530 Subject: [PATCH 1/5] feat: setting up the gin environment --- .gitignore | 1 - README.md | 285 ----- connection.js | 9 - index.js | 54 - models/form.js | 43 - models/subject.js | 21 - package-lock.json | 1914 --------------------------------- package.json | 35 - public/nith.png | Bin 94453 -> 0 bytes routes/details.js | 109 -- routes/email.js | 78 -- routes/form.js | 65 -- routes/subject.js | 61 -- services/redis/emailQueue.js | 31 - services/redis/emailWorker.js | 35 - services/sendEmail.js | 147 --- views/details.ejs | 343 ------ views/home.ejs | 530 --------- views/subject.ejs | 193 ---- views/verify-email.ejs | 109 -- 20 files changed, 4063 deletions(-) delete mode 100644 README.md delete mode 100644 connection.js delete mode 100644 index.js delete mode 100644 models/form.js delete mode 100644 models/subject.js delete mode 100644 package-lock.json delete mode 100644 package.json delete mode 100644 public/nith.png delete mode 100644 routes/details.js delete mode 100644 routes/email.js delete mode 100644 routes/form.js delete mode 100644 routes/subject.js delete mode 100644 services/redis/emailQueue.js delete mode 100644 services/redis/emailWorker.js delete mode 100644 services/sendEmail.js delete mode 100644 views/details.ejs delete mode 100644 views/home.ejs delete mode 100644 views/subject.ejs delete mode 100644 views/verify-email.ejs diff --git a/.gitignore b/.gitignore index 13dfa36..4c49bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ .env -node_modules/ \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index 4741e20..0000000 --- a/README.md +++ /dev/null @@ -1,285 +0,0 @@ -# LACA Registration Portal - NIT Hamirpur - -The official website for **LA/CA (Lecture Added Courses/Co-Curricular Activities)** registration at **NIT Hamirpur**. This portal enables students to register for elective activities and courses with a seamless, scalable experience. - -## 📊 Performance Stats - -- **850+** registrations completed in **2 days** -- **60,000+** HTTP requests handled -- **99.9%** uptime during peak registration period -- Efficient email delivery with Redis-based job queuing - -Read the full technical blog post: [Blog](https://tnc.ayushz.me/blogs/695eac9fb6ba0a3261cea389) - ---- - -## 🛠️ Tech Stack - -### Backend -- **Node.js** - JavaScript runtime -- **Express.js** - Web framework for routing and middleware -- **MongoDB** - NoSQL database for storing registrations and activity data -- **Mongoose** - ODM (Object Data Modeling) for MongoDB - -### Email & Job Queue -- **BullMQ** - Task queue built on Redis for background job processing -- **IORedis** - Redis client for Node.js -- **Nodemailer** - Email sending with SMTP support (Gmail) -- **Redis** - In-memory data store for job queue and worker coordination - -### Frontend -- **EJS** - Embedded JavaScript templating -- **HTML5 & CSS3** - Modern, responsive UI -- **Vanilla JavaScript** - Form handling and dynamic subject loading - -### Authentication & Security -- **JWT (jsonwebtoken)** - Token-based email verification -- **dotenv** - Environment variable management - ---- - -## 📋 Project Structure - -``` -laca-site/ -├── models/ -│ ├── form.js # User registration schema -│ └── subject.js # Activity/course schema -├── routes/ -│ ├── form.js # Form submission & validation -│ ├── email.js # Email verification endpoint -│ ├── subject.js # Subject management & API -│ └── details.js # Registration details (admin) -├── services/ -│ ├── sendEmail.js # Email template & transport logic -│ └── redis/ -│ ├── emailQueue.js # BullMQ queue producer -│ └── emailWorker.js # BullMQ worker consumer -├── views/ -│ ├── home.ejs # Main registration form -│ ├── verify-email.ejs # Email verification page -│ ├── subject.ejs # Admin subject management -│ └── details.ejs # Registration details page -├── public/ # Static assets -├── index.js # Server entry point -├── connection.js # MongoDB connection handler -├── package.json # Dependencies -└── README.md -``` - ---- - -## 🚀 Getting Started (Local Setup) - -### Prerequisites -- **Node.js** (v14 or higher) -- **npm** (comes with Node.js) -- **MongoDB** (local or cloud instance via MongoDB Atlas) -- **Redis** (for background job processing) -- **Git** - -### 1. Clone the Repository - -```bash -git clone https://github.com/ayush00git/laca-site.git -cd laca-site -``` - -### 2. Install Dependencies - -```bash -npm install -``` - -### 3. Configure Environment Variables - -Create a `.env` file in the project root: - -```env -# Server -PORT=8089 -NODE_ENV=development - -# Database -MONGO_URI=mongodb://localhost:27017/laca-site -# Or use MongoDB Atlas: -# MONGO_URI=mongodb+srv://username:password@cluster.mongodb.net/laca-site?retryWrites=true&w=majority - -# Email Configuration (Gmail SMTP) -USER_MAIL=your-email@gmail.com -USER_PASS=your-app-specific-password -# Generate app password: https://myaccount.google.com/apppasswords - -# JWT & Verification -JWT_SECRET=your-super-secret-key -PROD_URL=http://localhost:8089 - -# Redis Configuration (for email queue) -REDIS_HOST=127.0.0.1 -REDIS_PORT=6379 -# Or use Redis URL: -# REDIS_URL=redis://:password@host:port - -# Private Routes (admin/sensitive operations) -PRIVATE_URL=admin -``` - -### 4. Start MongoDB - -#### Option A: Local MongoDB -```bash -# If installed locally -mongod -``` - -#### Option B: MongoDB Atlas (Cloud) -- Create a cluster at [MongoDB Atlas](https://www.mongodb.com/cloud/atlas) -- Get connection string and add to `.env` as `MONGO_URI` - -### 5. Start Redis Server - -```bash -# If installed locally -redis-server - -# Or using Docker -docker run -d -p 6379:6379 redis:latest -``` - -### 6. Start the Background Worker (Email Processing) - -In a **separate terminal**: - -```bash -npm run start-worker -``` - -This will start the BullMQ worker that processes email jobs from the Redis queue. - -### 7. Start the Development Server - -In another terminal: - -```bash -npm run dev -``` - -The server will start at **http://localhost:8089** - ---- - -## 📧 Email Queue & Redis Architecture - -### How Email Delivery Works - -1. **User Submits Form** → Server validates & creates JWT token -2. **Enqueue Job** → Job is added to Redis queue (`emailQueue.js`) -3. **Immediate Response** → User sees success message instantly (non-blocking) -4. **Worker Processes** → Background worker (`emailWorker.js`) picks up job from queue -5. **Email Sent** → Nodemailer sends verification email via Gmail SMTP -6. **Job Complete** → Job is marked complete and removed from queue (or retained on failure) - -## 📝 API Endpoints - -### Registration -- `POST /form/submit` - Submit registration form -- `GET /email/verify-email?token=JWT_TOKEN` - Verify email and confirm registration - -### Subject Management -- `GET /admin/subject/api/all` - Fetch all activities (for frontend dropdown) -- `POST /admin/subject` - Create new activity (admin only) - -### Admin -- `GET /admin/details` - View all registrations - -### Config -- `GET /api/config` - Get dynamic API configuration - ---- - -## 🔄 Available npm Scripts - -```bash -npm run dev # Start development server with auto-reload (nodemon) -npm run start # Start production server -npm run start-worker # Start background email worker -``` - ---- - -## 🛡️ Security Features - -- **JWT-based email verification** - Tokens expire in 24 hours -- **Input validation** - Server-side validation for all form inputs -- **Email domain restriction** - Only `@nith.ac.in` emails accepted -- **Rate limiting** - BullMQ limiter (10 emails per second max) -- **Environment variables** - Sensitive data not in code -- **HTTPS ready** - Configure in production deployment - ---- -### Environment Configuration (Production) - -```env -NODE_ENV=production -PORT=8089 -MONGO_URI=mongodb+srv://... # Atlas connection -REDIS_URL=redis://:password@host:port # Cloud Redis -USER_MAIL=registration@nith.ac.in # Official email -JWT_SECRET=long-random-secret-key -PROD_URL=https://laca.nith.ac.in # Production domain -PRIVATE_URL=admin -``` - -### Recommended Hosting -- **Server:** AWS EC2. -- **Database:** MongoDB Atlas -- **Redis:** AWS ElastiCache or Upstash -- **Email:** Gmail SMTP or SendGrid/AWS SES for higher limits - -### Process Manager (Production) - -Use **PM2** to keep the server and worker running: - -```bash -npm install -g pm2 - -# Start both processes -pm2 start index.js --name "laca-server" -pm2 start services/redis/emailWorker.js --name "email-worker" - -# Monitor -pm2 monit - -# Logs -pm2 logs -``` - ---- - -## 🤝 Contributing - -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing-feature`) -3. Commit changes (`git commit -m 'Add amazing feature'`) -4. Push to branch (`git push origin feature/amazing-feature`) -5. Open a Pull Request - ---- - -## 📞 Support & Contact - -**Developers:** -- [Ayush](https://github.com/ayush00git) -- [Aryan](https://github.com/pixel-Neko) - - -## 📄 License - -This project is part of NIT Hamirpur's official infrastructure. Contact the administration for licensing details. - ---- -**Last Updated:** January 11, 2026 -**Version:** 2.0.0 - -// Submitting to the college // -// DONE // diff --git a/connection.js b/connection.js deleted file mode 100644 index 634c4a3..0000000 --- a/connection.js +++ /dev/null @@ -1,9 +0,0 @@ -const mongoose = require("mongoose"); - -const connectToMongoDB = async (url) => { - await mongoose.connect(url); -} - -module.exports = { - connectToMongoDB -}; \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 0e8132c..0000000 --- a/index.js +++ /dev/null @@ -1,54 +0,0 @@ -const express = require("express"); -const path = require("path"); -const dotenv = require("dotenv"); - -dotenv.config(); - -// model -const Subject = require("./models/subject"); - -// routes -const formRoute = require("./routes/form"); -const subjectRoute = require("./routes/subject"); -const emailRoute = require("./routes/email"); -const detailsRoute = require("./routes/details"); - -const { connectToMongoDB } = require("./connection"); - -const app = express(); -app.set('view engine', 'ejs'); -app.set('views', path.join(__dirname, 'views')); - -connectToMongoDB(process.env.MONGO_URI) - .then(() => console.log(`MongoDB connected`)) - .catch((err) => console.log(`Mongo Error: ${err}`)); - -app.use(express.json()); -app.use(express.urlencoded({ extended: true })); -app.use(express.static(path.join(__dirname, 'public'))); - -app.get('/', (req, res) => { - res.render('home'); -}) - -app.get('/api/config', (req, res) => { - res.json({ subjectApiPath: `/${process.env.PRIVATE_URL}/subject/api/all` }); -}); - -app.use('/form', formRoute); -app.use(`/${process.env.PRIVATE_URL}/subject`, subjectRoute); -app.use('/email', emailRoute); -app.use(`/${process.env.PRIVATE_URL}`, detailsRoute); - -// GET (seats api), prefer not to make it public -// app.get('/seats', async(req, res) => { -// try { -// const seats = await Subject.find({}); -// return res.status(200).json(seats); -// } catch (error) { -// return res.status(400).json({ message: "Failed to fetch seats" }); -// } -// }) - -const PORT = 8089 -app.listen(PORT, () => console.log(`Server started on - http://localhost:${PORT}`)); diff --git a/models/form.js b/models/form.js deleted file mode 100644 index 9e3a7c6..0000000 --- a/models/form.js +++ /dev/null @@ -1,43 +0,0 @@ -const { model, Schema } = require("mongoose"); -const branches = ['Computer Science and Engineering', 'Dual CSE', 'Electrical Engineering', 'Electronics and Communication Engineering', 'Dual ECE', 'Mechanical Engineering', 'Mathematics and Computing', 'Chemical Engineering', 'Engineering Physics', 'Materials Science and Engineering', 'Civil Engineering']; -const Subjects = ['SA-201', 'SA-202', 'SA-203','SA-204','SA-205','SA-206','SA-207','SA-208','SA-209', 'SA-210', 'SA-211', 'SA-212', 'SA-213']; - -const formSchema = new Schema({ - name: { - type: String, - required: true, - }, - email: { - type: String, - required: true, - unique: true, - }, - mobileNum: { - type: Number, - required: true, - unique: true, - }, - rollNumber: { - type: String, - required: true, - unique: true, - }, - gender: { - type: String, - enum: ['Male', 'Female'], - required: true, - }, - branch: { - type: String, - enum: branches, - required: true, - }, - subjectCode: { - type: String, - enum: Subjects, - required: true, - }, -}, { timestamps: true } ); - -const Form = model("form", formSchema); -module.exports = Form; diff --git a/models/subject.js b/models/subject.js deleted file mode 100644 index 21bc65d..0000000 --- a/models/subject.js +++ /dev/null @@ -1,21 +0,0 @@ -const { model, Schema } = require("mongoose"); -const subjectCode = ['SA-201', 'SA-202', 'SA-203','SA-204','SA-205','SA-206','SA-207','SA-208','SA-209', 'SA-210', 'SA-211', 'SA-212', 'SA-213']; - -const subjectSchema = new Schema({ - code: { - type: String, - enum: subjectCode, - required: true, - }, - seatsFilled: { - type: Number, - default: 0, - }, - maxSeats: { - type: Number, - default: 120, - }, -}, { timestamps: true } ); - -const Subject = model("subject", subjectSchema); -module.exports = Subject; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 7267830..0000000 --- a/package-lock.json +++ /dev/null @@ -1,1914 +0,0 @@ -{ - "name": "laca-site", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "laca-site", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "bullmq": "^5.66.4", - "dotenv": "^17.2.3", - "ejs": "^3.1.10", - "express": "^5.2.1", - "ioredis": "^5.9.1", - "jsonwebtoken": "^9.0.3", - "mongoose": "^9.0.1", - "nodemailer": "^7.0.12" - }, - "devDependencies": { - "nodemon": "^3.1.11" - } - }, - "node_modules/@ioredis/commands": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.5.0.tgz", - "integrity": "sha512-eUgLqrMf8nJkZxT24JvVRrQya1vZkQh8BBeYNwGDqa5I0VUi8ACx7uFvAaLxintokpTenkK6DASvo/bvNbBGow==", - "license": "MIT" - }, - "node_modules/@mongodb-js/saslprep": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.4.4.tgz", - "integrity": "sha512-p7X/ytJDIdwUfFL/CLOhKgdfJe1Fa8uw9seJYvdOmnP9JBWGWHW69HkOixXS6Wy9yvGf1MbhcS6lVmrhy4jm2g==", - "license": "MIT", - "dependencies": { - "sparse-bitfield": "^3.0.3" - } - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", - "integrity": "sha512-QZHtlVgbAdy2zAqNA9Gu1UpIuI8Xvsd1v8ic6B2pZmeFnFcMWiPLfWXh7TVw4eGEZ/C9TH281KwhVoeQUKbyjw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-darwin-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-x64/-/msgpackr-extract-darwin-x64-3.0.3.tgz", - "integrity": "sha512-mdzd3AVzYKuUmiWOQ8GNhl64/IoFGol569zNRdkLReh6LRLHOXxU4U8eq0JwaD8iFHdVGqSy4IjFL4reoWCDFw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm/-/msgpackr-extract-linux-arm-3.0.3.tgz", - "integrity": "sha512-fg0uy/dG/nZEXfYilKoRe7yALaNmHoYeIoJuJ7KJ+YyU2bvY8vPv27f7UKhGRpY6euFYqEVhxCFZgAUNQBM3nw==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-arm64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-arm64/-/msgpackr-extract-linux-arm64-3.0.3.tgz", - "integrity": "sha512-YxQL+ax0XqBJDZiKimS2XQaf+2wDGVa1enVRGzEvLLVFeqa5kx2bWbtcSXgsxjQB7nRqqIGFIcLteF/sHeVtQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-linux-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-linux-x64/-/msgpackr-extract-linux-x64-3.0.3.tgz", - "integrity": "sha512-cvwNfbP07pKUfq1uH+S6KJ7dT9K8WOE4ZiAcsrSes+UY55E/0jLYc+vq+DO7jlmqRb5zAggExKm0H7O/CBaesg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@msgpackr-extract/msgpackr-extract-win32-x64": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-win32-x64/-/msgpackr-extract-win32-x64-3.0.3.tgz", - "integrity": "sha512-x0fWaQtYp4E6sktbsdAqnehxDgEc/VwM7uLsRCYWaiGu0ykYdZPiS8zCWdnjHwyiumousxfBm4SO31eXqwEZhQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@types/webidl-conversions": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/@types/webidl-conversions/-/webidl-conversions-7.0.3.tgz", - "integrity": "sha512-CiJJvcRtIgzadHCYXw7dqEnMNRjhGZlYK05Mj9OyktqV8uVT8fD2BFOB7S1uwBE3Kj2Z+4UyPmFw/Ixgw/LAlA==", - "license": "MIT" - }, - "node_modules/@types/whatwg-url": { - "version": "13.0.0", - "resolved": "https://registry.npmjs.org/@types/whatwg-url/-/whatwg-url-13.0.0.tgz", - "integrity": "sha512-N8WXpbE6Wgri7KUSvrmQcqrMllKZ9uxkYWMt+mCSGwNc0Hsw9VQTW7ApqI4XNrx6/SaM2QQJCzMPDEXE058s+Q==", - "license": "MIT", - "dependencies": { - "@types/webidl-conversions": "*" - } - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/bson": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/bson/-/bson-7.0.0.tgz", - "integrity": "sha512-Kwc6Wh4lQ5OmkqqKhYGKIuELXl+EPYSCObVE6bWsp1T/cGkOCBN0I8wF/T44BiuhHyNi1mmKVPXk60d41xZ7kw==", - "license": "Apache-2.0", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/bullmq": { - "version": "5.66.4", - "resolved": "https://registry.npmjs.org/bullmq/-/bullmq-5.66.4.tgz", - "integrity": "sha512-y2VRk2z7d1YNI2JQDD7iThoD0X/0iZZ3VEp8lqT5s5U0XDl9CIjXp1LQgmE9EKy6ReHtzmYXS1f328PnUbZGtQ==", - "license": "MIT", - "dependencies": { - "cron-parser": "4.9.0", - "ioredis": "5.8.2", - "msgpackr": "1.11.5", - "node-abort-controller": "3.1.1", - "semver": "7.7.3", - "tslib": "2.8.1", - "uuid": "11.1.0" - } - }, - "node_modules/bullmq/node_modules/@ioredis/commands": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@ioredis/commands/-/commands-1.4.0.tgz", - "integrity": "sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==", - "license": "MIT" - }, - "node_modules/bullmq/node_modules/ioredis": { - "version": "5.8.2", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.8.2.tgz", - "integrity": "sha512-C6uC+kleiIMmjViJINWk80sOQw5lEzse1ZmvD+S/s8p8CWapftSaC+kocGTx6xrbrJ4WmYQGC08ffHLr6ToR6Q==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "1.4.0", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/cron-parser": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/cron-parser/-/cron-parser-4.9.0.tgz", - "integrity": "sha512-p0SaNjrHOnQeR8/VnfGbmg9te2kfyYSQ7Sc/j/6DtPL3JQvKxmjO9TSjNFpujqV3vEYYBvNNvXSxzyksBWAx1Q==", - "license": "MIT", - "dependencies": { - "luxon": "^3.2.1" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/denque": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", - "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", - "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "license": "Apache-2.0", - "optional": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/dotenv": { - "version": "17.2.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.3.tgz", - "integrity": "sha512-JVUnt+DUIzu87TABbhPmNfVdBDt18BLOWjMUFJMSi/Qqg7NTYtabbvSNJGOJ7afbRuv9D/lngizHtP7QyLQ+9w==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", - "dependencies": { - "jake": "^10.8.5" - }, - "bin": { - "ejs": "bin/cli.js" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/filelist": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", - "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", - "license": "Apache-2.0", - "dependencies": { - "minimatch": "^5.0.1" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/iconv-lite": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ioredis": { - "version": "5.9.1", - "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.9.1.tgz", - "integrity": "sha512-BXNqFQ66oOsR82g9ajFFsR8ZKrjVvYCLyeML9IvSMAsP56XH2VXBdZjmI11p65nXXJxTEt1hie3J2QeFJVgrtQ==", - "license": "MIT", - "dependencies": { - "@ioredis/commands": "1.5.0", - "cluster-key-slot": "^1.1.0", - "debug": "^4.3.4", - "denque": "^2.1.0", - "lodash.defaults": "^4.2.0", - "lodash.isarguments": "^3.1.0", - "redis-errors": "^1.2.0", - "redis-parser": "^3.0.0", - "standard-as-callback": "^2.1.0" - }, - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/ioredis" - } - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/jake": { - "version": "10.9.4", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.4.tgz", - "integrity": "sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.6", - "filelist": "^1.0.4", - "picocolors": "^1.1.1" - }, - "bin": { - "jake": "bin/cli.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", - "integrity": "sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==", - "license": "MIT", - "dependencies": { - "jws": "^4.0.1", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.1.tgz", - "integrity": "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.1.tgz", - "integrity": "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==", - "license": "MIT", - "dependencies": { - "jwa": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kareem": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/kareem/-/kareem-3.0.0.tgz", - "integrity": "sha512-RKhaOBSPN8L7y4yAgNhDT2602G5FD6QbOIISbjN9D6mjHPeqeg7K+EB5IGSU5o81/X2Gzm3ICnAvQW3x3OP8HA==", - "license": "Apache-2.0", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/lodash.defaults": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz", - "integrity": "sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==", - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isarguments": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", - "integrity": "sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/luxon": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/luxon/-/luxon-3.7.2.tgz", - "integrity": "sha512-vtEhXh/gNjI9Yg1u4jX/0YVPMvxzHuGgCm6tC5kZyb08yjGWGnqAjGJvcXbqQR2P3MyMEFnRbpcdFS6PBcLqew==", - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/memory-pager": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/memory-pager/-/memory-pager-1.5.0.tgz", - "integrity": "sha512-ZS4Bp4r/Zoeq6+NLJpP+0Zzm0pR8whtGPf1XExKLJBAczGMnSi3It14OiNCStjQjM6NU1okjQGSxgEZN8eBYKg==", - "license": "MIT" - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mongodb": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-7.0.0.tgz", - "integrity": "sha512-vG/A5cQrvGGvZm2mTnCSz1LUcbOPl83hfB6bxULKQ8oFZauyox/2xbZOoGNl+64m8VBrETkdGCDBdOsCr3F3jg==", - "license": "Apache-2.0", - "dependencies": { - "@mongodb-js/saslprep": "^1.3.0", - "bson": "^7.0.0", - "mongodb-connection-string-url": "^7.0.0" - }, - "engines": { - "node": ">=20.19.0" - }, - "peerDependencies": { - "@aws-sdk/credential-providers": "^3.806.0", - "@mongodb-js/zstd": "^7.0.0", - "gcp-metadata": "^7.0.1", - "kerberos": "^7.0.0", - "mongodb-client-encryption": ">=7.0.0 <7.1.0", - "snappy": "^7.3.2", - "socks": "^2.8.6" - }, - "peerDependenciesMeta": { - "@aws-sdk/credential-providers": { - "optional": true - }, - "@mongodb-js/zstd": { - "optional": true - }, - "gcp-metadata": { - "optional": true - }, - "kerberos": { - "optional": true - }, - "mongodb-client-encryption": { - "optional": true - }, - "snappy": { - "optional": true - }, - "socks": { - "optional": true - } - } - }, - "node_modules/mongodb-connection-string-url": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/mongodb-connection-string-url/-/mongodb-connection-string-url-7.0.0.tgz", - "integrity": "sha512-irhhjRVLE20hbkRl4zpAYLnDMM+zIZnp0IDB9akAFFUZp/3XdOfwwddc7y6cNvF2WCEtfTYRwYbIfYa2kVY0og==", - "license": "Apache-2.0", - "dependencies": { - "@types/whatwg-url": "^13.0.0", - "whatwg-url": "^14.1.0" - }, - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/mongoose": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-9.0.1.tgz", - "integrity": "sha512-aHPfQx2YX5UwAmMVud7OD4lIz9AEO4jI+oDnRh3lPZq9lrKTiHmOzszVffDMyQHXvrf4NXsJ34kpmAhyYAZGbw==", - "license": "MIT", - "dependencies": { - "kareem": "3.0.0", - "mongodb": "~7.0", - "mpath": "0.9.0", - "mquery": "6.0.0", - "ms": "2.1.3", - "sift": "17.1.3" - }, - "engines": { - "node": ">=20.19.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mongoose" - } - }, - "node_modules/mpath": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.9.0.tgz", - "integrity": "sha512-ikJRQTk8hw5DEoFVxHG1Gn9T/xcjtdnOKIU1JTmGjZZlg9LST2mBLmcX3/ICIbgJydT2GOc15RnNy5mHmzfSew==", - "license": "MIT", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mquery": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/mquery/-/mquery-6.0.0.tgz", - "integrity": "sha512-b2KQNsmgtkscfeDgkYMcWGn9vZI9YoXh802VDEwE6qc50zxBFQ0Oo8ROkawbPAsXCY1/Z1yp0MagqsZStPWJjw==", - "license": "MIT", - "engines": { - "node": ">=20.19.0" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/msgpackr": { - "version": "1.11.5", - "resolved": "https://registry.npmjs.org/msgpackr/-/msgpackr-1.11.5.tgz", - "integrity": "sha512-UjkUHN0yqp9RWKy0Lplhh+wlpdt9oQBYgULZOiFhV3VclSF1JnSQWZ5r9gORQlNYaUKQoR8itv7g7z1xDDuACA==", - "license": "MIT", - "optionalDependencies": { - "msgpackr-extract": "^3.0.2" - } - }, - "node_modules/msgpackr-extract": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/msgpackr-extract/-/msgpackr-extract-3.0.3.tgz", - "integrity": "sha512-P0efT1C9jIdVRefqjzOQ9Xml57zpOXnIuS+csaB4MdZbTdmGDLo8XhzBG1N7aO11gKDDkJvBLULeFTo46wwreA==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "dependencies": { - "node-gyp-build-optional-packages": "5.2.2" - }, - "bin": { - "download-msgpackr-prebuilds": "bin/download-prebuilds.js" - }, - "optionalDependencies": { - "@msgpackr-extract/msgpackr-extract-darwin-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-darwin-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-arm64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-linux-x64": "3.0.3", - "@msgpackr-extract/msgpackr-extract-win32-x64": "3.0.3" - } - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/node-abort-controller": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", - "integrity": "sha512-AGK2yQKIjRuqnc6VkX2Xj5d+QW8xZ87pa1UK6yA6ouUyuxfHuMP6umE5QK7UmTeOAymo+Zx1Fxiuw9rVx8taHQ==", - "license": "MIT" - }, - "node_modules/node-gyp-build-optional-packages": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.2.2.tgz", - "integrity": "sha512-s+w+rBWnpTMwSFbaE0UXsRlg7hU4FjekKU4eyAih5T8nJuNZT1nNsskXpxmeqSK9UzkBl6UgRlnKc8hz8IEqOw==", - "license": "MIT", - "optional": true, - "dependencies": { - "detect-libc": "^2.0.1" - }, - "bin": { - "node-gyp-build-optional-packages": "bin.js", - "node-gyp-build-optional-packages-optional": "optional.js", - "node-gyp-build-optional-packages-test": "build-test.js" - } - }, - "node_modules/nodemailer": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.12.tgz", - "integrity": "sha512-H+rnK5bX2Pi/6ms3sN4/jRQvYSMltV6vqup/0SFOrxYYY/qoNvhXPlYq3e+Pm9RFJRwrMGbMIwi81M4dxpomhA==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemon": { - "version": "3.1.11", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.11.tgz", - "integrity": "sha512-is96t8F/1//UHAjNPHpbsNY46ELPpftGUoSVNXwUfMk/qdjSylYrWSu1XavVTBOn526kFiOR733ATgNBCQyH0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis-errors": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", - "integrity": "sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/redis-parser": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", - "integrity": "sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==", - "license": "MIT", - "dependencies": { - "redis-errors": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", - "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/sift": { - "version": "17.1.3", - "resolved": "https://registry.npmjs.org/sift/-/sift-17.1.3.tgz", - "integrity": "sha512-Rtlj66/b0ICeFzYTuNvX/EF1igRbbnGSvEyT79McoZa/DeGhMyC5pWKOEsZKnpkqtSeovd5FL/bjHWC3CIIvCQ==", - "license": "MIT" - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/sparse-bitfield": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", - "integrity": "sha512-kvzhi7vqKTfkh0PZU+2D2PIllw2ymqJKujUcyPMd9Y75Nv4nPbGJZXNhxsgdQab2BmlDct1YnfQCguEvHr7VsQ==", - "license": "MIT", - "dependencies": { - "memory-pager": "^1.0.2" - } - }, - "node_modules/standard-as-callback": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz", - "integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==", - "license": "MIT" - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/tr46": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-5.1.1.tgz", - "integrity": "sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==", - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/webidl-conversions": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", - "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - } - }, - "node_modules/whatwg-url": { - "version": "14.2.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-14.2.0.tgz", - "integrity": "sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==", - "license": "MIT", - "dependencies": { - "tr46": "^5.1.0", - "webidl-conversions": "^7.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - } - } -} diff --git a/package.json b/package.json deleted file mode 100644 index e9c8874..0000000 --- a/package.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "laca-site", - "version": "1.0.0", - "description": "", - "main": "index.js", - "scripts": { - "start": "node index.js", - "dev": "nodemon index.js", - "start-worker": "node services/redis/emailWorker.js" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/ayush00git/laca-site.git" - }, - "keywords": [], - "author": "", - "license": "ISC", - "bugs": { - "url": "https://github.com/ayush00git/laca-site/issues" - }, - "homepage": "https://github.com/ayush00git/laca-site#readme", - "dependencies": { - "bullmq": "^5.66.4", - "dotenv": "^17.2.3", - "ejs": "^3.1.10", - "express": "^5.2.1", - "ioredis": "^5.9.1", - "jsonwebtoken": "^9.0.3", - "mongoose": "^9.0.1", - "nodemailer": "^7.0.12" - }, - "devDependencies": { - "nodemon": "^3.1.11" - } -} diff --git a/public/nith.png b/public/nith.png deleted file mode 100644 index 2d52cc0623e928dc626500073b2311827777edf6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94453 zcmXt=Ra9GTw}mNCq-c?k;#ypayS2DOacyyTw-hLD#ogTt1eX+dcXxLuNOHnI#<}1k zTJ^{ zbUb|EJP4Q8#D9T5US`Zl&#-WO&E%ug*OwSIWnquQ*c}*&NTmwfW_^Es5s_aRlje#uUHSi z9z}gGpe{`iZvbN5Z%(?eB>04^@id>wXhg?~!&2~6A-Es@!wK?=5io~ik5k&!nmUe7 z%hs?lDxCtJbcJL+U7S8Wp5FPHI29E4C*WBLpDuB9@Y?@Ee>368eg<&QlICZ~0rZBopOo$S8L z3#tzoMxWMbY%lM1$Ie%bioAO`z3G~`;8?vzIRewj`YgV`NcYiZ^OuDY_Wp{M4nf

FD%c@e*;0Hk&}U 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
  • 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

    %#2`V8QLIV*ssW9z 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�GCatQ==22^N9!E6Tfbfc5;mhv+l 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 diff --git a/routes/details.js b/routes/details.js deleted file mode 100644 index a70bd91..0000000 --- a/routes/details.js +++ /dev/null @@ -1,109 +0,0 @@ -const express = require("express"); -const Form = require("../models/form"); - -const route = express.Router(); -route.get('/', async (req, res) => { - try { - const { search, branch, gender, subjectCode, sort } = req.query; - let query = {}; - - // Search by Name or Roll Number (case-insensitive regex) - if (search) { - query.$or = [ - { name: { $regex: search, $options: 'i' } }, - { rollNumber: { $regex: search, $options: 'i' } } - ]; - } - - // Filters - exact match - if (branch) query.branch = branch; - if (gender) query.gender = gender; - if (subjectCode) query.subjectCode = subjectCode; - - // Sorting - let sortOption = { createdAt: 1 }; // Default: Oldest first - if (sort === 'name_asc') sortOption = { name: 1 }; - else if (sort === 'name_desc') sortOption = { name: -1 }; - else if (sort === 'roll_asc') sortOption = { rollNumber: 1 }; - else if (sort === 'roll_desc') sortOption = { rollNumber: -1 }; - else if (sort === 'branch') sortOption = { branch: 1 }; - else if (sort === 'subject') sortOption = { subjectCode: 1 }; - - const details = await Form.find(query).sort(sortOption); - - // Pass current filters back to view for UI state - return res.render('details.ejs', { - details, - query: req.query, - totalCount: details.length, - baseUrl: req.baseUrl - }); - } catch (error) { - console.error("Error fetching details:", error); - res.status(500).send("Internal Server Error"); - } -}); - -route.get('/export', async (req, res) => { - try { - const { search, branch, gender, subjectCode, sort } = req.query; - let query = {}; - - if (search) { - query.$or = [ - { name: { $regex: search, $options: 'i' } }, - { rollNumber: { $regex: search, $options: 'i' } } - ]; - } - - if (branch) query.branch = branch; - if (gender) query.gender = gender; - if (subjectCode) query.subjectCode = subjectCode; - - let sortOption = { createdAt: 1 }; - if (sort === 'name_asc') sortOption = { name: 1 }; - else if (sort === 'roll_asc') sortOption = { rollNumber: 1 }; - else if (sort === 'branch') sortOption = { branch: 1 }; - else if (sort === 'subject') sortOption = { subjectCode: 1 }; - - const details = await Form.find(query).sort(sortOption); - - // Convert to CSV - const header = ['Name', 'Email', 'Roll Number', 'Mobile Number', 'Gender', 'Branch', 'Subject Code', 'Registered At']; - const rows = details.map(student => [ - student.name, - student.email, - student.rollNumber, - student.mobileNum, - student.gender, - student.branch, - student.subjectCode, - new Date(student.createdAt).toLocaleString('en-IN') - ]); - - // Escape CSV fields - const escapeCsv = (str) => { - if (str == null) return ''; - const stringValue = String(str); - if (stringValue.includes(',') || stringValue.includes('"') || stringValue.includes('\n')) { - return `"${stringValue.replace(/"/g, '""')}"`; - } - return stringValue; - }; - - const csvContent = [ - header.join(','), - ...rows.map(row => row.map(escapeCsv).join(',')) - ].join('\n'); - - res.setHeader('Content-Type', 'text/csv'); - res.setHeader('Content-Disposition', 'attachment; filename="students.csv"'); - res.status(200).send(csvContent); - - } catch (error) { - console.error("Error exporting details:", error); - res.status(500).send("Internal Server Error"); - } -}); - -module.exports = route; \ No newline at end of file diff --git a/routes/email.js b/routes/email.js deleted file mode 100644 index c098b95..0000000 --- a/routes/email.js +++ /dev/null @@ -1,78 +0,0 @@ -const express = require("express"); -const route = express.Router(); -const Form = require("../models/form"); -const Subject = require("../models/subject"); -const jwt = require("jsonwebtoken"); -const dotenv = require("dotenv"); -dotenv.config(); - -route.get('/verify-email', async (req, res) => { - const { token } = req.query; - console.log('You enetred the route gigg'); - const decoded = jwt.verify(token, process.env.JWT_SECRET); - - try { - if( !token ) { - return res.render('verify-email', { - success: false, - message: "Invalid response" - - }); - }; - const existingUser = await Form.findOne({ email: decoded.email }); - if( existingUser ) { - return res.status(400).render('verify-email', { - success: false, - message: `Seat for this email is already reserved`, - }); - }; - - const newReg = new Form({ - name: decoded.name, - email: decoded.email, - rollNumber: decoded.rollNumber, - mobileNum: decoded.mobileNum, - gender: decoded.gender, - branch: decoded.branch, - subjectCode: decoded.subjectCode, - }); - await newReg.save(); - console.log(`New user: ${decoded.email}`); - - const avSub = await Subject.findOne({ code: decoded.subjectCode }); - console.log(`Max seats for this: ${avSub.maxSeats}`); - - const sub = await Subject.findOneAndUpdate( - { code: decoded.subjectCode, seatsFilled: { $lt: avSub.maxSeats } }, - { $inc: { seatsFilled: 1 } }, - { new: true }, - ); - console.log(`Updated seats: ${sub.seatsFilled}`); - if( !sub ) { - return req.render('verify-email', { - success: false, - message: `Seats for this subject just got filled up!` - }); - } - console.log(`Seat reserved for ${decoded.email}`); - return res.render('verify-email', { - success: true, - message: `Your seat has been reserved: ${decoded.subjectCode}`, - }); - } catch(error) { - const avSub = await Subject.findOne({ code: decoded.subjectCode }); - await Subject.findOneAndUpdate( - { code: decoded.subjectCode, seatsFilled: { $lt: avSub.maxSeats } }, - { $inc: { seatsFilled: -1 } }, - { new: true }, - ); - console.log(`Error: ${error}`); - return res.render('verify-email', { - success: false, - message: `Try again gigga`, - }) - } -}); - -module.exports = route; - diff --git a/routes/form.js b/routes/form.js deleted file mode 100644 index 286503b..0000000 --- a/routes/form.js +++ /dev/null @@ -1,65 +0,0 @@ -const express = require("express"); -const route = express.Router(); -const Subject = require("../models/subject"); -const Form = require("../models/form"); -const dotenv = require("dotenv"); -const { addEmailJob } = require("../services/redis/emailQueue"); -dotenv.config(); -const jwt = require("jsonwebtoken"); - -route.post('/submit', async(req, res) => { - const { name, email, rollNumber, mobileNum, gender, branch, subjectCode } = req.body; - if( !name || !email || !rollNumber || !gender || !branch || !subjectCode || !mobileNum ) { - return res.status(400).json({ - success: false, - message: "All the fields are required", - }); - }; - - if( !email.endsWith('@nith.ac.in') ) { - return res.status(400).json({ - success: false, - message: "Only college emails are allowed", - }); - }; - - const existingUser = await Form.findOne({ email }); - if( existingUser ) { - return res.status(400).json({ - success: false, - message: `${existingUser.email} is already registered to ${existingUser.subjectCode}` - }); - }; - - const subject = await Subject.findOne({ code: subjectCode }); - if( subject.seatsFilled >= subject.maxSeats) { - return res.status(400).json({ - success: false, - message: `All the Seats for this subject have been reserved`, - }); - }; - - - try { - const token = jwt.sign( - { name, email, rollNumber, mobileNum, branch, subjectCode, gender }, - process.env.JWT_SECRET, - {expiresIn: '24h'}, - ) - - await addEmailJob(email, token); - console.log(`Enqueued verification email for ${email}`); - return res.status(200).json({ - success: true, - message: `Check your email inbox for confirming the seat`, - }); - } catch(error) { - console.log(`${error}`); - return res.status(500).json({ - success: false, - message: `Internal server error`, - }) - }; -}); - -module.exports = route; diff --git a/routes/subject.js b/routes/subject.js deleted file mode 100644 index d85a4cf..0000000 --- a/routes/subject.js +++ /dev/null @@ -1,61 +0,0 @@ -const express = require("express"); -const route = express.Router(); -const Subject = require("../models/subject"); - -const subjectCode = ['SA-201', 'SA-202', 'SA-203', 'SA-204', 'SA-205', 'SA-206', 'SA-207', 'SA-208', 'SA-209', 'SA-210', 'SA-211', 'SA-212', 'SA-213']; - -const subjectNames = { - 'SA-201': 'National Cadet Corps (NCC)', - 'SA-202': 'National Service Scheme (NSS)', - 'SA-203': 'Yoga and Meditation', - 'SA-204': 'Sports Activities', - 'SA-205': 'Prayas', - 'SA-206': 'Martial Arts', - 'SA-207': 'Music, Dance, and Dramatics', - 'SA-208': 'Social Service and Discipline', - 'SA-209': 'Photography and Creative Art', - 'SA-210': 'Swachh Bharat Abhiyan', - 'SA-211': 'Nasha Mukti Abhiyan', - 'SA-212': 'Horticulture', - 'SA-213': 'Viksit Bharat' -}; - -route.get('/', (req, res) => { - res.render('subject', { subjectCodes: subjectCode }); -}); - -// API endpoint to fetch all subjects -route.get('/api/all', async (req, res) => { - try { - const subjects = await Subject.find({}); - const formattedSubjects = subjects.map(sub => ({ - code: sub.code, - name: subjectNames[sub.code] || sub.code, - maxSeats: sub.maxSeats, - seatsFilled: sub.seatsFilled || 0, - })); - return res.status(200).json({ - success: true, - data: formattedSubjects, - }); - } catch (err) { - console.error('Error fetching subjects:', err); - return res.status(500).json({ - success: false, - message: 'Failed to fetch subjects', - }); - } -}); - -route.post('/', async (req, res) => { - const { code, maxSeats } = req.body; - if (!code) return res.status(400).json({ message: "Code is required" }); - const sub = new Subject({ - code, - maxSeats, - }); - await sub.save(); - return res.status(200).json({ message: "Subject added to the database" }); -}) - -module.exports = route; diff --git a/services/redis/emailQueue.js b/services/redis/emailQueue.js deleted file mode 100644 index b6de129..0000000 --- a/services/redis/emailQueue.js +++ /dev/null @@ -1,31 +0,0 @@ -const { Queue } = require("bullmq"); -const IORedis = require("ioredis"); - -const connection = new IORedis(process.env.REDIS_URL || { - host: process.env.REDIS_HOST || '127.0.0.1', - port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT, 10) : 6379, -}); - -const emailQueue = new Queue("verification-email", { connection }); - -const addEmailJob = async(email, token) => { - await emailQueue.add("send-verify-email", - { - email: email, - token: token, - }, - { - attempts: 3, - backoff: { - type: 'exponential', - delay: 5000, - }, - removeOnComplete: true, - removeOnFail: false, - }); - console.log(`${email} send to the email job to redis`); -}; - -module.exports = { - addEmailJob -}; diff --git a/services/redis/emailWorker.js b/services/redis/emailWorker.js deleted file mode 100644 index b88b983..0000000 --- a/services/redis/emailWorker.js +++ /dev/null @@ -1,35 +0,0 @@ -const { Worker } = require("bullmq"); -const IORedis = require("ioredis"); -const dotenv = require("dotenv"); -const { sendEmail } = require("../sendEmail"); - -dotenv.config(); - -const connection = new IORedis( process.env.REDIS_URL || { - host: process.env.REDIS_HOST || '127.0.0.1', - port: process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT, 10) : 6379, - maxRetriesPerRequest: null, -}); - -const QUEUE_NAME = 'verification-email'; - -const worker = new Worker(QUEUE_NAME, async (job) => { - const { token } = job.data; - if(!token) throw new Error(`Missing token in job data`); - await sendEmail(token); -}, { connection }); - -worker.on('completed', job => console.log(`Job ${job.id} completed`)); -worker.on('failed', (job, err) => console.log(`Job ${job.id} failed`)); -worker.on('error', err => console.log(`Woker error: ${err}`)); - -const shutdown = async() => { - console.log(`Shutting down worker....`); - try { await worker.close(); } catch (e) { console.error(`Error closing worker: ${e}`); } - process.exit(0); -}; - -process.on('SIGINT', shutdown); -process.on('SIGTERM', shutdown); - -console.log(`Worker started for queue ${QUEUE_NAME}`); \ No newline at end of file diff --git a/services/sendEmail.js b/services/sendEmail.js deleted file mode 100644 index cc8f132..0000000 --- a/services/sendEmail.js +++ /dev/null @@ -1,147 +0,0 @@ -const nodemailer = require("nodemailer"); -const jwt = require("jsonwebtoken"); -const dotenv = require("dotenv"); -dotenv.config(); - -const sendEmail = async(token) => { - const transporter = nodemailer.createTransport({ - host: "smtp.gmail.com", - port: 587, - secure: false, - auth: { - user: process.env.USER_MAIL, - pass: process.env.USER_PASS, - } - }); - const decoded = jwt.verify(token, process.env.JWT_SECRET); - const verificationURL = `${process.env.PROD_URL}/email/verify-email?token=${token}` - try { - await transporter.sendMail({ - from: process.env.USER_MAIL, - to: decoded.email, - subject: "Registration of elective subjects", - html: ` - - - - - - Registration Confirmation - - - - - - - -
    - - - - - - - - - - - - - - - - - - -
    -

    Confirm Registration

    -
    -

    - Hello ${decoded.name}, -

    -

    - We are pleased to inform you that your seat has been reserved. Please verify your details below to complete the process. -

    - - - - - - - - - - - - - - - - - - - - - - - -
    - Full Name - - ${decoded.name} -
    - Email - - ${decoded.email} -
    - Roll Number - - ${decoded.rollNumber} -
    - Branch - - ${decoded.branch} -
    - Activity Code - - ${decoded.subjectCode} -
    - - - - - - - - - -
    - - Confirm Registration - -
    -

    - This link will expire in 24 hours. -

    -
    -
    -

    - You received this email because you registered on our portal.
    -

    -
    -
    - - - - ` - }) - } catch(error) { - console.log(`${error}`); - throw new Error(`While sending mail to ${decoded.email}`); - } -} - -module.exports = { - sendEmail -} \ No newline at end of file diff --git a/views/details.ejs b/views/details.ejs deleted file mode 100644 index 37395f5..0000000 --- a/views/details.ejs +++ /dev/null @@ -1,343 +0,0 @@ - - - - - - - Registration Details - - - - - -

    -
    -
    -

    Registered Students

    - Total Records: <%= totalCount %> -
    - -
    - -
    -
    -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - - - <% if(Object.keys(query).length> 0) { %> - Clear - <% } %> -
    -
    - -
    - <% if (details.length> 0) { %> - - - - - - - - - - - - - - - <% details.forEach(student=> { %> - - - - - - - - - - - <% }) %> - -
    NameRoll NumberEmailMobile NumberGenderBranchCourseRegistered At
    - <%= student.name %> - - <%= student.rollNumber %> - - <%= student.email %> - - <%= student.mobileNum %> - - <%= student.gender %> - - <%= student.branch %> - - - <%= student.subjectCode %> - - - <%= new Date(student.createdAt).toLocaleString('en-IN', { dateStyle: 'medium' , - timeStyle: 'short' }) %> -
    - <% } else { %> -
    -

    No students found

    -

    Try adjusting your search or filters.

    -
    - <% } %> -
    -
    - - - \ No newline at end of file diff --git a/views/home.ejs b/views/home.ejs deleted file mode 100644 index 7de9b87..0000000 --- a/views/home.ejs +++ /dev/null @@ -1,530 +0,0 @@ - - - - - - - - Course Registration - - - - - - -
    -
    -
    -

    Registration of LA/CA courses

    -

    Semester 2026

    -
    - ! - Note: NCC students are strictly required to enroll in the NCC (SA-201) course - only. -
    -
    - -
    - -
    - -
    - - -
    - -
    - - -
    - -
    - - -
    - -
    -
    - -
    - -
    -
    -
    - - -
    -
    - -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - - -
    - - - -
    -
    - - - - - - - \ No newline at end of file diff --git a/views/subject.ejs b/views/subject.ejs deleted file mode 100644 index e8dd0f2..0000000 --- a/views/subject.ejs +++ /dev/null @@ -1,193 +0,0 @@ - - - - - - - Manage Subjects - - - - - -
    -

    Add New Subject

    -
    -
    -
    - - -
    -
    - - -
    - -
    -
    - - - - - \ No newline at end of file diff --git a/views/verify-email.ejs b/views/verify-email.ejs deleted file mode 100644 index 64262c6..0000000 --- a/views/verify-email.ejs +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - Verification Status - - - - -
    -
    -
    - - <% if (success) { %> - - <% } else { %> - - <% } %> - -
    -
    - -

    <%= success ? 'Confirmed!' : 'Failed' %>

    - -

    <%= message %>

    - - Return to Home -
    - - - \ No newline at end of file From dcb816cdd2691310d7f6790d9d8625aa392b5917 Mon Sep 17 00:00:00 2001 From: ayush00git Date: Sat, 4 Apr 2026 00:57:30 +0530 Subject: [PATCH 2/5] feat: initialized db models --- go.mod | 40 +++++++++++++++++++++ go.sum | 91 +++++++++++++++++++++++++++++++++++++++++++++++ main.go | 24 +++++++++++++ models/course.go | 14 ++++++++ models/student.go | 35 ++++++++++++++++++ 5 files changed, 204 insertions(+) create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100644 models/course.go create mode 100644 models/student.go diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..e30134a --- /dev/null +++ b/go.mod @@ -0,0 +1,40 @@ +module github.com/ayush00git/laca-web + +go 1.25.0 + +require ( + github.com/gin-gonic/gin v1.12.0 + go.mongodb.org/mongo-driver v1.17.9 +) + +require ( + github.com/bytedance/gopkg v0.1.3 // indirect + github.com/bytedance/sonic v1.15.0 // indirect + github.com/bytedance/sonic/loader v0.5.0 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/gabriel-vasile/mimetype v1.4.12 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.30.1 // indirect + github.com/goccy/go-json v0.10.5 // indirect + github.com/goccy/go-yaml v1.19.2 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/quic-go/qpack v0.6.0 // indirect + github.com/quic-go/quic-go v0.59.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.1 // indirect + go.mongodb.org/mongo-driver/v2 v2.5.0 // indirect + golang.org/x/arch v0.22.0 // indirect + golang.org/x/crypto v0.48.0 // indirect + golang.org/x/net v0.51.0 // indirect + golang.org/x/sys v0.41.0 // indirect + golang.org/x/text v0.34.0 // indirect + google.golang.org/protobuf v1.36.10 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..9c7c635 --- /dev/null +++ b/go.sum @@ -0,0 +1,91 @@ +github.com/bytedance/gopkg v0.1.3 h1:TPBSwH8RsouGCBcMBktLt1AymVo2TVsBVCY4b6TnZ/M= +github.com/bytedance/gopkg v0.1.3/go.mod h1:576VvJ+eJgyCzdjS+c4+77QF3p7ubbtiKARP3TxducM= +github.com/bytedance/sonic v1.15.0 h1:/PXeWFaR5ElNcVE84U0dOHjiMHQOwNIx3K4ymzh/uSE= +github.com/bytedance/sonic v1.15.0/go.mod h1:tFkWrPz0/CUCLEF4ri4UkHekCIcdnkqXw9VduqpJh0k= +github.com/bytedance/sonic/loader v0.5.0 h1:gXH3KVnatgY7loH5/TkeVyXPfESoqSBSBEiDd5VjlgE= +github.com/bytedance/sonic/loader v0.5.0/go.mod h1:AR4NYCk5DdzZizZ5djGqQ92eEhCCcdf5x77udYiSJRo= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.12 h1:e9hWvmLYvtp846tLHam2o++qitpguFiYCKbn0w9jyqw= +github.com/gabriel-vasile/mimetype v1.4.12/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.12.0 h1:b3YAbrZtnf8N//yjKeU2+MQsh2mY5htkZidOM7O0wG8= +github.com/gin-gonic/gin v1.12.0/go.mod h1:VxccKfsSllpKshkBWgVgRniFFAzFb9csfngsqANjnLc= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.30.1 h1:f3zDSN/zOma+w6+1Wswgd9fLkdwy06ntQJp0BBvFG0w= +github.com/go-playground/validator/v10 v10.30.1/go.mod h1:oSuBIQzuJxL//3MelwSLD5hc2Tu889bF0Idm9Dg26cM= +github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= +github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= +github.com/goccy/go-yaml v1.19.2 h1:PmFC1S6h8ljIz6gMRBopkjP1TVT7xuwrButHID66PoM= +github.com/goccy/go-yaml v1.19.2/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= +github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= +github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= +github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.1 h1:waO7eEiFDwidsBN6agj1vJQ4AG7lh2yqXyOXqhgQuyY= +github.com/ugorji/go/codec v1.3.1/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +go.mongodb.org/mongo-driver v1.17.9 h1:IexDdCuuNJ3BHrELgBlyaH9p60JXAvdzWR128q+U5tU= +go.mongodb.org/mongo-driver v1.17.9/go.mod h1:LlOhpH5NUEfhxcAwG0UEkMqwYcc4JU18gtCdGudk/tQ= +go.mongodb.org/mongo-driver/v2 v2.5.0 h1:yXUhImUjjAInNcpTcAlPHiT7bIXhshCTL3jVBkF3xaE= +go.mongodb.org/mongo-driver/v2 v2.5.0/go.mod h1:yOI9kBsufol30iFsl1slpdq1I0eHPzybRWdyYUs8K/0= +go.uber.org/mock v0.6.0 h1:hyF9dfmbgIX5EfOdasqLsWD6xqpNZlXblLB/Dbnwv3Y= +go.uber.org/mock v0.6.0/go.mod h1:KiVJ4BqZJaMj4svdfmHM0AUx4NJYO8ZNpPnZn1Z+BBU= +golang.org/x/arch v0.22.0 h1:c/Zle32i5ttqRXjdLyyHZESLD/bB90DCU1g9l/0YBDI= +golang.org/x/arch v0.22.0/go.mod h1:dNHoOeKiyja7GTvF9NJS1l3Z2yntpQNzgrjh1cU103A= +golang.org/x/crypto v0.48.0 h1:/VRzVqiRSggnhY7gNRxPauEQ5Drw9haKdM0jqfcCFts= +golang.org/x/crypto v0.48.0/go.mod h1:r0kV5h3qnFPlQnBSrULhlsRfryS2pmewsg+XfMgkVos= +golang.org/x/net v0.51.0 h1:94R/GTO7mt3/4wIKpcR5gkGmRLOuE/2hNGeWq/GBIFo= +golang.org/x/net v0.51.0/go.mod h1:aamm+2QF5ogm02fjy5Bb7CQ0WMt1/WVM7FtyaTLlA9Y= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.41.0 h1:Ivj+2Cp/ylzLiEU89QhWblYnOE9zerudt9Ftecq2C6k= +golang.org/x/sys v0.41.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/text v0.34.0 h1:oL/Qq0Kdaqxa1KbNeMKwQq0reLCCaFtqu2eNuSeNHbk= +golang.org/x/text v0.34.0/go.mod h1:homfLqTYRFyVYemLBFl5GgL/DWEiH5wcsQ5gSh1yziA= +google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE= +google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..93c0ac3 --- /dev/null +++ b/main.go @@ -0,0 +1,24 @@ +package main + +import ( + "github.com/gin-gonic/gin" +) + +func main() { + // mongodb connection + + // handlers and routes + // r.Default + + // connection + // log.Fatal() + + r := gin.Default() + + r.GET("/", func(c *gin.Context) { + c.JSON(200, gin.H{ + "message": "gotcha!", + }) + }) + r.Run(":8080") +} diff --git a/models/course.go b/models/course.go new file mode 100644 index 0000000..4d0ef3e --- /dev/null +++ b/models/course.go @@ -0,0 +1,14 @@ +package models + +import ( + "time" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type Course struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"_id"` + Code string `bson:"code" json:"code" binding:"required"` + MaxSeats uint16 `bson:"maxSeats" json:"maxSeats" binding:"required"` + Students []primitive.ObjectID `bson:"students" json:"students"` + CreatedAt time.Time `bson:"created_at" json:"created_at"` +} diff --git a/models/student.go b/models/student.go new file mode 100644 index 0000000..5e2b0cd --- /dev/null +++ b/models/student.go @@ -0,0 +1,35 @@ +package models + +import ( + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type BranchType string +const ( + CSE BranchType = "CSE" + DCS BranchType = "DCS" + ECE BranchType = "ECE" + DEC BranchType = "DEC" + MNC BranchType = "MNC" + EE BranchType = "EE" + PH BranchType = "PHY" + CV BranchType = "CVL" + MS BranchType = "MS" +) + +type GenderType string +const ( + Male GenderType = "Male" + Female GenderType = "Female" + Others GenderType = "Others" +) + +type Student struct { + ID primitive.ObjectID `bson:"_id,omitempty" json:"_id"` + Name string `bson:"name" json:"name" binding:"required"` + Email string `bson:"email" json:"email" binding:"required"` + Branch BranchType `bson:"branch" json:"branch" binding:"required,oneof=CSE DCS ECE DEC MNC EE PHY CVL MS"` + RollNumber string `bson:"roll_number" json:"roll_number" binding:"required"` + Gender GenderType `bson:"gender" json:"gender" binding:"required,oneof=Male Female Others"` + CourseCode string `bson:"course_code" json:"course_code" binding:"required"` +} From f221c5ea506a74455c37f100f585648ad84d1004 Mon Sep 17 00:00:00 2001 From: ayush00git Date: Sun, 5 Apr 2026 23:28:07 +0530 Subject: [PATCH 3/5] pkg: added getenv helper function --- helpers/env.go | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 helpers/env.go diff --git a/helpers/env.go b/helpers/env.go new file mode 100644 index 0000000..d1452b8 --- /dev/null +++ b/helpers/env.go @@ -0,0 +1,18 @@ +package helpers + +import ( + "fmt" + "os" + + "github.com/joho/godotenv" +) + +func GetEnvVar(envVar string) (string) { + err := godotenv.Load() + if err != nil { + fmt.Printf("No .env file found") + } + + Var := os.Getenv(envVar) + return Var +} From 07951cd78bc6d8d54c4e194a6982fc9687923ca7 Mon Sep 17 00:00:00 2001 From: ayush00git Date: Mon, 6 Apr 2026 00:27:36 +0530 Subject: [PATCH 4/5] pkg: db connection helper added --- db/connect.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 db/connect.go diff --git a/db/connect.go b/db/connect.go new file mode 100644 index 0000000..f998621 --- /dev/null +++ b/db/connect.go @@ -0,0 +1,25 @@ +package db + +import ( + "context" + "fmt" + + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +func ConnectToMongo (uri string) (*mongo.Database, error) { + + client, err := mongo.Connect(context.Background(), options.Client().ApplyURI(uri)) + if err != nil { + return nil, err + } + + err = client.Ping(context.Background(), nil) + if err != nil { + return nil, err + } + + fmt.Printf("MongoDB connected!") + return client.Database("laca-db"), nil +} From 9bc844401b964e5315c7731fb73c756620c994e5 Mon Sep 17 00:00:00 2001 From: ayush00git Date: Mon, 6 Apr 2026 10:52:42 +0530 Subject: [PATCH 5/5] fix: set server api opts in connect pkg --- db/connect.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/db/connect.go b/db/connect.go index f998621..5cd1183 100644 --- a/db/connect.go +++ b/db/connect.go @@ -4,22 +4,30 @@ import ( "context" "fmt" - "go.mongodb.org/mongo-driver/mongo" - "go.mongodb.org/mongo-driver/mongo/options" + "go.mongodb.org/mongo-driver/v2/mongo" + "go.mongodb.org/mongo-driver/v2/mongo/options" ) func ConnectToMongo (uri string) (*mongo.Database, error) { - client, err := mongo.Connect(context.Background(), options.Client().ApplyURI(uri)) + serverAPI := options.ServerAPI(options.ServerAPIVersion1) + opts := options.Client().ApplyURI(uri).SetServerAPIOptions(serverAPI) + + client, err := mongo.Connect(opts) if err != nil { return nil, err } - err = client.Ping(context.Background(), nil) - if err != nil { + defer func() { + if err := client.Disconnect(context.TODO()); err != nil { + fmt.Printf("Error disconnecting from MongoDB: %s", err) + } + } () + + if err := client.Ping(context.TODO(), nil); err != nil { return nil, err } - fmt.Printf("MongoDB connected!") + fmt.Println("Connected to MongoDB!") return client.Database("laca-db"), nil }