|
|
@@ -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<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 |
|
|
|
|
|
|
|
userProfileRoutes.post('/favourite-words/', jwtAuthentication, async (request, response) => { |
|
|
|