| @@ -4,10 +4,10 @@ import passport from 'passport'; | |||||
| import authRoutes from './authentication/routes'; | import authRoutes from './authentication/routes'; | ||||
| import { connectToDatabaseServer } from './db-utils'; | import { connectToDatabaseServer } from './db-utils'; | ||||
| import sendGridMail from '@sendgrid/mail'; | import sendGridMail from '@sendgrid/mail'; | ||||
| import { userProfileRoutes } from './user-profile/routes'; | |||||
| import { userProfileRoutes } from './user-profile/profile-routes'; | |||||
| import { categoryRoutes } from './user-profile/category-routes'; | import { categoryRoutes } from './user-profile/category-routes'; | ||||
| import { shelfRoutes } from './user-profile/shelf-routes'; | import { shelfRoutes } from './user-profile/shelf-routes'; | ||||
| import { wordRoutes } from './user-profile/word-routes'; | |||||
| import { libraryRoutes } from './library/library-routes'; | |||||
| const SENDGRID_API_KEY = process.env.SENDGRID_API_KEY || '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'; | const SENDGRID_API_KEY = process.env.SENDGRID_API_KEY || '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'; | ||||
| @@ -22,7 +22,7 @@ app.use('/auth/', authRoutes); | |||||
| app.use('/user/', userProfileRoutes); | app.use('/user/', userProfileRoutes); | ||||
| app.use('/category/', categoryRoutes); | app.use('/category/', categoryRoutes); | ||||
| app.use('/shelf/', shelfRoutes); | app.use('/shelf/', shelfRoutes); | ||||
| app.use('/library/', wordRoutes); | |||||
| app.use('/library/', libraryRoutes); | |||||
| app.get('/', (request, response) => { | app.get('/', (request, response) => { | ||||
| response.send('Server running @ port' + app.get('port')); | response.send('Server running @ port' + app.get('port')); | ||||
| @@ -3,13 +3,13 @@ import passport from 'passport'; | |||||
| import { DB_NAME, getDatabaseClient } from '../db-utils'; | import { DB_NAME, getDatabaseClient } from '../db-utils'; | ||||
| import { Word } from '../models/word'; | import { Word } from '../models/word'; | ||||
| export const wordRoutes = express.Router(); | |||||
| export const libraryRoutes = express.Router(); | |||||
| export const jwtAuthentication = passport.authenticate('jwt', { session: false }); | export const jwtAuthentication = passport.authenticate('jwt', { session: false }); | ||||
| // Get All Words | // Get All Words | ||||
| wordRoutes.get('/all/', jwtAuthentication, async (request, response) => { | |||||
| libraryRoutes.get('/all/', jwtAuthentication, async (request, response) => { | |||||
| const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | ||||
| const allWords = await wordCollection.find().toArray(); | const allWords = await wordCollection.find().toArray(); | ||||
| @@ -20,7 +20,7 @@ wordRoutes.get('/all/', jwtAuthentication, async (request, response) => { | |||||
| return; | return; | ||||
| }); | }); | ||||
| wordRoutes.get('/search/', jwtAuthentication, async (request, response) => { | |||||
| libraryRoutes.get('/search/', jwtAuthentication, async (request, response) => { | |||||
| const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | ||||
| if (!request.body.name) { | if (!request.body.name) { | ||||
| @@ -39,7 +39,7 @@ wordRoutes.get('/search/', jwtAuthentication, async (request, response) => { | |||||
| return; | return; | ||||
| }); | }); | ||||
| wordRoutes.post('/add/', jwtAuthentication, async (request, response) => { | |||||
| libraryRoutes.post('/add/', jwtAuthentication, async (request, response) => { | |||||
| const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | ||||
| if (!request.body.name || request.body.grammaticalDetails) { | if (!request.body.name || request.body.grammaticalDetails) { | ||||
| @@ -16,7 +16,7 @@ interface AddedWord { | |||||
| isArchived: boolean, | isArchived: boolean, | ||||
| } | } | ||||
| export interface Shelf { | |||||
| interface Shelf { | |||||
| name: string, | name: string, | ||||
| description?: string, | description?: string, | ||||
| viewType: viewPermissionType, | viewType: viewPermissionType, | ||||
| @@ -24,7 +24,7 @@ export interface Shelf { | |||||
| addedWords?: Array<AddedWord> | addedWords?: Array<AddedWord> | ||||
| } | } | ||||
| interface MongoAddedWord extends Omit<AddedWord, "word"> { | |||||
| export interface MongoAddedWord extends Omit<AddedWord, "word"> { | |||||
| word: string, | word: string, | ||||
| } | } | ||||
| @@ -1,10 +1,11 @@ | |||||
| import { ObjectId } from 'bson'; | |||||
| import { ObjectID, ObjectId } from 'bson'; | |||||
| import express from 'express'; | import express from 'express'; | ||||
| import passport from 'passport'; | import passport from 'passport'; | ||||
| import { MongoCategory } from '../models/category'; | import { MongoCategory } from '../models/category'; | ||||
| import { DB_NAME } from '../db-utils'; | import { DB_NAME } from '../db-utils'; | ||||
| import { getDatabaseClient } from '../db-utils'; | import { getDatabaseClient } from '../db-utils'; | ||||
| import { MongoShelf } from '../models/shelf'; | |||||
| import { MongoAddedWord, MongoShelf } from '../models/shelf'; | |||||
| import { Word } from '../models/word'; | |||||
| export const shelfRoutes = express.Router(); | export const shelfRoutes = express.Router(); | ||||
| @@ -97,6 +98,8 @@ shelfRoutes.post('/add/', jwtAuthentication, async (request, response) => { | |||||
| // Update shelf | // Update shelf | ||||
| shelfRoutes.put('/update/', jwtAuthentication, async (request, response) => { | shelfRoutes.put('/update/', jwtAuthentication, async (request, response) => { | ||||
| const shelfCollection = getDatabaseClient().db(DB_NAME).collection<MongoShelf>('shelves'); | const shelfCollection = getDatabaseClient().db(DB_NAME).collection<MongoShelf>('shelves'); | ||||
| const wordCollection = getDatabaseClient().db(DB_NAME).collection<Word>('words'); | |||||
| const updatedAddedWords: Array<MongoAddedWord> = request.body.addedWords ? request.body.addedWords : []; | |||||
| const currentShelf = await shelfCollection.findOne({ | const currentShelf = await shelfCollection.findOne({ | ||||
| _id: new ObjectId(request.body._id) | _id: new ObjectId(request.body._id) | ||||
| @@ -115,6 +118,29 @@ shelfRoutes.put('/update/', jwtAuthentication, async (request, response) => { | |||||
| } | } | ||||
| } | } | ||||
| for (let i = 0; i < updatedAddedWords.length; i += 1) { | |||||
| if (!updatedAddedWords[i].word || !updatedAddedWords[i].isArchived || | |||||
| !updatedAddedWords[i].isFavourite || !updatedAddedWords[i].nextRevisionDateTime || | |||||
| !updatedAddedWords[i].notes || !updatedAddedWords[i].revisionHistory || !updatedAddedWords[i].spaceBetweenRecall) { | |||||
| response.status(400); | |||||
| response.send("Missing key in " + JSON.stringify(updatedAddedWords[i])); | |||||
| return; | |||||
| } | |||||
| const wordId = updatedAddedWords[i].word; | |||||
| const matchedWord = await wordCollection.findOne({ | |||||
| _id: new ObjectId(wordId) | |||||
| }); | |||||
| if (!matchedWord) { | |||||
| response.status(400); | |||||
| response.send("Word with ID " + updatedAddedWords[i] + " is not present in the library" ); | |||||
| return; | |||||
| } | |||||
| } | |||||
| try { | try { | ||||
| await shelfCollection.updateOne({ | await shelfCollection.updateOne({ | ||||
| _id: new ObjectId(request.body._id), | _id: new ObjectId(request.body._id), | ||||
| @@ -122,6 +148,7 @@ shelfRoutes.put('/update/', jwtAuthentication, async (request, response) => { | |||||
| $set: { | $set: { | ||||
| name: request.body.name ? request.body.name : currentShelf.name, | name: request.body.name ? request.body.name : currentShelf.name, | ||||
| description: request.body.description ? request.body.description : currentShelf.description, | description: request.body.description ? request.body.description : currentShelf.description, | ||||
| addedWords: updatedAddedWords, | |||||
| isArchived: request.body.isArchived !== undefined ? request.body.isArchived : currentShelf.isArchived | isArchived: request.body.isArchived !== undefined ? request.body.isArchived : currentShelf.isArchived | ||||
| } | } | ||||
| }); | }); | ||||