예제 #1
0
 def resolve_reviews_years(self, info):
     user_id = utils.validate_user_id(request, info.context["secret"])
     reviews = (
         types.Review.get_query(info)
         .filter(models.Review.user_id == user_id)
         .distinct(SA.extract("year", models.Review.created))
         .all()
     )
     return [review.created.year for review in reviews]
예제 #2
0
    def mutate(root, info, book_id):
        user_id = utils.validate_user_id(request, info.context["secret"])

        session = info.context["session"]
        types.Backlog.get_query(info).filter(
            models.Backlog.book_id == book_id).filter(
                models.Backlog.user_id == user_id).delete()
        session.commit()

        return DeleteBacklogEntry(ok=True)
예제 #3
0
    def resolve_backlog(self, info):
        user_id = utils.validate_user_id(request, info.context["secret"])
        session = info.context["session"]

        reviewed_books_ids = (
            session.query(models.Review.book_id).filter(models.Review.user_id == user_id).subquery()
        )
        return (
            types.Backlog.get_query(info)
            .filter(models.Backlog.user_id == user_id)
            .filter(models.Backlog.book_id.notin_(reviewed_books_ids))
            .all()
        )
예제 #4
0
    def mutate(root, info, book_id, comment, value, date=None):
        user_id = utils.validate_user_id(request, info.context["secret"])

        if not date:
            date = datetime.now()

        session = info.context["session"]
        new_review = models.Review(user_id=user_id,
                                   book_id=book_id,
                                   value=value,
                                   comment=comment,
                                   created=date)
        session.add(new_review)
        session.commit()
        return CreateReview(review=new_review)
예제 #5
0
    def mutate(root, info, title, author, cover_url=None, release_date=None):
        _ = utils.validate_user_id(request, info.context["secret"])

        new_book = models.Book(
            title=title,
            author=author,
            release_date=release_date,
            cover_url=cover_url,
            suggestion=True,
        )
        session = info.context["session"]
        session.add(new_book)
        session.commit()

        return CreateBookSuggestion(book=new_book)
예제 #6
0
    def resolve_books_by_title(self, info, title, already_reviewed=False):
        user_id = utils.validate_user_id(request, info.context["secret"])
        session = info.context["session"]

        reviewed_books_ids = (
            session.query(models.Review.book_id).filter(models.Review.user_id == user_id).subquery()
        )
        books_query = (
            types.Book.get_query(info)
            .filter(models.Book.title.ilike(f"%{title}%"))
            .filter(SA.not_(models.Book.suggestion))
        )
        if not already_reviewed:
            books_query = books_query.filter(models.Book.id.notin_(reviewed_books_ids))
        return books_query.limit(SEARCH_LIMIT).all()
예제 #7
0
    def mutate(root, info, book_id):
        user_id = utils.validate_user_id(request, info.context["secret"])

        prev_backlog_entry = (types.Backlog.get_query(info).filter(
            models.Backlog.user_id == user_id).filter(
                models.Backlog.book_id == book_id).first())
        if prev_backlog_entry:
            raise ValueError("Book already in backlog")

        backlog_entry = models.Backlog(user_id=user_id, book_id=book_id)

        session = info.context["session"]
        session.add(backlog_entry)
        session.commit()

        return AddBacklogEntry(ok=True)
예제 #8
0
    def resolve_reviews(self, info, year=None, page=1):
        user_id = utils.validate_user_id(request, info.context["secret"])

        review_query = types.Review.get_query(info).filter(models.Review.user_id == user_id)
        if year:
            review_query = review_query.filter(SA.extract("year", models.Review.created) == year)

        reviews_count = review_query.count()
        page_count = math.ceil(reviews_count / REVIEW_PAGE_SIZE)

        reviews = (
            review_query.order_by(models.Review.created.desc())
            .offset((page - 1) * REVIEW_PAGE_SIZE)
            .limit(REVIEW_PAGE_SIZE)
            .all()
        )
        return {"items": reviews, "page_info": {"total_pages": page_count, "current_page": page}}
예제 #9
0
 def resolve_user(self, info):
     user_id = utils.validate_user_id(request, info.context["secret"])
     return types.User.get_query(info).filter(models.User.id == user_id).first()