From 383607c7cfdb797f84b414295eb347fe809097ae Mon Sep 17 00:00:00 2001 From: Robbie Antenesse Date: Wed, 26 Aug 2020 00:23:13 -0600 Subject: [PATCH] Correctly format & return shelf values --- server/controllers/bookReference.js | 8 +- server/controllers/shelf.js | 106 +++++++++++++++++-------- server/routes/shelf.js | 5 +- server/sequelize/associations/Shelf.js | 5 -- 4 files changed, 79 insertions(+), 45 deletions(-) diff --git a/server/controllers/bookReference.js b/server/controllers/bookReference.js index 2950c17..ca1a5de 100644 --- a/server/controllers/bookReference.js +++ b/server/controllers/bookReference.js @@ -1,5 +1,4 @@ const Inventaire = require('./bookData/Inventaire'); -const SearchController = require('./search'); class BookReferenceController { constructor(sequelizeModels, language) { @@ -32,9 +31,10 @@ class BookReferenceController { } async createOrUpdateReference(source, sourceId, skipSearchBySourceCodes = false) { - const searchController = new SearchController(this.models); + const SearchController = require('./search'); + const search = new SearchController(this.models); if (!skipSearchBySourceCodes) { - const existingReferences = await searchController.searchReferencesBySourceCodes(source, [sourceId]); + const existingReferences = await search.searchReferencesBySourceCodes(source, [sourceId]); if (existingReferences.length > 0) { return existingReferences[0]; @@ -58,7 +58,7 @@ class BookReferenceController { if (typeof bookData.sources[0].uri !== 'undefined') { // Check for references by exact name and author from source - const matchingReferences = await searchController.searchReferencesForExactMatch(bookData.name, bookData.description); + const matchingReferences = await search.searchReferencesForExactMatch(bookData.name, bookData.description); if (matchingReferences.length > 0) { // If a match is found, update the sources of reference in the database and return it. diff --git a/server/controllers/shelf.js b/server/controllers/shelf.js index 34907ea..f057ed3 100644 --- a/server/controllers/shelf.js +++ b/server/controllers/shelf.js @@ -1,4 +1,6 @@ const fetch = require('node-fetch'); +const { Op, fn, col } = require('sequelize'); + const BookReferenceController = require('./bookReference'); class ShelfController { @@ -126,9 +128,60 @@ class ShelfController { }; } - return this.getFakeShelf(); + // REMINDER: Factor in privacy levels - const shelf = await this.shelfModel.findByPk(shelfId); + const shelf = await this.models.Shelf.findByPk(shelfId, { + include: [ + { + as: 'User', + model: this.models.User, + attributes: ['id', 'username', 'displayName'], + required: true, + }, + { + as: 'ShelfItems', + model: this.models.ShelfItem, + attributes: [ + 'id', + 'bookEdition', + 'order' + ], + required: false, + include: [ + { + as: 'Statuses', + model: this.models.Status, + attributes: ['id', 'text', 'progress', 'createdAt', 'updatedAt'], + required: false, + }, + { + as: 'BookReference', + model: this.models.BookReference, + attributes: ['id', 'name', 'description', 'sources', 'covers'], + required: true, + }, + ], + orderBy: [[col('ShelfItems.order'), 'ASC']], + }, + ], + attributes: [ + [col('Shelf.id'), 'id'], + 'name', + 'userId', + 'permissionLevel', + 'isDeletable', + 'createdAt', + 'updatedAt', + [fn('COUNT', col('ShelfItems.id')), 'numShelfItems'], + ], + group: [ + col('Shelf.id'), + col('User.id'), + col('ShelfItems.id'), + col('ShelfItems->Statuses.id'), + col('ShelfItems->BookReference.id'), + ], + }); if (shelf === null) { return { error: `Shelf with ID ${shelfId} not found.`, @@ -136,6 +189,8 @@ class ShelfController { } shelf.updatedAt = this.getLastUpdatedTimestamp(shelf); + shelf.isPublic = shelf.permissionLevel === 0; + return shelf; } @@ -198,7 +253,7 @@ class ShelfController { async scrubShelfData (shelf, currentUser) { const userOwnsShelf = currentUser.id === shelf.userId; - const shelfUser = userOwnsShelf ? null : await shelf.getUser({ attributes: ['username, displayName'] }); + const shelfUser = userOwnsShelf ? null : shelf.User; let user = {}; if (shelfUser !== null) { user.name = shelfUser.displayName; @@ -206,40 +261,25 @@ class ShelfController { } else { user = null; } - const rawShelfItems = await shelf.getShelfItems({ - attributes: ['bookId', 'createdAt', 'updatedAt'], - order: [['order', 'ASC']], - }) - const bookReferenceMap = await Promise.all(shelfItems.map(shelfItem => { - return shelfItem.getBookReference({ - attributes: ['name', 'description', 'sources', 'covers'], - }); - })); - const bookReferenceStatuses = await Promise.all(bookReferenceMap.map(bookReference => { - return bookReference.getStatuses({ + + // Untested + const shelfItems = await Promise.all(shelf.ShelfItems.map(async (shelfItem) => { + const bookReference = BookReferenceController.formatReferenceSources(shelfItem.BookReference); + const reviews = await bookReference.getInteractions({ where: { userId: shelf.userId, - }, - order: [['updatedAt', 'DESC']], + }, // Return all reviews for any bookEdition so they can be filtered on frontend. + attributes: ['text', 'rating', 'bookEdition'], }); + return { + title: bookReference.name, + author: bookReference.description, + sources: bookReference.sources, + covers: bookReference.covers, + updates: shelfItem.Statuses, + reviews, + }; })); - const bookReferences = bookReferenceMap.map(bookReference => { - bookReference.updates = bookReferenceStatuses.findAll(status => status.type === 1); - bookReference.rating = bookReferenceStatuses.find(status => status.type === 3); - bookReference.review = bookReferenceStatuses.find(status => status.type === 4); - return bookReference; - }); - const shelfItems = rawShelfItems.map(shelfItem => { - const bookReference = bookReferences.find(bookData => bookData.id === shelfItem.bookId); - shelfItem.title = bookReference.name; - shelfItem.author = bookReference.description; - shelfItem.sources = bookReference.sources; - shelfItem.covers = bookReference.covers; - shelfItem.updates = bookReference.updates; - shelfItem.rating = bookReference.rating.data; - shelfItem.review = bookReference.review.data; - return shelfItem; - }) const shelfData = { name: shelf.name, diff --git a/server/routes/shelf.js b/server/routes/shelf.js index ddb541b..448626f 100644 --- a/server/routes/shelf.js +++ b/server/routes/shelf.js @@ -62,9 +62,8 @@ async function routes(fastify, options) { }); } - // const shelfData = await shelfController.scrubShelfData(shelf, request.user); - // return reply.send(shelfData); - return reply.send(shelf); + const shelfData = await shelfController.scrubShelfData(shelf, request.user); + return reply.send(shelfData); }); fastify.post('/api/shelf/create', async (request, reply) => { diff --git a/server/sequelize/associations/Shelf.js b/server/sequelize/associations/Shelf.js index 5c2e503..6f49bd9 100644 --- a/server/sequelize/associations/Shelf.js +++ b/server/sequelize/associations/Shelf.js @@ -16,11 +16,6 @@ module.exports = models => { onDelete: 'SET NULL', }); - Shelf.belongsTo(User, { - foreignKey: 'permissionLevel', - onDelete: 'CASCADE', - }); - Shelf.hasMany(ShelfItem, { foreignKey: 'shelfId', });