def return_rental(parser): # This shouldn't happen if not g.user: return IkiruJsonResponse(message='Unable to validate user.', status_code=401) args = parser.parse_args() rental = Rental.get_by_uuid(args['rental_uuid']) if not rental or rental.user.uuid != g.user.uuid: return IkiruJsonResponse(message='Invalid rental identifier.', status_code=404) if rental.was_returned(): return IkiruJsonResponse(message='Rental already returned.', status_code=Status.UNPROCESSABLE_ENTITY) # Faulty logic but should work as a proof of concept try: rental.date_returned = datetime.utcnow() db.session.commit() except SQLAlchemyError as e: return IkiruJsonResponse(message=e._message(), status_code=500) return IkiruJsonResponse({"cost": formatted_cost(rental.date_rented)}, 'Rental returned successfully.')
def get_movie_by_uuid(uuid): movie = Movie.get_by_uuid(uuid) if movie is None: return IkiruJsonResponse(message='Movie does not exist.', status_code=404) m = movie.as_dict() m['genres'] = [g.name for g in movie.genres] return IkiruJsonResponse(m)
def get_user_rentals(uuid): user = g.user or User.get_by_uuid(uuid) if user is None: return IkiruJsonResponse(message='User does not exist.', status_code=404) return IkiruJsonResponse({ 'active_rentals': user.get_active_rentals(), 'past_rentals': user.get_past_rentals() })
def create_user(parser): args = parser.parse_args() user = User(**args) db.session.add(user) try: db.session.commit() except sqlalchemy.exc.IntegrityError as e: return IkiruJsonResponse(None, 'Username already exists.', Status.CONFLICT) db.session.refresh(user) return IkiruJsonResponse(user, 'User created successfully.')
def rent_movie(parser): args = parser.parse_args() movie = Movie.get_by_uuid(args['movie_uuid']) if movie is None: return IkiruJsonResponse(message='Invalid movie identifier', status_code=404) rental = Rental(user_id=g.user.id, movie_id=movie.id) db.session.add(rental) db.session.commit() db.session.refresh(rental) return IkiruJsonResponse( payload=rental, message=f'Movie `{movie.title}` rented successfully.')
def create_movie(parser): args = parser.parse_args() args['release_date'] = datetime.datetime(year=args['release_date'], month=1, day=1) movie = Movie(**args) db.session.add(movie) try: db.session.commit() except IntegrityError as e: return IkiruJsonResponse(None, 'Movie already exists.', Status.CONFLICT) db.session.refresh(movie) return IkiruJsonResponse(movie, 'Movie created successfully.')
def post(self): """ Check token validity.""" jwt = get_raw_jwt() return IkiruJsonResponse({ 'user': g.user, 'date_expires': datetime.utcfromtimestamp(jwt['exp']) })
def get_movies(): args = get_movies_parser.parse_args() page = args.get('page') page_size = args.get('page_size', None) if not page_size: app = current_app._get_current_object() page_size = page_size or app.config.get('PAGINATION_DEFAULT_SIZE', None) or 100 return IkiruJsonResponse( payload=Movie.query.paginate(page, page_size, False).items)
def site_index(): output = [] for rule in current_app.url_map.iter_rules(): options = {} for arg in rule.arguments: options[arg] = "[{0}]".format(arg) url = rule.rule # urllib.parse.unquote(url_for(rule.endpoint, **options)) for method in rule.methods: # ToDo: Dynamically insert docstrings from the endpoints output.append(f'{method} {url}') # = repr(rule) return IkiruJsonResponse(sorted(output))
def get_cost(rental_uuid): rental = Rental.get_by_uuid(rental_uuid) if not rental or rental.user.uuid != g.user.uuid: return IkiruJsonResponse(message='Invalid rental identifier.', status_code=404) return IkiruJsonResponse({"cost": formatted_cost(rental.date_rented)})
def get_genre_movies(genre_uuid): genre = Genre.get_by_uuid(genre_uuid) if not genre: return IkiruJsonResponse(None, 'Invalid genre uuid.', 404) return IkiruJsonResponse(genre.movies)
def auth_error(): return IkiruJsonResponse(message='Incorrect credentials.', status_code=401)
def get_user_by_uuid(uuid): user = g.user or User.get_by_uuid(uuid) if user is None: return IkiruJsonResponse(message='User does not exist.', status_code=404) return IkiruJsonResponse(user)
def get_active_user(): user = g.user if user is None: return IkiruJsonResponse(message='User does not exist.', status_code=404) return IkiruJsonResponse(user)
def post(self): """Get bearer token via simple auth.""" payload = {'user': g.user, 'token': create_access_token(g.user.id)} return IkiruJsonResponse(payload, 'Access token created successfully.')
def handle_generic(e): traceback.print_exception(type(e), e, e.__traceback__) if isinstance(e, exceptions.HTTPException): return IkiruJsonResponse(message=e.description, status_code=e.code)
def get_movie_rentals(uuid): movie = Movie.get_by_uuid(uuid) if movie is None: return IkiruJsonResponse(message='Movie does not exist.', status_code=404) return IkiruJsonResponse(movie.rentals)
def get_genres(): return IkiruJsonResponse(Genre.query.all())