|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- import express from 'express';
- import passport from 'passport';
- import { MongoShelf, MongoShelfWord } from '../models/shelf';
- import { DB_NAME, getDatabaseClient } from '../db-utils';
- import { MongoCategory } from '../models/category';
- import { MongoUser } from '../models/user';
- import { ObjectId } from 'bson';
- import { RecollectionHistory } from '../models/recollection-history';
-
- export const recollectionRoutes = express.Router();
-
- export const jwtAuthentication = passport.authenticate('jwt', { session: false });
-
- recollectionRoutes.get('/questions/', jwtAuthentication, async (request, response) => {
- const user: MongoUser = (request.user as any);
-
- const shelfCollection = getDatabaseClient().db(DB_NAME).collection<MongoShelf>('shelves');
- const categoryCollection = getDatabaseClient().db(DB_NAME).collection<MongoCategory>('categories');
-
- if (!user.categories || user.categories.length === 0) {
- response.status(400);
- response.send("No categories found");
- return;
- }
-
- let categoryIds: Array<ObjectId> = user.categories.map(id => new ObjectId(id));
-
- const categoryDetails = await categoryCollection.find({
- _id: { $in : categoryIds }
- }).toArray();
-
-
- const shelfIds: Array<ObjectId> = [];
-
- for (let i = 0; i < categoryDetails.length; i += 1) {
- if (categoryDetails[i].shelves) {
-
- for (let j = 0; j < categoryDetails[i].shelves.length; j += 1) {
- shelfIds.push(new ObjectId(categoryDetails[i].shelves[j]));
- }
- }
- }
-
- const shelfDetails: any = await shelfCollection.find({
- _id: { $in : shelfIds }
- }).toArray();
-
- if (!shelfDetails || shelfDetails.length === 0) {
- response.status(400);
- response.send("No shelves found");
- return;
- }
-
- interface WordWithShelfId extends MongoShelfWord {
- shelfId: string
- }
-
- const allWords: Array<WordWithShelfId> = [];
-
- for (let i = 0; i < shelfDetails.length; i += 1) {
- if (shelfDetails[i].words) {
- for (let j = 0; j < shelfDetails[i].words.length; j += 1) {
- allWords.push({
- ...shelfDetails[i].words[j],
- shelfId: shelfDetails[i]._id
- });
- }
- }
- }
-
- if (allWords.length === 0) {
- response.status(400);
- response.send("No words found");
- return;
- }
-
- const recollectionWords: Array<MongoShelfWord> = [];
-
- allWords.forEach(word => {
- return new Date(word.nextRevisionDateTime) < new Date() ? recollectionWords.push(word): null;
- });
-
- response.status(200);
- response.json(recollectionWords);
-
-
- return;
- });
-
-
- recollectionRoutes.post('/success/', jwtAuthentication, async (request, response) => {
- const shelfCollection = getDatabaseClient().db(DB_NAME).collection<MongoShelf>('shelves');
- const recollectionHistoryCollection = getDatabaseClient().db(DB_NAME).collection<RecollectionHistory>('recollection-history');
-
-
- if (!request.body.shelfId || !request.body.wordId) {
- response.status(400);
- response.send("Missing params shelfId or wordId");
- return;
- }
-
-
- const matchedShelf = await shelfCollection.findOne({
- _id: new ObjectId(request.body.shelfId)
- });
-
- if (matchedShelf) {
- const matchedWord = matchedShelf.words.find((word) => {
- return word.word === request.body.wordId;
- });
-
- matchedWord.spaceBetweenRecall *= 2;
- let now = new Date();
- matchedWord.nextRevisionDateTime = new Date(now.setDate(now.getDate() + matchedWord.spaceBetweenRecall));
-
- response.status(200);
- response.send(matchedWord);
- } else {
- response.status(400);
- response.send("Unmatched Shelf");
- }
-
- return;
- });
|