Authorization
Kita akan bikin yg bisa hapus data hanya admin
buka mongo db, dan tambahankan isAdmin
Dan kita jg akan membuat nombol New Movie hilang kalau belom login
App.js
import React, {Component} from 'react';
import { Route, Redirect, Switch } from 'react-router-dom';
import { ToastContainer } from 'react-toastify';
import Movies from './components/movies';
import MovieForm from './components/movieForm';
import Rentals from './components/Rentals';
import NotFound from './components/notFound';
import Customers from './components/Customers';
import NavBar from './components/NavBar';
import LoginFrom from './components/LoginForm';
import RegisterForm from './components/RegisterForm';
import Logout from './components/Logout';
import auth from './services/AuthService';
import "react-toastify/dist/ReactToastify";
import './App.css';
class App extends Component {
state = {};
componentDidMount() {
const user = auth.getCurrentUser();
this.setState({ user });
}
render() {
return (
<>
<ToastContainer />
<NavBar user={this.state.user} />
<main className="container">
<Switch>
<Route path="/register" component={RegisterForm} />
<Route path="/login" component={LoginFrom} />
<Route path="/logout" component={Logout} />
<Route path="/movies/:id" component={MovieForm} />
<Route path="/movies"
render={props => <Movies { ...props } user={this.state.user} />}>
</Route>
<Route path="/customers" component={Customers}></Route>
<Route path="/rentals" component={Rentals}></Route>
<Route path="/not-found" component={NotFound}></Route>
<Redirect from="/" exact to="/movies" />
<Redirect to="not-found" />
</Switch>
</main>
</>
);
}
}
export default App;
movies.jsx
import React, {Component} from 'react';
import ListGroup from './Common/listGroup';
import { toast } from 'react-toastify';
import Pagination from './Common/Pagination';
import MoviesTable from './moviesTable';
import { deleteMovie, getMovies } from '../services/MoviesService';
import { getGenres } from '../services/GenreService';
import { paginate } from '../utils/paginate';
import { Link } from 'react-router-dom';
import _ from 'lodash';
import SearchBox from './SearchBox';
class Movies extends Component {
state = {
movies: [],
genres: [],
currentPage: 1,
pageSize: 4,
searchQuery: "",
selectedGenre: null,
sortColumn: { path: "title", order: "asc" }
};
async componentDidMount() {
const { data } = await getGenres();
const genres = [{ _id: "", name: "All Genres" }, ...data];
const { data: movies } = await getMovies();
this.setState({ movies, genres });
}
handleDelete = async movie => {
const originalMovies = this.state.movies;
const movies = originalMovies.filter(m => m._id !== movie._id);
this.setState({ movies });
try {
await deleteMovie(movie._id);
} catch (error) {
if (error.response && error.response.status === 404) {
toast.error('This movie has already been deleted');
this.setState({ movies:originalMovies })
}
}
};
handleLike = movie => {
const movies = [...this.state.movies];
const index = movies.indexOf(movie);
movies[index] = { ...movies[index] };
movies[index].liked = !movies[index].liked;
this.setState({ movies });
};
handlePageChange = page => {
this.setState({ currentPage: page });
};
handleGenreSelect = genre => {
this.setState({ selectedGenre: genre, searchQuery: "", currentPage: 1 });
};
handleSearch = query => {
this.setState({ searchQuery: query, selectedGenre: null, currentPage: 1 });
};
handleSort = sortColumn => {
this.setState({ sortColumn });
};
getPagedData = () => {
const {
pageSize,
currentPage,
sortColumn,
selectedGenre,
searchQuery,
movies: allMovies
} = this.state;
let filtered = allMovies;
if (searchQuery)
filtered = allMovies.filter(m =>
m.title.toLowerCase().startsWith(searchQuery.toLowerCase())
);
else if (selectedGenre && selectedGenre._id)
filtered = allMovies.filter(m => m.genre._id === selectedGenre._id);
const sorted = _.orderBy(filtered, [sortColumn.path], [sortColumn.order]);
const movies = paginate(sorted, currentPage, pageSize);
return { totalCount: filtered.length, data: movies };
};
render() {
const { length: count } = this.state.movies;
const { pageSize, currentPage, sortColumn, searchQuery } = this.state;
const { user } = this.props;
if (count === 0) return <p>There are no movies in the database.</p>;
const { totalCount, data: movies } = this.getPagedData();
return (
<div className="row">
<div className="col-3">
<ListGroup
items={this.state.genres}
selectedItem={this.state.selectedGenre}
onItemSelect={this.handleGenreSelect}
/>
</div>
<div className="col">
{user && (
<Link
to="/movies/new"
className="btn btn-primary"
style={{ marginBottom: 20 }}
>
New Movie
</Link>
)}
<p>Showing {totalCount} movies in the database.</p>
<SearchBox value={searchQuery} onChange={this.handleSearch} />
<MoviesTable
movies={movies}
sortColumn={sortColumn}
onLike={this.handleLike}
onDelete={this.handleDelete}
onSort={this.handleSort}
/>
<Pagination
itemsCount={totalCount}
pageSize={pageSize}
currentPage={currentPage}
onPageChange={this.handlePageChange}
/>
</div>
</div>
);
}
}
export default Movies
Sedang login
Last updated
Was this helpful?