| @@ -1,9 +1,11 @@ | |||||
| import express from 'express'; | import express from 'express'; | ||||
| import passport from 'passport'; | import passport from 'passport'; | ||||
| import { DB_NAME, getDatabaseClient } from '../db-utils'; | 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 { ObjectId } from 'bson'; | ||||
| import { Word } from '../shared/models/word'; | import { Word } from '../shared/models/word'; | ||||
| import { MongoCategory } from '../shared/models/category'; | |||||
| import { MongoShelf } from '../shared/models/shelf'; | |||||
| export const userProfileRoutes = express.Router(); | export const userProfileRoutes = express.Router(); | ||||
| @@ -22,6 +24,64 @@ userProfileRoutes.get('/profile/', jwtAuthentication, async (request, response) | |||||
| return; | 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<MongoCategory>('categories'); | |||||
| const shelfCollection = getDatabaseClient().db(DB_NAME).collection<MongoShelf>('shelves'); | |||||
| const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('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 | // Add favourite word | ||||
| userProfileRoutes.post('/favourite-words/', jwtAuthentication, async (request, response) => { | userProfileRoutes.post('/favourite-words/', jwtAuthentication, async (request, response) => { | ||||