From 888351baac53d95082159ca1eacf0919426cac0f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Tue, 6 Jan 2026 22:03:49 +0100 Subject: [PATCH] lepsi podpora strankovani, bugfixing, vyhledavani --- requirements.txt | 2 +- src/endpoints/registration.py | 1 - src/graphql_schema/context.py | 5 +--- src/graphql_schema/entities/aircraft.py | 6 +++-- src/graphql_schema/entities/flight.py | 4 +++- src/graphql_schema/entities/flight_plan.py | 8 ++++--- .../entities/resolvers/aircraft.py | 23 +++++++++++-------- .../entities/resolvers/flight.py | 8 +++++++ .../entities/resolvers/flight_plan.py | 6 +++++ 9 files changed, 42 insertions(+), 21 deletions(-) diff --git a/requirements.txt b/requirements.txt index f45e55e..779385d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ fastapi==0.115.7 fastapi-jwt[authlib]==0.3.0 -bcrypt +bcrypt==4.2.1 fastapi-mail==1.4.2 strawberry-graphql[fastapi]==0.258.0 diff --git a/src/endpoints/registration.py b/src/endpoints/registration.py index 472395f..50217b3 100644 --- a/src/endpoints/registration.py +++ b/src/endpoints/registration.py @@ -1,7 +1,6 @@ import re from fastapi import HTTPException, BackgroundTasks from sqlalchemy import select -from typing import Optional from pydantic import BaseModel, Field, model_validator from background_jobs.send_email import send_email from database.models import User diff --git a/src/graphql_schema/context.py b/src/graphql_schema/context.py index 027476e..7996003 100644 --- a/src/graphql_schema/context.py +++ b/src/graphql_schema/context.py @@ -4,8 +4,6 @@ from fastapi import BackgroundTasks, Depends, Security from fastapi_jwt import JwtAuthorizationCredentials from sqlalchemy import select from strawberry.fastapi import BaseContext - -from logger import log from database import async_session, models from jwt import access_security @@ -18,12 +16,11 @@ class GraphQLContext(BaseContext): jwt_auth_credentials: JwtAuthorizationCredentials background_tasks: BackgroundTasks + async def setup_graphql_context(credentials: JwtAuthorizationCredentials = Security(access_security)): user_id = credentials['id'] if credentials else None organization_ids = set() - log.error(user_id) - if user_id: async with async_session() as db: organization_ids = set((await db.scalars( diff --git a/src/graphql_schema/entities/aircraft.py b/src/graphql_schema/entities/aircraft.py index d87d7d9..83fda7e 100644 --- a/src/graphql_schema/entities/aircraft.py +++ b/src/graphql_schema/entities/aircraft.py @@ -1,4 +1,5 @@ import strawberry +from strawberry import Info from .helpers.filters import get_filters from .helpers.pagination import PaginationWindow from .resolvers.aircraft import AircraftMutationResolver, AircraftQueryResolver @@ -11,10 +12,11 @@ from ..extensions.field.pagination import OffsetPagination @strawberry.type class AircraftQueries: @strawberry.field(extensions=[OffsetPagination(item_type=Aircraft), AuthenticatedOnly()]) - async def aircrafts(root, info) -> PaginationWindow[Aircraft]: + async def aircrafts(root, info: Info, search: str | None = None) -> PaginationWindow[Aircraft]: return AircraftQueryResolver().get_query( info.context.user_id, - organization_ids=info.context.organization_ids + organization_ids=info.context.organization_ids, + search=search ) @strawberry.field(extensions=[AllowPublicAccess()]) diff --git a/src/graphql_schema/entities/flight.py b/src/graphql_schema/entities/flight.py index 6c9bab7..b73c71f 100644 --- a/src/graphql_schema/entities/flight.py +++ b/src/graphql_schema/entities/flight.py @@ -15,6 +15,7 @@ class FlightQueries: async def flights( root, info, username: str | None = None, + search: str | None = None, event_id: int | None = None, public: bool | None = False, copilot_id: int | None = None, @@ -28,7 +29,8 @@ class FlightQueries: only_public=public, copilot_id=copilot_id, aircraft_id=aircraft_id, - point_of_interest_id=point_of_interest_id + point_of_interest_id=point_of_interest_id, + search=search ) @strawberry.field(extensions=[AllowPublicAccess()]) diff --git a/src/graphql_schema/entities/flight_plan.py b/src/graphql_schema/entities/flight_plan.py index 851bbf4..408ec0a 100644 --- a/src/graphql_schema/entities/flight_plan.py +++ b/src/graphql_schema/entities/flight_plan.py @@ -1,17 +1,19 @@ import strawberry from strawberry.types import Info from graphql_schema.entities.helpers.filters import get_detail_filters +from graphql_schema.entities.helpers.pagination import PaginationWindow from graphql_schema.entities.resolvers.flight_plan import FlightPlanMutationResolver, FlightPlanQueryResolver from graphql_schema.entities.types.mutation_input import CreateFlightPlanInput, EditFlightPlanInput from graphql_schema.entities.types.types import FlightPlan from graphql_schema.extensions.field.auth import AuthenticatedOnly, AllowPublicAccess +from graphql_schema.extensions.field.pagination import OffsetPagination @strawberry.type class FlightPlanQueries: - @strawberry.field(extensions=[AuthenticatedOnly()]) - async def flight_plans(root, info: Info) -> list[FlightPlan]: - return await FlightPlanQueryResolver().get_list(info.context.user_id) + @strawberry.field(extensions=[OffsetPagination(item_type=FlightPlan), AuthenticatedOnly()]) + async def flight_plans(root, info: Info, search: str | None = None) -> PaginationWindow[FlightPlan]: + return FlightPlanQueryResolver().get_query(info.context.user_id, search=search) @strawberry.field(extensions=[AllowPublicAccess()]) async def flight_plan( diff --git a/src/graphql_schema/entities/resolvers/aircraft.py b/src/graphql_schema/entities/resolvers/aircraft.py index a7c6db3..af5e210 100644 --- a/src/graphql_schema/entities/resolvers/aircraft.py +++ b/src/graphql_schema/entities/resolvers/aircraft.py @@ -1,6 +1,4 @@ -from operator import or_ -from typing import Set, Optional -from sqlalchemy import and_ +from sqlalchemy import and_, or_ from database import models from database.transaction import get_session from graphql_schema.context import GraphQLContext @@ -19,26 +17,33 @@ class AircraftQueryResolver(BaseQueryResolver): user_id: int | None = None, object_id: int | None = None, order_by: list | None = None, - organization_ids: Optional[Set[int]] = None, + organization_ids: set[int] | None = None, *args, **kwargs, ): filters = [] - search = {} if kwargs.get("call_sign"): filters.append(models.Aircraft.call_sign == kwargs['call_sign']) - if kwargs.get("search"): - search['search'] = kwargs.pop("search", None) - query = super().get_query( object_id=object_id, only_my=False, only_public=kwargs.get("only_public", False), order_by=order_by, filters=filters, - **search ) + + if kwargs.get("search"): + search = kwargs["search"] + query = query.filter( + or_( + models.Aircraft.call_sign.contains(search), + models.Aircraft.manufacturer.contains(search), + models.Aircraft.model.contains(search), + ) + + ) + if organization_ids: query = ( query.filter( diff --git a/src/graphql_schema/entities/resolvers/flight.py b/src/graphql_schema/entities/resolvers/flight.py index 35921af..d0f8f55 100644 --- a/src/graphql_schema/entities/resolvers/flight.py +++ b/src/graphql_schema/entities/resolvers/flight.py @@ -70,6 +70,14 @@ class FlightQueryResolver(BaseQueryResolver): ) ) + if kwargs.get("search"): + search = kwargs["search"] + query = ( + query.filter( + models.Flight.name.contains(search) + ) + ) + if kwargs.get('username'): query = ( query.join(models.Flight.created_by) diff --git a/src/graphql_schema/entities/resolvers/flight_plan.py b/src/graphql_schema/entities/resolvers/flight_plan.py index 38c34af..cda7d3f 100644 --- a/src/graphql_schema/entities/resolvers/flight_plan.py +++ b/src/graphql_schema/entities/resolvers/flight_plan.py @@ -42,6 +42,12 @@ class FlightPlanQueryResolver(BaseQueryResolver): .filter(models.User.public_username == kwargs['username']) ) + if kwargs.get("search"): + search = kwargs["search"] + query = ( + query.filter(models.FlightPlan.name.contains(search)) + ) + return query