import express from 'express'; import passport, { use } from 'passport'; import { MongoUser } from '../models/user'; import { Category, MongoCategory } from '../models/category'; import { DB_NAME } from '../db-utils'; import { getDatabaseClient } from '../db-utils'; import { ObjectId } from 'bson'; export const userProfileRoutes = express.Router(); export const jwtAuthentication = passport.authenticate('jwt', { session: false }); userProfileRoutes.get('/profile/', jwtAuthentication, async (request, response) => { const user: MongoUser = (request.user as any); response.json({ _id: user._id, name: user.name, email: user.email, isVerified: user.isVerified, categories: user.categories, uncategorised: user.uncategorised }); return; }); userProfileRoutes.post('/category/', jwtAuthentication, async (request, response) => { const user: MongoUser = (request.user as any); const categoryCollection = getDatabaseClient().db(DB_NAME).collection('categories'); const userCollection = getDatabaseClient().db(DB_NAME).collection('users'); if (!request.body.name || !request.body.icon) { response.status(400); response.send("Category Name or icon(base64) missing"); return; } try { const newCategory = await categoryCollection.insertOne({ name: request.body.name, icon: request.body.icon, isArchived: false, }); if (!user.categories) { user.categories = []; } user.categories.push(newCategory.insertedId.toHexString()); await userCollection.updateOne({ _id: user._id }, { $set: { categories: user.categories } }); response.sendStatus(200); } catch(e) { response.sendStatus(500); return; } return; }); userProfileRoutes.put('/category/', jwtAuthentication, async (request, response) => { const categoryCollection = getDatabaseClient().db(DB_NAME).collection('categories'); let currentCategory; try { currentCategory = await categoryCollection.findOne({ _id: new ObjectId(request.body._id) }); } catch { if (!currentCategory) { response.status(400); response.send("Category ID did not match"); return; } } if (request.body.isArchived) { if (typeof request.body.isArchived !== "boolean") { response.status(400); response.send("Archived should be a boolean flag"); return; } } try { await categoryCollection.updateOne({ _id: new ObjectId(request.body._id), }, { $set: { name: request.body.name ? request.body.name : currentCategory.name, icon: request.body.icon ? request.body.icon : currentCategory.icon, isArchived: request.body.isArchived !== undefined ? request.body.isArchived : currentCategory.isArchived } }); response.sendStatus(200); } catch (e) { response.status(400); response.json(e); } return; });