diff --git a/src/frontend/actions/index.js b/src/frontend/actions/index.js index 62581d5..8f4bfd5 100644 --- a/src/frontend/actions/index.js +++ b/src/frontend/actions/index.js @@ -74,3 +74,38 @@ export const loginUser = ({ email, password }, redirectUrl) => { .catch((error) => console.error(error)) } } + +export const addUserMovie = ({ _id, ...movie }) => { + const data = { + movieId: _id, + } + + return (dispatch) => { + axios({ + url: '/user-movies', + method: 'post', + data: data, + }) + .then(() => { + dispatch(setFavorite(movie)) + }) + .catch((error) => console.error(error)) + } +} + +export const deleteUserMovie = (userMovieId, id) => { + if (!userMovieId) { + return (dispatch) => dispatch(deleteFavorite(id)) + } + + return (dispatch) => { + axios({ + url: `/user-movies/${userMovieId}`, + method: 'delete', + }) + .then(() => { + dispatch(deleteFavorite(id)) + }) + .catch((error) => console.error(error)) + } +} diff --git a/src/frontend/components/CarouselItem.jsx b/src/frontend/components/CarouselItem.jsx index 2ed6f11..e65c7f8 100644 --- a/src/frontend/components/CarouselItem.jsx +++ b/src/frontend/components/CarouselItem.jsx @@ -1,7 +1,7 @@ import React from 'react' import { Link } from 'react-router-dom' import { connect } from 'react-redux' -import { setFavorite, deleteFavorite } from '../actions' +import { addUserMovie, deleteUserMovie } from '../actions' import playIcon from '../assets/static/play-icon.png' import plusIcon from '../assets/static/plus-icon.png' @@ -10,19 +10,22 @@ import removeIcon from '../assets/static/remove-icon.png' const CarouselItem = (props) => { const { id, + _id, cover, title, year, contentRating, duration, - setFavorite, - deleteFavorite, + addUserMovie, + deleteUserMovie, + userMovieId, isList, } = props const handleSetFavorite = () => { - setFavorite({ + addUserMovie({ id, + _id, cover, title, year, @@ -31,8 +34,8 @@ const CarouselItem = (props) => { }) } - const handleDeleteFavorite = (itemId) => { - deleteFavorite(itemId) + const handleDeleteFavorite = (userMovieId, id) => { + deleteUserMovie(userMovieId, id) } return ( @@ -53,7 +56,7 @@ const CarouselItem = (props) => { src={removeIcon} alt='Eliminar' className='carousel-item__details--icon' - onClick={() => handleDeleteFavorite(id)} + onClick={() => handleDeleteFavorite(userMovieId, id)} /> ) : ( { } const mapDispatchToProps = { - setFavorite, - deleteFavorite, + addUserMovie, + deleteUserMovie, } export default connect(null, mapDispatchToProps)(CarouselItem) diff --git a/src/server/server.js b/src/server/server.js index ad96c7c..66ad504 100644 --- a/src/server/server.js +++ b/src/server/server.js @@ -68,13 +68,27 @@ const renderApp = async (req, res) => { }) moviesList = moviesList.data.data + let userMoviesList = await axios({ + url: `${API_URL}/api/user-movies/?userId=${id}`, + headers: { Authorization: `Bearer ${token}` }, + method: 'get', + }) + userMoviesList = userMoviesList.data.data + initialState = { user: { email, name, id }, playing: {}, search: [], - mylist: [], + mylist: moviesList.filter(movie => userMoviesList.some( userMovie => movie._id === userMovie.movieId)).map( movie => { + const filteredMovie = userMoviesList.find(userMovie => movie._id === userMovie.movieId) + if (filteredMovie) { + movie.userMovieId = filteredMovie._id + } + return movie + } + ), trends: moviesList.filter(movie => movie.contentRating === 'PG' && movie._id), originals: moviesList.filter(movie => movie.contentRating === 'G' && movie._id), } @@ -190,6 +204,56 @@ app.post('/auth/sign-up', async function (req, res, next) { } }) +app.post('/user-movies', async (req, res, next) => { + try { + const { body: userMovie } = req + const { id, token } = req.cookies + + const { data, status } = await axios({ + url: `${API_URL}/api/user-movies`, + headers: { Authorization: `Bearer ${token}` }, + method: 'post', + data: { + userId: id, + movieId: userMovie.movieId, + } + }) + + const { + data: { movieExist }, + } = data + + if (status !== 200 && status !== 201) { + return next(boom.badImplementation()) + } + + const statusCode = movieExist ? 200 : 201 + + return res.status(statusCode).json(data) + } catch (error) { + next(error) + } +}) + +app.delete('/user-movies/:userMovieId', async (req, res, next) => { + const { userMovieId } = req.params + const { token } = req.cookies + + try { + const response = await axios({ + url: `${API_URL}/api/user-movies/${userMovieId}`, + method: 'DELETE', + headers: { + Authorization: `Bearer ${token}`, + }, + }) + + res.status(200).json(response.data) + } catch (error) { + next(error) + } +}) + app.get('*', renderApp) app.listen(PORT, (err) => {