[
  {
    "path": ".gitignore",
    "content": ".env\r\nnode_modules\r\n.cph"
  },
  {
    "path": "main.js",
    "content": ""
  },
  {
    "path": "package.json",
    "content": "{\n    \"name\": \"task-manager\",\n    \"version\": \"1.0.0\",\n    \"description\": \"\",\n    \"scripts\": {\n        \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n    },\n    \"author\": \"\",\n    \"license\": \"ISC\",\n    \"dependencies\": {\n        \"bcrypt\": \"^6.0.0\",\n        \"cookie-parser\": \"^1.4.7\",\n        \"dotenv\": \"^17.4.1\",\n        \"express\": \"^5.2.1\",\n        \"express-rate-limit\": \"^8.4.1\",\n        \"jsonwebtoken\": \"^9.0.3\",\n        \"mongodb\": \"^7.1.1\",\n        \"nodemailer\": \"^8.0.5\",\n        \"nodemon\": \"^3.1.14\",\n        \"zod\": \"^4.3.6\"\n    }\n}\n"
  },
  {
    "path": "server.js",
    "content": "const db = require(\"./src/models/database\");\r\nconst app = require(\"./src/app\");\r\n(async () => {\r\n    await db.connectToMongo();\r\n    app.listen(5000);\r\n    console.log(\"server ready\");\r\n})();\r\n"
  },
  {
    "path": "src/app.js",
    "content": "const express = require(\"express\");\r\n\r\nconst rateLimit = require(\"express-rate-limit\");\r\n\r\nlet app = express();\r\nconst globalLimiter = rateLimit({\r\n    windowMs: 60 * 1000, // 1 min\r\n    max: 100, // reasonable default\r\n    message: \"Too many requests\",\r\n});\r\napp.use(globalLimiter);\r\n\r\nconst login = require(\"./routes/login-route.js\");\r\nconst signup = require(\"./routes/signup-route.js\");\r\nconst refresh = require(\"./routes/refresh-token-route.js\");\r\nconst removeTask = require(\"./routes/remove-task-route.js\");\r\nconst editTask = require(\"./routes/edit-task-route.js\");\r\nconst addTask = require(\"./routes/add-task-route.js\");\r\nconst getTasks = require(\"./routes/get-tasks-route.js\");\r\nconst submitTask = require(\"./routes/submit-task-route.js\");\r\nconst verifyUser = require(\"./routes/verify-user.js\");\r\nconst renewOTP = require(\"./routes/renew-otp-route.js\");\r\nconst cookieParser = require(\"cookie-parser\");\r\nconst errors = require(\"./services/errors.js\");\r\napp.use(cookieParser());\r\napp.use(express.json());\r\napp.use(\"/signup\", signup);\r\napp.use(\"/verify/\", verifyUser);\r\napp.use(\"/login\", login);\r\napp.use(\"/token/refresh\", refresh);\r\napp.use(\"/task\", addTask);\r\napp.use(\"/task\", removeTask);\r\napp.use(\"/task\", editTask);\r\napp.use(\"/tasks\", getTasks);\r\napp.use(\"/submit/\", submitTask);\r\napp.use(\"/otp/\", renewOTP);\r\napp.use(errors);\r\nmodule.exports = app;\r\n"
  },
  {
    "path": "src/controllers/add-task-controller.js",
    "content": "let addTaskService = require(\"../services/add-task-service\");\r\nasync function addTask(req, res) {\r\n    let result = await addTaskService(req.body, req.user);\r\n    res.status(result.status).send(result.message);\r\n}\r\n\r\nmodule.exports = addTask;\r\n"
  },
  {
    "path": "src/controllers/edit-task-controller.js",
    "content": "let editTaskService = require(\"../services/edit-task-service\");\r\nasync function editTask(req, res) {\r\n    let result = await editTaskService(req.body,req.params.id, req.user);\r\n    res.status(result.status).send(result.message);\r\n}\r\n\r\nmodule.exports = editTask;\r\n"
  },
  {
    "path": "src/controllers/get-tasks-controller.js",
    "content": "const getTasksService = require(\"../services/get-task-service\");\r\n\r\nasync function getTasks(req, res) {\r\n    let tasks = await getTasksService(req.user);\r\n    res.status(tasks.status).json(tasks.tasks);\r\n}\r\n\r\nmodule.exports = getTasks;\r\n"
  },
  {
    "path": "src/controllers/login-controller.js",
    "content": "const loginService = require(\"../services/login-service\");\r\n\r\nasync function login(req, res) {\r\n    let result = await loginService(req.body);\r\n    res.status(result.status)\r\n        .cookie(\"refreshToken\", result.tokens.refresh, {\r\n            httpOnly: true,\r\n            secure: false,\r\n            sameSite: \"strict\",\r\n            path: \"/token/refresh\",\r\n        })\r\n        .json({ accessToken: result.tokens.access });\r\n}\r\n\r\nmodule.exports = login;\r\n"
  },
  {
    "path": "src/controllers/refresh-token-controller.js",
    "content": "const refreshTokenService = require(\"../services/refresh-token-service\");\r\n\r\nasync function refreshToken(req, res) {\r\n    let result = await refreshTokenService(req.cookies.refreshToken);\r\n    res.cookie(\"refreshToken\", result.tokens.refresh, {\r\n        httpOnly: true,\r\n        secure: false,\r\n        sameSite: \"strict\",\r\n        path: \"/token/refresh\",\r\n    });\r\n    res.status(result.status).json({ \"access token\": result.tokens.access });\r\n}\r\nmodule.exports = refreshToken;\r\n"
  },
  {
    "path": "src/controllers/remove-task-controller.js",
    "content": "const db = require(\"../models/database\");\r\nconst removeTaskService = require(\"../services/remove-task-service\");\r\nasync function removeTask(req, res) {\r\n    let result = await removeTaskService(req.params.id, req.user);\r\n    res.status(result.status).send(result.message);\r\n}\r\n\r\nmodule.exports = removeTask;\r\n"
  },
  {
    "path": "src/controllers/renew-otp-controller.js",
    "content": "const renewOTPService = require(\"../services/renew-otp-service\");\n\nasync function renewOTP(req, res) {\n    let result = await renewOTPService(req.body);\n    res.status(result.status).send(result.message);\n}\n\nmodule.exports = renewOTP;\n"
  },
  {
    "path": "src/controllers/signup-controller.js",
    "content": "const signupService = require(\"../services/signup-service\");\r\n\r\nasync function signup(req, res) {\r\n    let result = await signupService(req.body);\r\n    res.status(result.status).send(result.message);\r\n}\r\n\r\nmodule.exports = signup;\r\n"
  },
  {
    "path": "src/controllers/submit-task-controller.js",
    "content": "const submitTaskService = require(\"../services/submit-task-service\");\r\nasync function submitTask(req, res) {\r\n    let result = await submitTaskService(req.body, req.params.id, req.user);\r\n    res.status(result.status).send(result.message);\r\n}\r\nmodule.exports = submitTask;\r\n"
  },
  {
    "path": "src/controllers/verify-user-controller.js",
    "content": "const verifyUserService = require(\"../services/verify-user-service\");\r\n\r\nasync function verifyUser(req, res) {\r\n    let result = await verifyUserService(req.body);\r\n    res.status(result.status).send(result.message);\r\n}\r\n\r\nmodule.exports = verifyUser;\r\n"
  },
  {
    "path": "src/middleware/verify-token.js",
    "content": "const jwt = require(\"jsonwebtoken\");\r\nconst throwError = require(\"../services/throw-error\");\r\nrequire(\"dotenv\").config();\r\nfunction verifyToken(req, res, next) {\r\n    let token = String(req.headers.authorization).split(\" \")[1];\r\n    let user;\r\n    try {\r\n        user = jwt.verify(token, process.env.JWT_KEY);\r\n    } catch (e) {\r\n        throwError(401, \"Access Denied\");\r\n    }\r\n    if (user.type !== \"access\") throwError(401, \"Access Denied\");\r\n\r\n    req.user = user;\r\n    // res.send(user);\r\n    next();\r\n}\r\nmodule.exports = verifyToken;\r\n"
  },
  {
    "path": "src/models/database.js",
    "content": "require(\"dotenv\").config();\r\nconst uri = process.env.MONGO_URI;\r\nconst { MongoClient, ServerApiVersion, ObjectId } = require(\"mongodb\");\r\n\r\n// Create a MongoClient with a MongoClientOptions object to set the Stable API version\r\nconst mongo = new MongoClient(uri, {\r\n    connectTimeoutMS: 5000,\r\n    serverSelectionTimeoutMS: 5000,\r\n    socketTimeoutMS: 5000,\r\n    serverApi: {\r\n        version: ServerApiVersion.v1,\r\n        strict: true,\r\n        deprecationErrors: true,\r\n    },\r\n});\r\n\r\nlet db;\r\nasync function connectToMongo() {\r\n    try {\r\n        await mongo.connect();\r\n        // mongo.db(\"database\").dropDatabase();\r\n        db = mongo.db(\"database\");\r\n        await db\r\n            .collection(\"pendingUsers\")\r\n            .createIndex({ createdAt: 1 }, { expireAfterSeconds: 300 });\r\n        db.collection(\"users\").createIndex({ userName: 1 }, { unique: true });\r\n        db.collection(\"users\").createIndex({ email: 1 }, { unique: true });\r\n        console.log(await db.collection(\"pendingUsers\").find({}).toArray());\r\n    } catch (e) {\r\n        console.error(e);\r\n        process.exit(1);\r\n    }\r\n}\r\n\r\nasync function insertUser(data) {\r\n    let users = db.collection(\"pendingUsers\");\r\n    data.createdAt = new Date();\r\n    return await users.insertOne(data);\r\n}\r\nasync function insertVerifiedUser(data) {\r\n    let users = db.collection(\"users\");\r\n    return await users.insertOne(data);\r\n}\r\nasync function getUser(addedUser) {\r\n    let users = db.collection(\"users\");\r\n    let user = await users.findOne(addedUser);\r\n    return user;\r\n}\r\nasync function getPendingUser(u) {\r\n    let users = db.collection(\"pendingUsers\");\r\n    let user = await users.findOne(u);\r\n    return user;\r\n}\r\nasync function refreshPendingUser(id, otp) {\r\n    let users = db.collection(\"pendingUsers\");\r\n    let result = await users.findOneAndUpdate(\r\n        { _id: new ObjectId(id) },\r\n        { $set: { otp: otp, createdAt: new Date() } },\r\n    );\r\n    return result;\r\n}\r\nasync function deletePendingUser(u) {\r\n    let users = db.collection(\"pendingUsers\");\r\n    let user = await users.findOneAndDelete(u);\r\n    return user;\r\n}\r\nasync function getUsers() {\r\n    let users = db.collection(\"users\");\r\n    let allUsers = await users.find({}).toArray();\r\n    return allUsers;\r\n}\r\nasync function insertToken(jti) {\r\n    let tokens = db.collection(\"tokens\");\r\n    await tokens.insertOne({ jti: jti });\r\n}\r\nasync function getToken(jti) {\r\n    let tokens = db.collection(\"tokens\");\r\n    let token = await tokens.findOne({ jti: jti });\r\n    return token ? true : false;\r\n}\r\nasync function removeToken(jti) {\r\n    let tokens = db.collection(\"tokens\");\r\n    let token = await tokens.findOneAndDelete({ jti: jti });\r\n    return token;\r\n}\r\nasync function insertTask(task) {\r\n    let tasks = db.collection(\"tasks\");\r\n    await tasks.insertOne(task);\r\n}\r\nasync function editTask(task, id) {\r\n    let tasks = db.collection(\"tasks\");\r\n    let result = await tasks.findOneAndUpdate(\r\n        { _id: new ObjectId(id) },\r\n        { $set: task },\r\n    );\r\n    return result;\r\n}\r\nasync function removeTask(id) {\r\n    let tasks = db.collection(\"tasks\");\r\n    let result = await tasks.findOneAndDelete({ _id: new ObjectId(id) });\r\n    return result;\r\n}\r\nasync function getTask(id) {\r\n    let tasks = db.collection(\"tasks\");\r\n    let result = await tasks.findOne({ _id: new ObjectId(id) });\r\n    return result;\r\n}\r\nasync function submitTask(id, submit) {\r\n    let tasks = db.collection(\"tasks\");\r\n    let result = await tasks.findOneAndUpdate(\r\n        { _id: new ObjectId(id) },\r\n        { $set: { submit: submit.task } },\r\n    );\r\n    return result;\r\n}\r\nasync function getTasks(to) {\r\n    let tasks = db.collection(\"tasks\");\r\n    let tasksList = await tasks.find({ to: to }).toArray();\r\n    return tasksList;\r\n}\r\nmodule.exports = {\r\n    connectToMongo,\r\n    insertUser,\r\n    insertVerifiedUser,\r\n    getUsers,\r\n    getUser,\r\n    getPendingUser,\r\n    deletePendingUser,\r\n    refreshPendingUser,\r\n    insertToken,\r\n    getToken,\r\n    removeToken,\r\n    insertTask,\r\n    getTask,\r\n    getTasks,\r\n    editTask,\r\n    removeTask,\r\n    submitTask,\r\n};\r\n"
  },
  {
    "path": "src/routes/add-task-route.js",
    "content": "let router = require(\"express\").Router();\r\nconst addTask = require(\"../controllers/add-task-controller\");\r\nlet verifyToken = require(\"../middleware/verify-token\");\r\nrouter.post(\"/\", verifyToken, addTask);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/edit-task-route.js",
    "content": "let router = require(\"express\").Router();\r\nconst editTask = require(\"../controllers/edit-task-controller\");\r\nlet verifyToken = require(\"../middleware/verify-token\");\r\nrouter.put(\"/:id\", verifyToken, editTask);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/get-tasks-route.js",
    "content": "let router = require(\"express\").Router();\r\nconst getTasks = require(\"../controllers/get-tasks-controller\");\r\nlet verifyToken = require(\"../middleware/verify-token\");\r\nrouter.get(\"/\", verifyToken, getTasks);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/login-route.js",
    "content": "const login = require(\"../controllers/login-controller\");\r\nconst router = require(\"express\").Router();\r\nrouter.post(\"/\", login);\r\n\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/refresh-token-route.js",
    "content": "const refreshToken = require(\"../controllers/refresh-token-controller\");\r\nlet router = require(\"express\").Router();\r\n\r\nrouter.post(\"/\", refreshToken);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/remove-task-route.js",
    "content": "let router = require(\"express\").Router();\r\nconst removeTask = require(\"../controllers/remove-task-controller\");\r\nlet verifyToken = require(\"../middleware/verify-token\");\r\nrouter.delete(\"/:id\", verifyToken, removeTask);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/renew-otp-route.js",
    "content": "const renewOTP = require(\"../controllers/renew-otp-controller\");\n\nlet router = require(\"express\").Router();\n\nrouter.post(\"/\", renewOTP);\nmodule.exports = router;\n"
  },
  {
    "path": "src/routes/signup-route.js",
    "content": "const signup = require(\"../controllers/signup-controller\");\r\n\r\nlet router = require(\"express\").Router();\r\n\r\nrouter.post(\"/\", signup);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/submit-task-route.js",
    "content": "let router = require(\"express\").Router();\r\nlet verifyToken = require(\"../middleware/verify-token\");\r\nlet submitTaskController = require(\"../controllers/submit-task-controller\");\r\nrouter.post(\"/:id\", verifyToken, submitTaskController);\r\nmodule.exports = router;\r\n"
  },
  {
    "path": "src/routes/verify-user.js",
    "content": "const verifyUser = require(\"../controllers/verify-user-controller\");\n\nlet router = require(\"express\").Router();\n\nrouter.post(\"/\", verifyUser);\nmodule.exports = router;\n"
  },
  {
    "path": "src/schemas/otpSchema.js",
    "content": "const { z } = require(\"zod\");\r\n\r\nlet otpSchema = z.object({\r\n    id: z.string(),\r\n});\r\n\r\nmodule.exports = otpSchema;\r\n"
  },
  {
    "path": "src/schemas/submitSchema.js",
    "content": "let { z } = require(\"zod\");\r\n\r\nlet submitSchema = z.object({ task: z.string().min(3) });\r\n\r\nmodule.exports = submitSchema;\r\n"
  },
  {
    "path": "src/schemas/taskSchema.js",
    "content": "let { z } = require(\"zod\");\r\n\r\nlet taskSchema = z.object({\r\n    title: z.string().min(3),\r\n    task: z.string().min(10),\r\n    from: z.string().min(3),\r\n    to: z.string().min(3),\r\n});\r\nlet a;\r\nmodule.exports = taskSchema;\r\n"
  },
  {
    "path": "src/schemas/userLoginSchema.js",
    "content": "const { z } = require(\"zod\");\r\n\r\nlet userSchema = z\r\n    .object({\r\n        userName: z.string().min(3).optional(),\r\n        password: z.string().min(8),\r\n        email: z.string().email().optional(),\r\n        role: z.enum([\"admin\", \"moderator\", \"user\"]),\r\n    })\r\n    .refine(\r\n        (data) => data.userName || data.email,\r\n\r\n        { message: \"Provide either userName or email\" },\r\n    );\r\n\r\nmodule.exports = userSchema;\r\n"
  },
  {
    "path": "src/schemas/userSignupSchema.js",
    "content": "const { z } = require(\"zod\");\r\n\r\nlet userSchema = z.object({\r\n    userName: z.string().min(3),\r\n    password: z.string().min(8),\r\n    email: z.string().email(\"Invalid Email\").min(5),\r\n    role: z.enum([\"admin\", \"moderator\", \"user\"]),\r\n});\r\n\r\nmodule.exports = userSchema;\r\n"
  },
  {
    "path": "src/schemas/verifyUserSchema.js",
    "content": "const { z } = require(\"zod\");\r\n\r\nlet verifyUserSchema = z.object({\r\n    id: z.string(),\r\n    otp: z.string().min(6).max(6),\r\n});\r\n\r\nmodule.exports = verifyUserSchema;\r\n"
  },
  {
    "path": "src/services/add-task-service.js",
    "content": "const { insertTask } = require(\"../models/database\");\r\nconst throwError = require(\"./throw-error\");\r\nconst taskSchema = require(\"../schemas/taskSchema\");\r\nasync function addTaskService(body, user) {\r\n    if (user.role !== \"admin\") {\r\n        throwError(401, \"Denied\");\r\n    }\r\n    body.from = user.userName;\r\n    let verifiedData = taskSchema.safeParse(body);\r\n    if (!verifiedData.success) {\r\n        throwError(400, verifiedData.error.message);\r\n    }\r\n    await insertTask(verifiedData.data);\r\n    return { status: 201, message: \"Task is sent\" };\r\n}\r\nmodule.exports = addTaskService;\r\n"
  },
  {
    "path": "src/services/create-tokens.js",
    "content": "require(\"dotenv\").config();\r\nconst jwt = require(\"jsonwebtoken\");\r\nconst crypto = require(\"crypto\");\r\nlet { insertToken } = require(\"../models/database\");\r\nfunction createTokens(user) {\r\n    let jti = crypto.randomUUID();\r\n    let jtiA = crypto.randomUUID();\r\n    let idData = {};\r\n    if (user.userName) idData.userName = user.userName;\r\n    else idData.email = user.email;\r\n    let refresh = jwt.sign(\r\n        {\r\n            jti: jti,\r\n            type: \"refresh\",\r\n            idData: idData,\r\n            email: user.email,\r\n            role: user.role,\r\n        },\r\n        process.env.JWT_KEY,\r\n        {\r\n            expiresIn: \"7d\",\r\n        },\r\n    );\r\n    insertToken(jti);\r\n    let access = jwt.sign(\r\n        {\r\n            jti: jtiA,\r\n            type: \"access\",\r\n            idData: idData,\r\n            role: user.role,\r\n        },\r\n        process.env.JWT_KEY,\r\n        {\r\n            expiresIn: \"1h\",\r\n        },\r\n    );\r\n    return { access: access, refresh: refresh };\r\n}\r\nmodule.exports = createTokens;\r\n"
  },
  {
    "path": "src/services/edit-task-service.js",
    "content": "const db = require(\"../models/database\");\r\nconst taskSchema = require(\"../schemas/taskSchema\");\r\nconst throwError = require(\"./throw-error\");\r\nasync function editTaskService(body, taskID, user) {\r\n    if (user.role !== \"admin\") throwError(401, \"Denied\");\r\n\r\n    body.from = user.userName;\r\n\r\n    let verifiedData = taskSchema.safeParse(body);\r\n    if (!verifiedData.success) throwError(400, verifiedData.error.message);\r\n\r\n    let updated = await db.editTask(verifiedData.data, taskID);\r\n    if (!updated) throwError(400, \"Task Does not exist\");\r\n\r\n    return { status: 200, message: \"Task is updated\" };\r\n}\r\n\r\nmodule.exports = editTaskService;\r\n"
  },
  {
    "path": "src/services/email-service.js",
    "content": "let nodemailer = require(\"nodemailer\");\nrequire(\"dotenv\").config();\nconst transporter = nodemailer.createTransport({\n    host: process.env.EMAIL_HOST,\n    port: 587,\n    auth: {\n        user: process.env.EMAIL_USER,\n        pass: process.env.EMAIL_PASSWORD,\n    },\n});\n\nasync function sendEmail(mail) {\n    const info = await transporter.sendMail({\n        from: process.env.EMAIL_USER,\n        to: mail.to,\n        subject: mail.subject,\n        text: mail.text,\n    });\n    // console.log(\"Message sent:\", info.messageId);\n    console.log(\"Preview URL:\", nodemailer.getTestMessageUrl(info));\n    return \"message sent\";\n}\n\n// sendEmail({ to: \"test1@user.com\", subject: \"test subject\", text: \"text ENV\" });\nmodule.exports = sendEmail;\n"
  },
  {
    "path": "src/services/errors.js",
    "content": "function errors(err, req, res, next) {\r\n    res.status(err.status || 500).json({\r\n        success: false,\r\n        message: err.message || \"Internal server error\",\r\n    });\r\n}\r\n\r\nmodule.exports = errors;\r\n"
  },
  {
    "path": "src/services/get-task-service.js",
    "content": "const { getTasks } = require(\"../models/database\");\r\nconst throwError = require(\"./throw-error\");\r\nasync function getTasksService(user) {\r\n    if (!user) throwError(401, \"Denied\");\r\n\r\n    let tasks = await getTasks(user.userName);\r\n    return { status: 200, tasks: tasks };\r\n}\r\nmodule.exports = getTasksService;\r\n"
  },
  {
    "path": "src/services/login-service.js",
    "content": "const { getUser, getUsers } = require(\"../models/database\");\r\nconst bcrypt = require(\"bcrypt\");\r\nconst createTokens = require(\"../services/create-tokens\");\r\nconst userSchema = require(\"../schemas/userLoginSchema\");\r\nlet throwError = require(\"./throw-error\");\r\nasync function loginService(body) {\r\n    body.role = \"user\";\r\n    let verified = userSchema.safeParse(body);\r\n    if (!verified.success) throwError(400, \"Invalid Login\");\r\n    let loginData = verified.data;\r\n    // let users = await getUsers();\r\n    // console.log(users);\r\n    let idData = {};\r\n    if (loginData.userName) idData.userName = loginData.userName;\r\n    else idData.email = loginData.email;\r\n    console.log(loginData);\r\n    let user = await getUser(idData);\r\n    if (!user) throwError(400, \"Not found\");\r\n    let match = await bcrypt.compare(loginData.password, user.password);\r\n    if (!match) throwError(400, \"Password didn't match\");\r\n    let tokens = createTokens(user);\r\n    return { status: 200, tokens: tokens };\r\n}\r\n\r\nmodule.exports = loginService;\r\n"
  },
  {
    "path": "src/services/refresh-token-service.js",
    "content": "const jwt = require(\"jsonwebtoken\");\r\nconst { getToken } = require(\"../models/database\");\r\nconst createTokens = require(\"../services/create-tokens\");\r\nconst throwError = require(\"./throw-error\");\r\nrequire(\"dotenv\").config();\r\n\r\nasync function refreshTokenService(token) {\r\n    let tokenInfo = jwt.verify(token, process.env.JWT_KEY);\r\n    let dbToken = await getToken(tokenInfo.jti);\r\n    if (!dbToken || tokenInfo.type !== \"refresh\") {\r\n        throwError(401, \"Access Denied\");\r\n    }\r\n    let tokens = createTokens(tokenInfo);\r\n    return { status: 200, tokens: tokens };\r\n}\r\nmodule.exports = refreshTokenService;\r\n"
  },
  {
    "path": "src/services/remove-task-service.js",
    "content": "const db = require(\"../models/database\");\r\nconst throwError = require(\"./throw-error\");\r\nasync function removeTaskService(taskID, user) {\r\n    if (user.role !== \"admin\") throwError(401, \"Denied\");\r\n    let removedTask = await db.removeTask(taskID);\r\n    if (!removedTask) throwError(400, \"Task does not exist\");\r\n    return { status: 200, message: \"Task removed\" };\r\n}\r\n\r\nmodule.exports = removeTaskService;\r\n"
  },
  {
    "path": "src/services/renew-otp-service.js",
    "content": "    const {\r\n        insertUser,\r\n        getPendingUser,\r\n        refreshPendingUser,\r\n    } = require(\"../models/database\");\r\n    const bcrypt = require(\"bcrypt\");\r\n    const crypto = require(\"crypto\");\r\n    const otpSchema = require(\"../schemas/otpSchema\");\r\n    const throwError = require(\"./throw-error\");\r\n    const sendEmail = require(\"./email-service\");\r\n    const { ObjectId } = require(\"mongodb\");\r\n    async function renewOTPService(body) {\r\n        let verified = otpSchema.safeParse(body);\r\n        if (!verified.success) throwError(400, \"Invalid Data\");\r\n        let otpRenewData = verified.data;\r\n        let findUser = await getPendingUser({\r\n            _id: new ObjectId(otpRenewData.id),\r\n        });\r\n        if (!findUser) return throwError(400, \"Does not exist\");\r\n        let otp = crypto.randomInt(100000, 999999).toString();\r\n        let hashedOTP = await bcrypt.hash(otp, 10);\r\n        await refreshPendingUser(verified.data.id, hashedOTP);\r\n        await sendEmail({\r\n            to: findUser.email,\r\n            subject: \"Renewed OTP Key\",\r\n            text: otp,\r\n        });\r\n\r\n        return { status: 201, message: { id: findUser.insertedId } };\r\n    }\r\n\r\n    module.exports = renewOTPService;\r\n"
  },
  {
    "path": "src/services/signup-service.js",
    "content": "const { getUser, insertUser, getPendingUser } = require(\"../models/database\");\r\nconst bcrypt = require(\"bcrypt\");\r\nconst crypto = require(\"crypto\");\r\nconst userSchema = require(\"../schemas/userSignupSchema\");\r\nconst throwError = require(\"./throw-error\");\r\nconst sendEmail = require(\"./email-service\");\r\nasync function signupService(body) {\r\n    body.role = \"user\";\r\n    let verified = userSchema.safeParse(body);\r\n    if (!verified.success) throwError(400, \"Invalid Data\");\r\n    let signupData = verified.data;\r\n    let findUser = await getUser({ userName: signupData.userName });\r\n    if (findUser) return throwError(409, \"Already used username\");\r\n    let findPendingUser = await getPendingUser({\r\n        userName: signupData.userName,\r\n    });\r\n    if (findPendingUser) return throwError(409, \"Already used username\");\r\n    let findEmail = await getUser({ email: signupData.email });\r\n    if (findEmail) return throwError(409, \"Already used Email\");\r\n    let encrypted = await bcrypt.hash(signupData.password, 10);\r\n    signupData.password = encrypted;\r\n    // signupData.role = 'admin';\r\n    let otp = crypto.randomInt(100000, 999999).toString();\r\n    signupData.otp = await bcrypt.hash(otp, 10);\r\n    let user = await insertUser(signupData);\r\n    await sendEmail({ to: signupData.email, subject: \"OTP Key\", text: otp });\r\n    return { status: 201, message: { id: user.insertedId } };\r\n}\r\n\r\nmodule.exports = signupService;\r\n"
  },
  {
    "path": "src/services/submit-task-service.js",
    "content": "let db = require(\"../models/database\");\r\nlet throwError = require(\"./throw-error\");\r\nconst submitSchema = require(\"../schemas/submitSchema\");\r\nasync function submitTaskService(body, taskID, user) {\r\n    if (!user) throwError(401, \"Denied\");\r\n    let task = await db.getTask(taskID);\r\n    if (!task) throwError(400, \"Task not found\");\r\n    if (user.userName != task.to) return throwError(401, \"Denied\");\r\n    let verifiedSubmit = submitSchema.safeParse(body);\r\n    if (!verifiedSubmit.success) throwError(400, verifiedSubmit.error.message);\r\n    let data = verifiedSubmit.data;\r\n    await db.submitTask(taskID, data);\r\n    return { status: 201, message: \"submitted\" };\r\n}\r\nmodule.exports = submitTaskService;\r\n"
  },
  {
    "path": "src/services/throw-error.js",
    "content": "function throwError(status, message) {\r\n    let err = new Error(message);\r\n    err.status = status;\r\n    throw err;\r\n}\r\nmodule.exports = throwError;\r\n"
  },
  {
    "path": "src/services/verify-user-service.js",
    "content": "const {\r\n    getUser,\r\n    insertVerifiedUser,\r\n    deletePendingUser,\r\n} = require(\"../models/database\");\r\nconst bcrypt = require(\"bcrypt\");\r\nconst verifyUserSchema = require(\"../schemas/verifyUserSchema\");\r\nconst { getPendingUser } = require(\"../models/database\");\r\nconst throwError = require(\"./throw-error\");\r\nconst { ObjectId } = require(\"mongodb\");\r\nasync function verifyUserService(body) {\r\n    let verifyData = verifyUserSchema.safeParse(body);\r\n    if (!verifyData.success) return throwError(400, \"Invalid Data\");\r\n    let verifyUserData = verifyData.data;\r\n    let user = await getPendingUser({ _id: new ObjectId(verifyUserData.id) });\r\n    if (!user) return throwError(400, \"Wrong id\");\r\n    let matchedOTP = await bcrypt.compare(verifyUserData.otp, user.otp);\r\n    console.log(matchedOTP);\r\n    if (!matchedOTP) return throwError(400, \"Wrong OTP\");\r\n    let createdAt = new Date(user.createdAt).getTime();\r\n    if (Date.now() > 300 * 1000 + createdAt)\r\n        return throwError(400, \"Expired OTP\");\r\n    delete user.otp;\r\n    let foundUser = await getUser({ email: user.email });\r\n    if (foundUser) return throwError(400, \"Already verified\");\r\n    let signed = await insertVerifiedUser(user);\r\n    await deletePendingUser({ _id: new ObjectId(verifyUserData.id) });\r\n    return { status: 201, message: \"OK\" };\r\n}\r\n\r\nmodule.exports = verifyUserService;\r\n"
  }
]