From a7805fe4689f0b3aa5473d6399af46d3494ecd0a Mon Sep 17 00:00:00 2001 From: Kurbanov Bulat Date: Mon, 27 Dec 2021 22:01:00 +0300 Subject: [PATCH] Add random endpoints --- .../app/alembic/versions/08193b547a80_.py | 10 ++++++++++ fastapi_book_server/app/services/common.py | 2 +- fastapi_book_server/app/views/author.py | 11 +++++++++++ fastapi_book_server/app/views/book.py | 10 ++++++++++ fastapi_book_server/app/views/sequence.py | 11 +++++++++++ 5 files changed, 43 insertions(+), 1 deletion(-) diff --git a/fastapi_book_server/app/alembic/versions/08193b547a80_.py b/fastapi_book_server/app/alembic/versions/08193b547a80_.py index 94e3cc1..29762c5 100644 --- a/fastapi_book_server/app/alembic/versions/08193b547a80_.py +++ b/fastapi_book_server/app/alembic/versions/08193b547a80_.py @@ -20,6 +20,11 @@ def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_index(op.f('ix_books_title'), 'books', ['title'], unique=False) op.create_index(op.f('ix_sequences_name'), 'sequences', ['name'], unique=False) + op.create_index(op.f('tgrm_books_title'), 'books', ['title'], postgresql_using='gin', postgresql_ops={'description': 'gin_trgm_ops'}) + op.create_index(op.f('tgrm_sequences_name'), 'sequences', ['name'], postgresql_using='gin', postgresql_ops={'description': 'gin_trgm_ops'}) + op.create_index(op.f('tgrm_authors_lfm'), 'authors', [sa.text("(last_name || ' ' || first_name || ' ' || middle_name)")] ,postgresql_using='gin', postgresql_ops={'description': 'gin_trgm_ops'}) + op.create_index(op.f('tgrm_authors_lf'), 'authors', [sa.text("(last_name || ' ' || first_name)")] ,postgresql_using='gin', postgresql_ops={'description': 'gin_trgm_ops'}) + op.create_index(op.f('tgrm_authors_l'), 'authors', ['last_name'] ,postgresql_using='gin', postgresql_ops={'description': 'gin_trgm_ops'}) # ### end Alembic commands ### @@ -27,4 +32,9 @@ def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_index(op.f('ix_sequences_name'), table_name='sequences') op.drop_index(op.f('ix_books_title'), table_name='books') + op.drop_index(op.f('tgrm_books_title'), table_name='books') + op.drop_index(op.f('tgrm_sequences_name'), table_name='books') + op.drop_index(op.f('tgrm_authors_lfm'), table_name='books') + op.drop_index(op.f('tgrm_authors_lf'), table_name='books') + op.drop_index(op.f('tgrm_authors_l'), table_name='books') # ### end Alembic commands ### diff --git a/fastapi_book_server/app/services/common.py b/fastapi_book_server/app/services/common.py index 7471764..cfe3ca9 100644 --- a/fastapi_book_server/app/services/common.py +++ b/fastapi_book_server/app/services/common.py @@ -19,7 +19,7 @@ class TRGMSearchService(Generic[T]): SELECT_RELATED: Optional[Union[list[str], str]] = None PREFETCH_RELATED: Optional[Union[list[str], str]] = None GET_OBJECT_IDS_QUERY: Optional[str] = None - CACHE_TTL = 5 * 60 + CACHE_TTL = 60 * 60 @classmethod def get_params(cls) -> AbstractParams: diff --git a/fastapi_book_server/app/views/author.py b/fastapi_book_server/app/views/author.py index 22b3728..9169efb 100644 --- a/fastapi_book_server/app/views/author.py +++ b/fastapi_book_server/app/views/author.py @@ -1,3 +1,5 @@ +from random import choice as random_choice + from fastapi import APIRouter, Depends, Request, HTTPException, status from fastapi_pagination import Params @@ -38,6 +40,15 @@ async def create_author(data: CreateAuthor): return await AuthorDB.objects.prefetch_related(PREFETCH_RELATED).get(id=author.id) +@author_router.get("/random", response_model=Author) +async def get_random_author(): + author_ids: list[int] = await AuthorDB.objects.values_list("id", flatten=True) + + author_id = random_choice(author_ids) + + return await AuthorDB.objects.prefetch_related(PREFETCH_RELATED).get(id=author_id) + + @author_router.get("/{id}", response_model=Author) async def get_author(id: int): author = await AuthorDB.objects.prefetch_related(PREFETCH_RELATED).get_or_none(id=id) diff --git a/fastapi_book_server/app/views/book.py b/fastapi_book_server/app/views/book.py index 92f1dcf..7cf8c47 100644 --- a/fastapi_book_server/app/views/book.py +++ b/fastapi_book_server/app/views/book.py @@ -1,4 +1,5 @@ from typing import Union +from random import choice as random_choice from fastapi import APIRouter, Depends, Request, HTTPException, status @@ -38,6 +39,15 @@ async def create_book(data: Union[CreateBook, CreateRemoteBook]): return await BookDB.objects.select_related(SELECT_RELATED_FIELDS).get(id=book.id) +@book_router.get("/random", response_model=BookDetail) +async def get_random_book(): + book_ids: list[int] = await BookDB.objects.filter(is_deleted=False).values_list("id", flatten=True) + + book_id = random_choice(book_ids) + + return await BookDB.objects.select_related(SELECT_RELATED_FIELDS).get(id=book_id) + + @book_router.get("/{id}", response_model=BookDetail) async def get_book(id: int): book = await BookDB.objects.select_related(SELECT_RELATED_FIELDS).get_or_none(id=id) diff --git a/fastapi_book_server/app/views/sequence.py b/fastapi_book_server/app/views/sequence.py index 3cd94b7..03bf71c 100644 --- a/fastapi_book_server/app/views/sequence.py +++ b/fastapi_book_server/app/views/sequence.py @@ -1,3 +1,5 @@ +from random import choice as random_choice + from fastapi import APIRouter, Depends, Request from fastapi_pagination import Params @@ -24,6 +26,15 @@ async def get_sequences(): ) +@sequence_router.get("/random", response_model=Sequence) +async def get_random_sequence(): + sequence_ids: list[int] = await SequenceDB.objects.values_list("id", flatten=True) + + sequence_id = random_choice(sequence_ids) + + return await SequenceDB.objects.get(id=sequence_id) + + @sequence_router.get("/{id}", response_model=Sequence) async def get_sequence(id: int): return await SequenceDB.objects.get(id=id)