Skip to content

Commit

Permalink
Agregar y eliminar de favoritos
Browse files Browse the repository at this point in the history
  • Loading branch information
MauroBrandan committed Aug 27, 2021
1 parent 45a14a9 commit 0229061
Show file tree
Hide file tree
Showing 3 changed files with 112 additions and 10 deletions.
35 changes: 35 additions & 0 deletions src/frontend/actions/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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))
}
}
21 changes: 12 additions & 9 deletions src/frontend/components/CarouselItem.jsx
Original file line number Diff line number Diff line change
@@ -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'
Expand All @@ -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,
Expand All @@ -31,8 +34,8 @@ const CarouselItem = (props) => {
})
}

const handleDeleteFavorite = (itemId) => {
deleteFavorite(itemId)
const handleDeleteFavorite = (userMovieId, id) => {
deleteUserMovie(userMovieId, id)
}

return (
Expand All @@ -53,7 +56,7 @@ const CarouselItem = (props) => {
src={removeIcon}
alt='Eliminar'
className='carousel-item__details--icon'
onClick={() => handleDeleteFavorite(id)}
onClick={() => handleDeleteFavorite(userMovieId, id)}
/>
) : (
<img
Expand All @@ -74,8 +77,8 @@ const CarouselItem = (props) => {
}

const mapDispatchToProps = {
setFavorite,
deleteFavorite,
addUserMovie,
deleteUserMovie,
}

export default connect(null, mapDispatchToProps)(CarouselItem)
66 changes: 65 additions & 1 deletion src/server/server.js
Original file line number Diff line number Diff line change
Expand Up @@ -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),
}
Expand Down Expand Up @@ -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) => {
Expand Down

0 comments on commit 0229061

Please sign in to comment.