| const Asset = require('../models/Asset'); |
|
|
| |
| const getTodayDateStr = () => { |
| const now = new Date(); |
| const istOffset = 5.5 * 60 * 60 * 1000; |
| const istDate = new Date(now.getTime() + istOffset); |
| const dd = String(istDate.getUTCDate()).padStart(2, '0'); |
| const mm = String(istDate.getUTCMonth() + 1).padStart(2, '0'); |
| const yy = String(istDate.getUTCFullYear()).slice(-2); |
| return `${dd}${mm}${yy}`; |
| }; |
|
|
| |
| const checkAvailability = async (number) => { |
| const dateStr = getTodayDateStr(); |
| |
| |
| |
| |
| |
| |
| |
| |
| const startOfDay = new Date(); |
| startOfDay.setHours(0,0,0,0); |
| |
| const exists = await Asset.findOne({ |
| purchase_date: { $gte: startOfDay }, |
| kus_id: { $regex: `${number}$` } |
| }); |
| |
| return !exists; |
| }; |
|
|
| |
| const generateKUS = async (tier, requestedNumber = null) => { |
| const symbols = { Silver: "AG", Gold: "AU", Platinum: "PT" }; |
| const symbol = symbols[tier]; |
| const dateStr = getTodayDateStr(); |
| |
| const days = ['S', 'M', 'T', 'W', 'T', 'F', 'S']; |
| const istDate = new Date(new Date().getTime() + (5.5 * 60 * 60 * 1000)); |
| const dayInitial = days[istDate.getUTCDay()]; |
|
|
| let finalNumber; |
|
|
| if (requestedNumber) { |
| |
| const isAvailable = await checkAvailability(requestedNumber); |
| if (!isAvailable) throw new Error("Number already taken today"); |
| finalNumber = requestedNumber; |
| } else { |
| |
| let attempts = 0; |
| while (attempts < 50) { |
| const random = Math.floor(Math.random() * 1000000).toString().padStart(6, '0'); |
| if (await checkAvailability(random)) { |
| finalNumber = random; |
| break; |
| } |
| attempts++; |
| } |
| if (!finalNumber) throw new Error("High traffic. Try again."); |
| } |
|
|
| |
| |
| return `${symbol}${dateStr}${dayInitial}${finalNumber}`; |
| }; |
|
|
| module.exports = { generateKUS, checkAvailability }; |