Express TS project
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.8 KiB

  1. import express from 'express';
  2. import passport from 'passport';
  3. import { DB_NAME, getDatabaseClient } from '../db-utils';
  4. import { MongoUser } from '../models/user';
  5. import { ObjectId } from 'bson';
  6. import { Word } from '../models/word';
  7. export const userProfileRoutes = express.Router();
  8. export const jwtAuthentication = passport.authenticate('jwt', { session: false });
  9. userProfileRoutes.get('/profile/', jwtAuthentication, async (request, response) => {
  10. const user: MongoUser = (request.user as any);
  11. response.json({
  12. _id: user._id,
  13. name: user.name,
  14. email: user.email,
  15. isVerified: user.isVerified,
  16. categories: user.categories,
  17. uncategorised: user.uncategorised,
  18. favouriteWords: user.favouriteWords,
  19. });
  20. return;
  21. });
  22. // Add favourite word
  23. userProfileRoutes.post('/favourite-words/', jwtAuthentication, async (request, response) => {
  24. const user: MongoUser = (request.user as any);
  25. const userCollection = getDatabaseClient().db(DB_NAME).collection<MongoUser>('users');
  26. const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words');
  27. if (!user.favouriteWords) {
  28. user.favouriteWords = [];
  29. }
  30. if (!request.body.wordId) {
  31. response.status(400);
  32. response.send("Missing wordID");
  33. return;
  34. } else if (user.favouriteWords.includes(request.body.wordId)) {
  35. response.status(400);
  36. response.send("WordID already present");
  37. return;
  38. }
  39. const matchedWord = await wordCollection.findOne({
  40. _id: new ObjectId(request.body.wordId)
  41. });
  42. if (!matchedWord) {
  43. response.status(400);
  44. response.send("Word not present in the library");
  45. return;
  46. }
  47. user.favouriteWords.push(request.body.wordId);
  48. const updatedUser = await userCollection.updateOne({
  49. _id: new ObjectId(user._id)
  50. }, {
  51. $set: {
  52. favouriteWords: user.favouriteWords
  53. }
  54. });
  55. if (updatedUser.acknowledged) {
  56. response.sendStatus(200);
  57. } else {
  58. response.sendStatus(500);
  59. }
  60. return;
  61. });
  62. // Update favourite word
  63. userProfileRoutes.put('/favourite-words/', jwtAuthentication, async (request, response) => {
  64. const user: MongoUser = (request.user as any);
  65. const userCollection = getDatabaseClient().db(DB_NAME).collection<MongoUser>('users');
  66. if (!request.body.favouriteWords) {
  67. response.status(400);
  68. response.send("Missing favouriteWords param");
  69. return;
  70. }
  71. const updatedUser = await userCollection.updateOne({
  72. _id: new ObjectId(user._id)
  73. }, {
  74. $set: {
  75. favouriteWords: request.body.favouriteWords
  76. }
  77. });
  78. if (updatedUser.acknowledged) {
  79. response.sendStatus(200);
  80. } else {
  81. response.sendStatus(500);
  82. }
  83. return;
  84. });