diff --git a/backend/app/controllers/favorites_controllers.js b/backend/app/controllers/favorites_controllers.js new file mode 100644 index 0000000..71f23a2 --- /dev/null +++ b/backend/app/controllers/favorites_controllers.js @@ -0,0 +1,83 @@ +const { Favorite } = require('./models'); +const { User } = require('./models'); + +module.exports = { + addFavorite(req, res) { + const { username } = req.body; + const { userId } = req.user; + + // Validate both user IDs exist + try { + User.findOne({ where: { username } }) + .then(user => { + if (!user || !userId) { + return res.status(400).json({ error: 'Invalid user ID' }); + } + + // Check if an entry in the Favorites table already exists + Favorite.findOne({ where: { user: userId, favorite: username } }) + .then(existingFavorite => { + if (existingFavorite) { + return res.status(400).json({ error: 'Favorite already exists' }); + } + + // Create a Favorites entry with user as the userId from the JWT, and the favorite as the request body + Favorite.create({ user: userId, favorite: username }) + .then(() => { + // Return a 200 OK response + res.status(200).json({ message: 'Favorite created successfully' }); + }) + .catch(error => { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + }); + }) + .catch(error => { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + }); + }) + .catch(error => { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + }); + } catch (error) { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + } + }, + + removeFavorite(req, res) { + const { username } = req.body; + const { userId } = req.user; + + // Validate both user IDs exist + try { + Favorite.findOne({ where: { user: userId, favorite: username } }) + .then(favorite => { + if (!favorite) { + return res.status(400).json({ error: 'Favorite does not exist' }); + } + + // Remove the entry from the database + favorite.destroy() + .then(() => { + // Return a 200 OK response + res.status(200).json({ message: 'Favorite removed successfully' }); + }) + .catch(error => { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + }); + }) + .catch(error => { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + }); + } catch (error) { + console.error(error); + res.status(500).json({ error: 'Internal Server Error' }); + } + } + +} \ No newline at end of file diff --git a/backend/app/middleware/authentication.js b/backend/app/middleware/authentication.js new file mode 100644 index 0000000..20107f1 --- /dev/null +++ b/backend/app/middleware/authentication.js @@ -0,0 +1,23 @@ +const jwt = require('jsonwebtoken'); + +function authenticateToken(res,req,next) { + const authHeader = req.headers['authorization']; + const token = authHeader && authHeader.split(' ')[1]; + + if(!token) { + return res.sendStatus(401); // Unauthorized + } + + jwt.verify(token, 'YOUR_SECRET_KEY', (err, user) => { + if (err) { + return res.sendStatus(401); // Unauthorized + } + req.user = user; + next(); + }); + } + + module.exports = { + authenticateToken + +}; \ No newline at end of file diff --git a/backend/app/models/favorites_model.js b/backend/app/models/favorites_model.js new file mode 100644 index 0000000..f97df5c --- /dev/null +++ b/backend/app/models/favorites_model.js @@ -0,0 +1,16 @@ +module.exports = (sequelize, Sequelize) => { + const Favorite = sequelize.define('Favorite', { + id: { + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.DataTypes.UUIDV4 + }, + user: { + type: Sequelize.DataTypes.UUID + }, + favorite: { + type: Sequelize.DataTypes.UUID + } + + }); +} \ No newline at end of file diff --git a/backend/app/models/user_model.js b/backend/app/models/user_model.js index 42463eb..dcb1f98 100644 --- a/backend/app/models/user_model.js +++ b/backend/app/models/user_model.js @@ -17,6 +17,7 @@ module.exports = (sequelize, Sequelize) => { type: Sequelize.DataTypes.STRING, allowNull: false } + }); return User; diff --git a/backend/app/routes/favorites_route.js b/backend/app/routes/favorites_route.js new file mode 100644 index 0000000..94e685f --- /dev/null +++ b/backend/app/routes/favorites_route.js @@ -0,0 +1,8 @@ +const express = require('express'); +const router = express.Router(); +const { addFavorite, removeFavorite } = require('../controllers/favorites_controllers.js'); + +router.post('/',addFavorite); +router.delete('/',removeFavorite); + +module.exports = router; diff --git a/backend/app/services/favorites_services.js b/backend/app/services/favorites_services.js new file mode 100644 index 0000000..e69de29 diff --git a/backend/migrations/0002-AddFavoritesTable.js b/backend/migrations/0002-AddFavoritesTable.js new file mode 100644 index 0000000..ecfc68b --- /dev/null +++ b/backend/migrations/0002-AddFavoritesTable.js @@ -0,0 +1,39 @@ +'use strict'; + +/** @type {import('sequelize-cli').Migration} */ +module.exports = { + async up (queryInterface, Sequelize) { + /** + * Add altering commands here. + * + * Example: + * await queryInterface.createTable('users', { id: Sequelize.INTEGER }); + */ + await queryInterface.createTable('Favorites', { + id: { + primaryKey: true, + type: Sequelize.DataTypes.UUID, + defaultValue: Sequelize.DataTypes.UUIDV4, + allowNull: false + }, + user: { + type: Sequelize.DataTypes.UUID, + allowNull: false + }, + favorite: { + type: Sequelize.DataTypes.UUID, + allowNull: false + } + }); + }, + + async down (queryInterface, Sequelize) { + /** + * Add reverting commands here. + * + * Example: + * await queryInterface.dropTable('users'); + */ + await queryInterface.dropTable('Favorites'); + } +};