diff --git a/src/user-profile/profile-routes.ts b/src/user-profile/profile-routes.ts index f75f3cf..a23e2a5 100644 --- a/src/user-profile/profile-routes.ts +++ b/src/user-profile/profile-routes.ts @@ -1,9 +1,11 @@ import express from 'express'; import passport from 'passport'; import { DB_NAME, getDatabaseClient } from '../db-utils'; -import { MongoUser } from '../shared/models/user'; +import { MongoUser, User } from '../shared/models/user'; import { ObjectId } from 'bson'; import { Word } from '../shared/models/word'; +import { MongoCategory } from '../shared/models/category'; +import { MongoShelf } from '../shared/models/shelf'; export const userProfileRoutes = express.Router(); @@ -22,6 +24,64 @@ userProfileRoutes.get('/profile/', jwtAuthentication, async (request, response) return; }); +// Get Deep copy of data +userProfileRoutes.get('/deep-copy/', jwtAuthentication, async (request, response) => { + const user: MongoUser = (request.user as any); + + const categoryCollection = getDatabaseClient().db(DB_NAME).collection('categories'); + const shelfCollection = getDatabaseClient().db(DB_NAME).collection('shelves'); + const wordCollection = getDatabaseClient().db(DB_NAME).collection('words'); + + const allDeepCategories: any = []; + + const allCategories = await categoryCollection.find({ + _id: { $in: user.categories.map(id => new ObjectId(id)) } + }).toArray(); + + + try { + for (let i = 0; i < allCategories.length; i += 1) { + if (allCategories[i].shelves) { + const shelves: any = await shelfCollection.find({ + _id: { $in: allCategories[i].shelves.map(id => new ObjectId(id)) } + }).toArray(); + + for (let j = 0; j < allCategories[i].shelves.length; j += 1) { + if (shelves[j].words) { + const words = await wordCollection.find({ + _id: { $in: shelves[j].words.map((word: any) => new ObjectId(word.word)) } + }).toArray(); + + words.forEach((word, index) => { + shelves[j].words[index].word = word; + }); + + } + } + + allDeepCategories.push({ + ...allCategories[i], + shelves, + }); + } + } + } catch { + response.sendStatus(500); + return; + } + + response.status(200); + response.json({ + _id: user._id, + name: user.name, + email: user.email, + isVerified: user.isVerified, + categories: allDeepCategories + }); + + return; +}); + // Add favourite word userProfileRoutes.post('/favourite-words/', jwtAuthentication, async (request, response) => {