async def update_article_by_slug( article_update: ArticleInUpdate = Body(..., embed=True, alias="article"), current_article: Article = Depends(get_article_by_slug_from_path), articles_repo: ArticlesRepository = Depends( get_repository(ArticlesRepository)), ) -> ArticleInResponse: slug = get_slug_for_article( article_update.title) if article_update.title else None article = await articles_repo.update_article(article=current_article, slug=slug, **article_update.dict()) return ArticleInResponse(article=ArticleForResponse.from_orm(article))
async def get_articles_for_user_feed( limit: int = Query(DEFAULT_ARTICLES_LIMIT, ge=1), offset: int = Query(DEFAULT_ARTICLES_OFFSET, ge=0), user: User = Depends(get_current_user_authorizer()), articles_repo: ArticlesRepository = Depends(get_repository(ArticlesRepository)), ) -> ListOfArticlesInResponse: articles = await articles_repo.get_articles_for_user_feed( user=user, limit=limit, offset=offset ) articles_for_response = [ ArticleForResponse(**article.dict()) for article in articles ] return ListOfArticlesInResponse( articles=articles_for_response, articles_count=len(articles), )
async def remove_article_from_favorites( article: Article = Depends(get_article_by_slug_from_path), user: User = Depends(get_current_user_authorizer()), articles_repo: ArticlesRepository = Depends( get_repository(ArticlesRepository)), ) -> ArticleInResponse: if article.favorited: await articles_repo.remove_article_from_favorites(article=article, user=user) return ArticleInResponse(article=ArticleForResponse.from_orm( article.copy(update={ "favorited": False, "favorites_count": article.favorites_count - 1, }, ), ), ) raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=strings.ARTICLE_IS_NOT_FAVORITED, )
async def create_new_article( article_create: ArticleInCreate = Body(..., embed=True, alias="article"), user: User = Depends(get_current_user_authorizer()), articles_repo: ArticlesRepository = Depends( get_repository(ArticlesRepository)), ) -> ArticleInResponse: slug = get_slug_for_article(article_create.title) if await check_article_exists(articles_repo, slug): raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=strings.ARTICLE_ALREADY_EXISTS, ) article = await articles_repo.create_article( slug=slug, title=article_create.title, description=article_create.description, body=article_create.body, author=user, tags=article_create.tags, ) return ArticleInResponse(article=ArticleForResponse.from_orm(article))
async def list_articles( articles_filters: ArticlesFilters = Depends(get_articles_filters), user: Optional[User] = Depends( get_current_user_authorizer(required=False)), articles_repo: ArticlesRepository = Depends( get_repository(ArticlesRepository)), ) -> ListOfArticlesInResponse: articles = await articles_repo.filter_articles( tag=articles_filters.tag, author=articles_filters.author, favorited=articles_filters.favorited, limit=articles_filters.limit, offset=articles_filters.offset, requested_user=user, ) articles_for_response = [ ArticleForResponse.from_orm(article) for article in articles ] return ListOfArticlesInResponse( articles=articles_for_response, articles_count=len(articles), )
async def mark_article_as_favorite( article: Article = Depends(get_article_by_slug_from_path), user: User = Depends(get_current_user_authorizer()), articles_repo: ArticlesRepository = Depends(get_repository(ArticlesRepository)), ) -> ArticleInResponse: if not article.favorited: await articles_repo.add_article_into_favorites(article=article, user=user) return ArticleInResponse( article=ArticleForResponse.from_orm( article.copy( update={ "favorited": True, "favorites_count": article.favorites_count + 1, } ) ) ) raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail=strings.ARTICLE_IS_ALREADY_FAVORITED, )
async def retrieve_article_by_slug( article: Article = Depends(get_article_by_slug_from_path), ) -> ArticleInResponse: return ArticleInResponse(article=ArticleForResponse.from_orm(article))