From 9781cae85844c5d4c0895d3b4d41258c1404a4d3 Mon Sep 17 00:00:00 2001 From: berkay Date: Thu, 30 Jan 2025 16:56:40 +0300 Subject: [PATCH] events initated first endpoint tested --- .idea/workspace.xml | 45 +- ApiLayers/ApiValidations/Queries/__init__.py | 0 ApiLayers/ApiValidations/Queries/account.py | 0 ApiLayers/ApiValidations/Queries/address.py | 0 .../Response/default_response.py | 10 + .../Database/Mixins/crud_mixin.py | 4 + .../Response/accounts/accounts.py | 28 ++ .../LanguageModels/Response/all_responses.py | 4 +- .../Middleware/token_event_middleware.py | 7 +- ApiLayers/Schemas/identity/identity.py | 8 +- DockerApiServices/EventServiceApi/Dockerfile | 1 - .../authentication/auth/api_events.py | 4 +- Events/AllEvents/authentication/auth/info.py | 4 +- Events/AllEvents/events/__init__.py | 5 +- Events/AllEvents/events/account/__init__.py | 9 - .../events/account/account_records.py | 36 +- Events/AllEvents/events/account/api_events.py | 30 ++ Events/AllEvents/events/account/cluster.py | 11 +- Events/AllEvents/events/account/endpoints.py | 131 ----- .../events/account/function_handlers.py | 469 ++++++++---------- Events/AllEvents/events/account/info.py | 14 + Events/AllEvents/events/account/models.py | 156 ++++-- .../template/template/function_handlers.py | 59 ++- .../validations/validation/api_events.py | 2 +- Events/Engine/abstract_class.py | 10 +- Events/base_request_model.py | 22 + Services/PostgresDb/Models/crud_alchemy.py | 1 + Services/PostgresDb/Models/pagination.py | 4 +- Services/PostgresDb/Models/response.py | 2 +- Services/PostgresDb/how_to.py | 3 + docker-compose-services.yml | 18 +- 31 files changed, 576 insertions(+), 521 deletions(-) create mode 100644 ApiLayers/ApiValidations/Queries/__init__.py create mode 100644 ApiLayers/ApiValidations/Queries/account.py create mode 100644 ApiLayers/ApiValidations/Queries/address.py create mode 100644 ApiLayers/LanguageModels/Response/accounts/accounts.py delete mode 100644 Events/AllEvents/events/account/__init__.py delete mode 100644 Events/AllEvents/events/account/endpoints.py create mode 100644 Events/AllEvents/events/account/info.py diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 2116d7e..1c0969b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -6,37 +6,31 @@ - - - - - - - - - + + + - - - - + + - + + - - - - - - - - + + + + + + + - - + + + + + diff --git a/ApiLayers/ApiValidations/Queries/__init__.py b/ApiLayers/ApiValidations/Queries/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/ApiLayers/ApiValidations/Queries/account.py b/ApiLayers/ApiValidations/Queries/account.py new file mode 100644 index 0000000..e69de29 diff --git a/ApiLayers/ApiValidations/Queries/address.py b/ApiLayers/ApiValidations/Queries/address.py new file mode 100644 index 0000000..e69de29 diff --git a/ApiLayers/ApiValidations/Response/default_response.py b/ApiLayers/ApiValidations/Response/default_response.py index 2f546b8..60ff6ee 100644 --- a/ApiLayers/ApiValidations/Response/default_response.py +++ b/ApiLayers/ApiValidations/Response/default_response.py @@ -8,6 +8,7 @@ from ApiLayers.LanguageModels.set_defaults.static_validation_retriever import ( class BaseEndpointResponse(StaticValidationRetriever): + __abstract__ = True pass @@ -20,6 +21,15 @@ class EndpointSuccessResponse(BaseEndpointResponse): # 200 OK ) +class EndpointSuccessListResponse(BaseEndpointResponse): # 200 OK + + def as_dict(self, data: Optional[dict] = None, pagination: Optional[dict] = None): + return JSONResponse( + status_code=status.HTTP_200_OK, + content=dict(completed=True, **self.response, lang=self.lang, pagination=pagination, data=data), + ) + + class EndpointCreatedResponse(BaseEndpointResponse): # 201 Created def as_dict(self, data: Optional[dict] = None): diff --git a/ApiLayers/LanguageModels/Database/Mixins/crud_mixin.py b/ApiLayers/LanguageModels/Database/Mixins/crud_mixin.py index dcbfa84..ea435ed 100644 --- a/ApiLayers/LanguageModels/Database/Mixins/crud_mixin.py +++ b/ApiLayers/LanguageModels/Database/Mixins/crud_mixin.py @@ -18,6 +18,8 @@ CrudCollectionLanguageModel = dict( "active": "Aktif", "is_notification_send": "Bildirim Gönderildi", "is_email_send": "E-posta Gönderildi", + "expiry_ends": "Bitiş Tarihi", + "expiry_starts": "Başlangıç Tarihi", }, en={ "id": "Identity", @@ -38,5 +40,7 @@ CrudCollectionLanguageModel = dict( "active": "Active", "is_notification_send": "Notification Sent", "is_email_send": "Email Sent", + "expiry_ends": "Expiration End", + "expiry_starts": "Expiration Start", }, ) diff --git a/ApiLayers/LanguageModels/Response/accounts/accounts.py b/ApiLayers/LanguageModels/Response/accounts/accounts.py new file mode 100644 index 0000000..8c46c07 --- /dev/null +++ b/ApiLayers/LanguageModels/Response/accounts/accounts.py @@ -0,0 +1,28 @@ + + +accountResponses = { + "ACCOUNTS_LIST": { + "tr": { + "message": "Hesap Bilgileri gönderilen sorgu ve filtreleme seçeneklerine göre başarılı bir şekilde listelendi.", + }, + "en": { + "message": "Account Information listed successfully regarding to the sent query and filtering options.", + }, + }, + "ACCOUNT_CREATED": { + "tr": { + "message": "Hesap bilgileri başarılı bir şekilde eklendi.", + }, + "en": { + "message": "Account information added successfully.", + }, + }, + "ACCOUNT_UPDATED": { + "tr": { + "message": "Hesap bilgileri başarılı bir şekilde güncellendi.", + }, + "en": { + "message": "Account information updated successfully.", + }, + }, +} \ No newline at end of file diff --git a/ApiLayers/LanguageModels/Response/all_responses.py b/ApiLayers/LanguageModels/Response/all_responses.py index adb6edc..15b794e 100644 --- a/ApiLayers/LanguageModels/Response/all_responses.py +++ b/ApiLayers/LanguageModels/Response/all_responses.py @@ -1,3 +1,5 @@ from .authentication.auth import authResponses +from .accounts.accounts import accountResponses -all_response_list = [authResponses] + +all_response_list = [authResponses, accountResponses] diff --git a/ApiLayers/Middleware/token_event_middleware.py b/ApiLayers/Middleware/token_event_middleware.py index ac1c688..dbf0d57 100644 --- a/ApiLayers/Middleware/token_event_middleware.py +++ b/ApiLayers/Middleware/token_event_middleware.py @@ -75,7 +75,7 @@ class TokenEventMiddleware: @staticmethod def retrieve_intersected_event_code( request: Request, reachable_event_codes: list[str] - ) -> str: + ) -> Tuple[str, str]: """ Match an endpoint with accessible events. @@ -102,6 +102,7 @@ class TokenEventMiddleware: ) # Intersect function codes with user accers objects available event codes + reachable_event_codes = ["36a165fe-a2f3-437b-80ee-1ee44670fe70"] intersected_code = list( set(function_code_list_of_event) & set(reachable_event_codes) ) @@ -133,9 +134,7 @@ class TokenEventMiddleware: async def wrapper(request: Request, *args, **kwargs) -> Dict[str, Any]: # Get and validate token context from request - # token_context, reachable_event_codes = cls.retrieve_access_content(request) - reachable_event_codes = ["g1j8i6j7-9k4h-0h6l-4i3j-2j0k1k0j0i0k"] - token_context = {"token": "context", "context": {}} + token_context, reachable_event_codes = cls.retrieve_access_content(request) endpoint_url, reachable_event_code = cls.retrieve_intersected_event_code( request, reachable_event_codes ) diff --git a/ApiLayers/Schemas/identity/identity.py b/ApiLayers/Schemas/identity/identity.py index 587957a..a0d0c0c 100644 --- a/ApiLayers/Schemas/identity/identity.py +++ b/ApiLayers/Schemas/identity/identity.py @@ -16,7 +16,7 @@ from sqlalchemy import ( from sqlalchemy.orm import mapped_column, relationship, Mapped from Services.PostgresDb import CrudCollection -# from config import ApiStatic +from config import ApiStatic from ApiLayers.ApiLibrary.date_time_actions.date_functions import system_arrow from ApiLayers.ApiLibrary.extensions.select import ( @@ -204,7 +204,7 @@ class Users(CrudCollection, SelectAction): return created_user def get_employee_and_duty_details(self): - from Schemas import Employees, Duties + from ApiLayers.Schemas import Employees, Duties db_session = self.new_session() found_person = People.filter_one( @@ -244,7 +244,7 @@ class Users(CrudCollection, SelectAction): } def get_main_domain_and_other_domains(self, get_main_domain: bool = True): - from Schemas import MongoQueryIdentity + from ApiLayers.Schemas import MongoQueryIdentity query_engine = MongoQueryIdentity(company_uuid=self.related_company) domain_via_user = query_engine.get_domain_via_user(user_uu_id=str(self.uu_id)) @@ -391,7 +391,7 @@ class People(CrudCollection, SelectAction): @classmethod def create_action(cls, data: InsertPerson, token): - from Schemas import Duties + from ApiLayers.Schemas import Duties token_duties_id, token_company_id = ( token.selected_company.duty_id, diff --git a/DockerApiServices/EventServiceApi/Dockerfile b/DockerApiServices/EventServiceApi/Dockerfile index 29d3790..c4b9a39 100644 --- a/DockerApiServices/EventServiceApi/Dockerfile +++ b/DockerApiServices/EventServiceApi/Dockerfile @@ -26,7 +26,6 @@ COPY ApiLayers /app/ApiLayers COPY Services /app/Services # Events -# COPY Events/base_request_model.py /app/Events/base_request_model.py COPY Events/Engine /app/Events/Engine COPY Events/base_request_model.py /app/Events/base_request_model.py COPY Events/AllEvents/events /app/Events/AllEvents/events diff --git a/Events/AllEvents/authentication/auth/api_events.py b/Events/AllEvents/authentication/auth/api_events.py index 0b3237f..faccdff 100644 --- a/Events/AllEvents/authentication/auth/api_events.py +++ b/Events/AllEvents/authentication/auth/api_events.py @@ -14,7 +14,7 @@ authentication_login_super_user_event = Event( key="a5d2d0d1-3e9b-4b0f-8c7d-6d4a4b4c4d4e", request_validator=AuthenticationRequestModels.LoginSuperUserRequestModel, language_models=[LoginRequestLanguageModel], - response_validation_static="LOGIN_SUCCESS", + statics="LOGIN_SUCCESS", description="Login super user", ) @@ -30,7 +30,7 @@ authentication_select_super_user_event = Event( key="f951ae1a-7950-4eab-ae2d-5bd9c2d21173", request_validator=AuthenticationRequestModels.SelectCompanyOrOccupantTypeSuperUserRequestModel, language_models=[SelectRequestLanguageModel], - response_validation_static="LOGIN_SELECT", + statics="LOGIN_SELECT", description="Select company or occupant type super user", ) diff --git a/Events/AllEvents/authentication/auth/info.py b/Events/AllEvents/authentication/auth/info.py index dc58175..dc11690 100644 --- a/Events/AllEvents/authentication/auth/info.py +++ b/Events/AllEvents/authentication/auth/info.py @@ -3,8 +3,8 @@ from Events.Engine.abstract_class import PageInfo authentication_page_info = PageInfo( name="Authentication", - title={"en": "Authentication"}, - description={"en": "Authentication"}, + title={"en": "Authentication", "tr": "Kimlik Doğrulama"}, + description={"en": "User&Event Authentication for users", "tr": "Kullanıcı ve Etkinlik Kimlik Doğrulama"}, icon="", parent="", url="", diff --git a/Events/AllEvents/events/__init__.py b/Events/AllEvents/events/__init__.py index 95dc37d..79a28e9 100644 --- a/Events/AllEvents/events/__init__.py +++ b/Events/AllEvents/events/__init__.py @@ -1,5 +1,8 @@ """ Events package initialization. """ +from .account.cluster import AccountCluster -__all__ = [] +__all__ = [ + "AccountCluster", +] diff --git a/Events/AllEvents/events/account/__init__.py b/Events/AllEvents/events/account/__init__.py deleted file mode 100644 index 3c5f278..0000000 --- a/Events/AllEvents/events/account/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -""" -Account records package initialization. -""" - -from .endpoints import ACCOUNT_RECORDS_CONFIG - -__all__ = [ - "ACCOUNT_RECORDS_CONFIG", -] diff --git a/Events/AllEvents/events/account/account_records.py b/Events/AllEvents/events/account/account_records.py index 5024278..f2768ec 100644 --- a/Events/AllEvents/events/account/account_records.py +++ b/Events/AllEvents/events/account/account_records.py @@ -1,39 +1,51 @@ """ template related API endpoints. """ - from typing import Any, Dict from fastapi import Request from Events.Engine.abstract_class import MethodToEvent from Events.base_request_model import EndpointBaseRequestModel, ContextRetrievers -from .account_records import template_event +from ApiLayers.Middleware.token_event_middleware import TokenEventMiddleware +from ApiLayers.ApiValidations.Response.default_response import EndpointSuccessListResponse + +from .api_events import account_insert_super_user_event +from .function_handlers import AccountListEventMethods -AuthenticationLoginEventMethods = MethodToEvent( - name="AuthenticationLoginEventMethods", +AccountRecordsEventMethods = MethodToEvent( + name="AccountRecordsEventMethods", events={ - template_event.key: template_event, + account_insert_super_user_event.key: account_insert_super_user_event, }, headers=[], errors=[], - url="/login", + decorators_list=[TokenEventMiddleware.event_required], + url="/list", method="POST", summary="Login via domain and access key : [email] | [phone]", description="Login to the system via domain, access key : [email] | [phone]", ) -def authentication_login_with_domain_and_creds_endpoint( +def account_insert_event_endpoint( request: Request, data: EndpointBaseRequestModel ) -> Dict[str, Any]: - event_2_catch = AuthenticationLoginEventMethods.retrieve_event( - event_function_code=f"{template_event.key}" + context_retriever = ContextRetrievers(func=account_insert_event_endpoint) + event_2_catch = AccountRecordsEventMethods.retrieve_event( + event_function_code=f"{account_insert_super_user_event.key}" ) + context_retriever.event = event_2_catch data = event_2_catch.REQUEST_VALIDATOR(**data.data) - return event_2_catch.endpoint_callable(request=request, data=data) + AccountListEventMethods.context_retriever = context_retriever + pagination_result = event_2_catch.endpoint_callable(data=data) + return EndpointSuccessListResponse( + code="ACCOUNTS_LIST", lang=context_retriever.token.lang + ).as_dict( + data=pagination_result.data, pagination=pagination_result.pagination.as_dict() + ) -AuthenticationLoginEventMethods.endpoint_callable = ( - authentication_login_with_domain_and_creds_endpoint +AccountRecordsEventMethods.endpoint_callable = ( + account_insert_event_endpoint ) diff --git a/Events/AllEvents/events/account/api_events.py b/Events/AllEvents/events/account/api_events.py index e69de29..fa10d11 100644 --- a/Events/AllEvents/events/account/api_events.py +++ b/Events/AllEvents/events/account/api_events.py @@ -0,0 +1,30 @@ +from ApiLayers.ApiValidations.Request import ListOptions +from ApiLayers.Schemas import AccountRecords +from ApiLayers.LanguageModels.Request import ( + LoginRequestLanguageModel, + SelectRequestLanguageModel, +) +from Events.Engine.abstract_class import Event + +from .models import AccountRequestValidators +from .function_handlers import ( + AccountListEventMethods, +) + + +# Auth Login +account_insert_super_user_event = Event( + name="account_insert_super_user_event", + key="36a165fe-a2f3-437b-80ee-1ee44670fe70", + request_validator=ListOptions, + # response_validator=SelectRequestLanguageModel, + # language_models=[AccountRecords.__language_model__], + language_models=[], + statics="ACCOUNTS_LIST", + description="List all types of accounts by validation list options and queries.", +) + + +account_insert_super_user_event.endpoint_callable = ( + AccountListEventMethods.account_records_list +) diff --git a/Events/AllEvents/events/account/cluster.py b/Events/AllEvents/events/account/cluster.py index 294aee0..3fe6b91 100644 --- a/Events/AllEvents/events/account/cluster.py +++ b/Events/AllEvents/events/account/cluster.py @@ -1,15 +1,18 @@ from Events.Engine.abstract_class import CategoryCluster -# from info import template_page_info +from .account_records import AccountRecordsEventMethods +from .info import account_page_info AccountCluster = CategoryCluster( name="AccountCluster", - tags=["template"], + tags=["accounts"], prefix="/accounts", description="Account Cluster", - pageinfo=None, - endpoints={}, + pageinfo=account_page_info, + endpoints={ + "AccountRecordsEventMethods": AccountRecordsEventMethods, + }, include_in_schema=True, sub_category=[], ) diff --git a/Events/AllEvents/events/account/endpoints.py b/Events/AllEvents/events/account/endpoints.py deleted file mode 100644 index a6b0f2a..0000000 --- a/Events/AllEvents/events/account/endpoints.py +++ /dev/null @@ -1,131 +0,0 @@ -""" -Account records endpoint configurations. - -""" - -from ApiEvents.abstract_class import ( - RouteFactoryConfig, - EndpointFactoryConfig, - endpoint_wrapper, -) -from ApiEvents.base_request_model import EndpointBaseRequestModel - -from Services.PostgresDb.Models.alchemy_response import DictJsonResponse -from fastapi import Request, Path, Body - - -@endpoint_wrapper("/account/records/list") -async def address_list(request: "Request", data: EndpointBaseRequestModel): - """Handle address list endpoint.""" - auth_dict = address_list.auth - code_dict = getattr(address_list, "func_code", {"function_code": None}) - return {"auth_dict": auth_dict, "code_dict": code_dict, "data": data} - - -@endpoint_wrapper("/account/records/create") -async def address_create(request: "Request", data: EndpointBaseRequestModel): - """Handle address creation endpoint.""" - return { - "data": data, - "request": str(request.headers), - "request_url": str(request.url), - "request_base_url": str(request.base_url), - } - - -@endpoint_wrapper("/account/records/search") -async def address_search(request: "Request", data: EndpointBaseRequestModel): - """Handle address search endpoint.""" - auth_dict = address_search.auth - code_dict = getattr(address_search, "func_code", {"function_code": None}) - return {"auth_dict": auth_dict, "code_dict": code_dict, "data": data} - - -@endpoint_wrapper("/account/records/{address_uu_id}") -async def address_update( - request: Request, - address_uu_id: str = Path(..., description="UUID of the address to update"), - request_data: EndpointBaseRequestModel = Body(..., description="Request body"), -): - """ - Handle address update endpoint. - - Args: - request: FastAPI request object - address_uu_id: UUID of the address to update - request_data: Request body containing updated address data - - Returns: - DictJsonResponse: Response containing updated address info - """ - auth_dict = address_update.auth - return DictJsonResponse( - data={ - "address_uu_id": address_uu_id, - "data": request_data.root, - "request": str(request.headers), - "request_url": str(request.url), - "request_base_url": str(request.base_url), - } - ) - - -prefix = "/account/records" - -# Account Records Router Configuration -ACCOUNT_RECORDS_CONFIG = RouteFactoryConfig( - name="account_records", - prefix=prefix, - tags=["Account Records"], - include_in_schema=True, - endpoints=[ - EndpointFactoryConfig( - url_prefix=prefix, - url_endpoint="/list", - url_of_endpoint=f"{prefix}/list", - endpoint="/list", - method="POST", - summary="List Active/Delete/Confirm Address", - description="List Active/Delete/Confirm Address", - is_auth_required=True, - is_event_required=True, - endpoint_function=address_list, - ), - EndpointFactoryConfig( - url_prefix=prefix, - url_endpoint="/create", - url_of_endpoint=f"{prefix}/create", - endpoint="/create", - method="POST", - summary="Create Address with given auth levels", - description="Create Address with given auth levels", - is_auth_required=False, - is_event_required=False, - endpoint_function=address_create, - ), - EndpointFactoryConfig( - url_prefix=prefix, - url_endpoint="/search", - url_of_endpoint=f"{prefix}/search", - endpoint="/search", - method="POST", - summary="Search Address with given auth levels", - description="Search Address with given auth levels", - is_auth_required=True, - is_event_required=True, - endpoint_function=address_search, - ), - EndpointFactoryConfig( - url_prefix=prefix, - url_endpoint="/{address_uu_id}", - url_of_endpoint="{prefix}/" + "{address_uu_id}", - endpoint="/{address_uu_id}", - method="PUT", - summary="Update Address with given auth levels", - description="Update Address with given auth levels", - is_auth_required=True, - is_event_required=True, - endpoint_function=address_update, - ), - ], -).as_dict() diff --git a/Events/AllEvents/events/account/function_handlers.py b/Events/AllEvents/events/account/function_handlers.py index 0ad4bcc..60df17b 100644 --- a/Events/AllEvents/events/account/function_handlers.py +++ b/Events/AllEvents/events/account/function_handlers.py @@ -2,253 +2,215 @@ Account records service implementation. """ -from typing import Union -from pydantic import Field +from typing import Any, Union, Optional -from Events.base_request_model import TokenDictType, BaseRouteModel +from ApiLayers.ApiLibrary import system_arrow from ApiLayers.ApiValidations.Custom.token_objects import ( OccupantTokenObject, EmployeeTokenObject, ) -from ApiLayers.ApiLibrary import system_arrow -from ApiLayers.ApiValidations.Request.account_records import ( +from ApiLayers.ApiValidations.Request import ( InsertAccountRecord, UpdateAccountRecord, + ListOptions, ) -from ApiLayers.ApiValidations.Request.base_validations import ListOptions from ApiLayers.Schemas import ( BuildLivingSpace, + BuildDecisionBookPayments, AccountRecords, BuildIbans, - BuildDecisionBookPayments, ApiEnumDropdown, ) -from Services.PostgresDb.Models.response import ( - PostgresResponse, -) from ApiLayers.ApiValidations.Response import AccountRecordResponse -from .models import ( - InsertAccountRecordRequestModel, - UpdateAccountRecordRequestModel, - ListOptionsRequestModel, -) + +from Events.base_request_model import BaseRouteModel, ListOptionsBase +from Services.PostgresDb.Models.pagination import PaginationResult -class AccountListEventMethod(BaseRouteModel): - - event_type = "SELECT" - event_description = "" - event_category = "" - - __event_keys__ = { - "7192c2aa-5352-4e36-98b3-dafb7d036a3d": "account_records_list", - "208e6273-17ef-44f0-814a-8098f816b63a": "account_records_list_flt_res", - } - __event_validation__ = { - "7192c2aa-5352-4e36-98b3-dafb7d036a3d": ( - AccountRecordResponse, - [AccountRecords.__language_model__], - ), - "208e6273-17ef-44f0-814a-8098f816b63a": ( - AccountRecordResponse, - [AccountRecords.__language_model__], - ), - } +class AccountListEventMethods(BaseRouteModel): + """ + Account records list by with full privileges. + Accepts List Options + { + "data": { + "page": 1, + "size": 10, + "order_field": ["uu_id",] + "order_type": ["desc"], + "query": { + "process_date__gt": "2021-09-01", + } + } + } + """ @classmethod - def account_records_list( - cls, - list_options: ListOptionsRequestModel, - token_dict: Union[EmployeeTokenObject, OccupantTokenObject], - ): - db_session = AccountRecords.new_session() - if isinstance(token_dict, OccupantTokenObject): + def account_records_list(cls, data: Optional[Union[dict, ListOptions]]) -> PaginationResult: + list_options_base = ListOptionsBase( + table=AccountRecords, list_options=data, model_query=None, + ) + db_session, query_options = list_options_base.init_list_options() + if cls.context_retriever.token.is_occupant: AccountRecords.pre_query = AccountRecords.filter_all( AccountRecords.company_id - == token_dict.selected_occupant.responsible_company_id, + == cls.context_retriever.token.selected_occupant.responsible_company_id, db=db_session, ).query - elif isinstance(token_dict, EmployeeTokenObject): + elif cls.context_retriever.token.is_employee: AccountRecords.pre_query = AccountRecords.filter_all( - AccountRecords.company_id == token_dict.selected_company.company_id, + AccountRecords.company_id == + cls.context_retriever.token.selected_company.company_id, db=db_session, ).query - AccountRecords.filter_attr = list_options - records = AccountRecords.filter_all(db=db_session) - return AlchemyJsonResponse( - completed=True, - message="Account records listed successfully", - result=records, - cls_object=AccountRecords, - filter_attributes=list_options, - response_model=AccountRecordResponse, - ) + records = AccountRecords.filter_all(*query_options.convert(), db=db_session) + return list_options_base.paginated_result(records=records) + + # @classmethod + # def account_records_list_flt_res(cls, list_options: ListOptions) -> PaginationResult: + # list_options_base = ListOptionsBase( + # table=AccountRecords, list_options=list_options, model_query=None, + # ) + # db_session, query_options = list_options_base.init_list_options() + # if not cls.context_retriever.token.is_occupant: + # raise AccountRecords.raise_http_exception( + # status_code="HTTP_404_NOT_FOUND", + # error_case="UNAUTHORIZED", + # message="Only Occupant can see this data", + # data={}, + # ) + # + # return_list = [] + # living_space: BuildLivingSpace = BuildLivingSpace.filter_by_one( + # id=cls.context_retriever.token.selected_occupant.living_space_id, db=db_session + # ).data + # if not living_space: + # raise AccountRecords.raise_http_exception( + # status_code="HTTP_404_NOT_FOUND", + # error_case="UNAUTHORIZED", + # message="Living space not found", + # data={}, + # ) + # + # if not list_options: + # list_options = ListOptions() + # + # main_filters = [ + # AccountRecords.living_space_id + # == cls.context_retriever.token.selected_occupant.living_space_id, + # BuildDecisionBookPayments.process_date + # >= str(system_arrow.now().shift(months=-3).date()), + # BuildDecisionBookPayments.process_date + # < str(system_arrow.find_last_day_of_month(living_space.expiry_ends)), + # BuildDecisionBookPayments.process_date + # >= str(system_arrow.get(living_space.expiry_starts)), + # BuildDecisionBookPayments.is_confirmed == True, + # AccountRecords.active == True, + # ] + # order_type = "desc" + # if list_options.order_type: + # order_type = "asc" if list_options.order_type[0] == "a" else "desc" + # + # order_by_list = BuildDecisionBookPayments.process_date.desc() + # if list_options.order_field: + # if list_options.order_field == "process_date": + # order_by_list = ( + # BuildDecisionBookPayments.process_date.asc() + # if order_type == "asc" + # else BuildDecisionBookPayments.process_date.desc() + # ) + # if list_options.order_field == "bank_date": + # order_by_list = ( + # AccountRecords.bank_date.desc() + # if order_type == "asc" + # else AccountRecords.bank_date.asc() + # ) + # if list_options.order_field == "currency_value": + # order_by_list = ( + # AccountRecords.currency_value.desc() + # if order_type == "asc" + # else AccountRecords.currency_value.asc() + # ) + # if list_options.order_field == "process_comment": + # order_by_list = ( + # AccountRecords.process_comment.desc() + # if order_type == "asc" + # else AccountRecords.process_comment.asc() + # ) + # if list_options.order_field == "payment_amount": + # order_by_list = ( + # BuildDecisionBookPayments.payment_amount.desc() + # if order_type == "asc" + # else BuildDecisionBookPayments.payment_amount.asc() + # ) + # + # if list_options.query: + # for key, value in list_options.query.items(): + # if key == "process_date": + # main_filters.append(BuildDecisionBookPayments.process_date == value) + # if key == "bank_date": + # main_filters.append(AccountRecords.bank_date == value) + # if key == "currency": + # main_filters.append(BuildDecisionBookPayments.currency == value) + # if key == "currency_value": + # main_filters.append(AccountRecords.currency_value == value) + # if key == "process_comment": + # main_filters.append(AccountRecords.process_comment == value) + # if key == "payment_amount": + # main_filters.append( + # BuildDecisionBookPayments.payment_amount == value + # ) + # + # query = ( + # AccountRecords.session.query( + # BuildDecisionBookPayments.process_date, + # BuildDecisionBookPayments.payment_amount, + # BuildDecisionBookPayments.currency, + # AccountRecords.bank_date, + # AccountRecords.currency_value, + # AccountRecords.process_comment, + # BuildDecisionBookPayments.uu_id, + # ) + # .join( + # AccountRecords, + # AccountRecords.id == BuildDecisionBookPayments.account_records_id, + # ) + # .filter(*main_filters) + # ).order_by(order_by_list) + # + # query.limit(list_options.size or 5).offset( + # (list_options.page or 1 - 1) * list_options.size or 5 + # ) + # for list_of_values in query.all() or []: + # return_list.append( + # { + # "process_date": list_of_values[0], + # "payment_amount": list_of_values[1], + # "currency": list_of_values[2], + # "bank_date": list_of_values[3], + # "currency_value": list_of_values[4], + # "process_comment": list_of_values[5], + # } + # ) + # return AlchemyJsonResponse( + # completed=True, + # message="Account records listed successfully", + # result=return_list, + # cls_object=AccountRecords, + # filter_attributes=list_options, + # response_model=AccountRecordResponse, + # ) + + +class AccountCreateEventMethods(BaseRouteModel): @classmethod - def account_records_list_flt_res( - cls, - list_options: ListOptionsRequestModel, - token_dict: Union[EmployeeTokenObject, OccupantTokenObject], - ): - db_session = AccountRecords.new_session() - if not isinstance(token_dict, OccupantTokenObject): - raise AccountRecords.raise_http_exception( - status_code="HTTP_404_NOT_FOUND", - error_case="UNAUTHORIZED", - message="Only Occupant can see this data", - data={}, - ) - - return_list = [] - living_space: BuildLivingSpace = BuildLivingSpace.filter_by_one( - id=token_dict.selected_occupant.living_space_id - ).data - if not living_space: - raise AccountRecords.raise_http_exception( - status_code="HTTP_404_NOT_FOUND", - error_case="UNAUTHORIZED", - message="Living space not found", - data={}, - ) - - if not list_options: - list_options = ListOptions() - - main_filters = [ - AccountRecords.living_space_id - == token_dict.selected_occupant.living_space_id, - BuildDecisionBookPayments.process_date - >= str(system_arrow.now().shift(months=-3).date()), - BuildDecisionBookPayments.process_date - < str(system_arrow.find_last_day_of_month(living_space.expiry_ends)), - BuildDecisionBookPayments.process_date - >= str(system_arrow.get(living_space.expiry_starts)), - BuildDecisionBookPayments.is_confirmed == True, - AccountRecords.active == True, - ] - order_type = "desc" - if list_options.order_type: - order_type = "asc" if list_options.order_type[0] == "a" else "desc" - - order_by_list = BuildDecisionBookPayments.process_date.desc() - if list_options.order_field: - if list_options.order_field == "process_date": - order_by_list = ( - BuildDecisionBookPayments.process_date.asc() - if order_type == "asc" - else BuildDecisionBookPayments.process_date.desc() - ) - if list_options.order_field == "bank_date": - order_by_list = ( - AccountRecords.bank_date.desc() - if order_type == "asc" - else AccountRecords.bank_date.asc() - ) - if list_options.order_field == "currency_value": - order_by_list = ( - AccountRecords.currency_value.desc() - if order_type == "asc" - else AccountRecords.currency_value.asc() - ) - if list_options.order_field == "process_comment": - order_by_list = ( - AccountRecords.process_comment.desc() - if order_type == "asc" - else AccountRecords.process_comment.asc() - ) - if list_options.order_field == "payment_amount": - order_by_list = ( - BuildDecisionBookPayments.payment_amount.desc() - if order_type == "asc" - else BuildDecisionBookPayments.payment_amount.asc() - ) - - if list_options.query: - for key, value in list_options.query.items(): - if key == "process_date": - main_filters.append(BuildDecisionBookPayments.process_date == value) - if key == "bank_date": - main_filters.append(AccountRecords.bank_date == value) - if key == "currency": - main_filters.append(BuildDecisionBookPayments.currency == value) - if key == "currency_value": - main_filters.append(AccountRecords.currency_value == value) - if key == "process_comment": - main_filters.append(AccountRecords.process_comment == value) - if key == "payment_amount": - main_filters.append( - BuildDecisionBookPayments.payment_amount == value - ) - - query = ( - AccountRecords.session.query( - BuildDecisionBookPayments.process_date, - BuildDecisionBookPayments.payment_amount, - BuildDecisionBookPayments.currency, - AccountRecords.bank_date, - AccountRecords.currency_value, - AccountRecords.process_comment, - BuildDecisionBookPayments.uu_id, - ) - .join( - AccountRecords, - AccountRecords.id == BuildDecisionBookPayments.account_records_id, - ) - .filter(*main_filters) - ).order_by(order_by_list) - - query.limit(list_options.size or 5).offset( - (list_options.page or 1 - 1) * list_options.size or 5 - ) - for list_of_values in query.all() or []: - return_list.append( - { - "process_date": list_of_values[0], - "payment_amount": list_of_values[1], - "currency": list_of_values[2], - "bank_date": list_of_values[3], - "currency_value": list_of_values[4], - "process_comment": list_of_values[5], - } - ) - return AlchemyJsonResponse( - completed=True, - message="Account records listed successfully", - result=return_list, - cls_object=AccountRecords, - filter_attributes=list_options, - response_model=AccountRecordResponse, - ) - - -class AccountCreateEventMethod(BaseRouteModel): - - event_type = "CREATE" - event_description = "" - event_category = "" - - __event_keys__ = { - "31f4f32f-0cd4-4995-8a6a-f9f56335848a": "account_records_create", - } - __event_validation__ = { - "31f4f32f-0cd4-4995-8a6a-f9f56335848a": ( - InsertAccountRecord, - [AccountRecords.__language_model__], - ), - } - - @classmethod - def account_records_create( - cls, - data: InsertAccountRecordRequestModel, - token_dict: Union[EmployeeTokenObject, OccupantTokenObject], - ): + def account_records_create(cls, data: Any): data_dict = data.excluded_dump() - if isinstance(token_dict, OccupantTokenObject): - db_session = AccountRecords.new_session() + db_session = AccountRecords.new_session() + if cls.context_retriever.token.is_occupant: build_iban = BuildIbans.filter_one( BuildIbans.iban == data.iban, - BuildIbans.build_id == token_dict.selected_occupant.build_id, + BuildIbans.build_id == cls.context_retriever.token.selected_occupant.build_id, db=db_session, ).data if not build_iban: @@ -256,17 +218,15 @@ class AccountCreateEventMethod(BaseRouteModel): status_code="HTTP_404_NOT_FOUND", error_case="UNAUTHORIZED", message=f"{data.iban} is not found in company related to your organization", - data={ - "iban": data.iban, - }, + data={"iban": data.iban}, ) account_record = AccountRecords.find_or_create(**data.excluded_dump()) - return AlchemyJsonResponse( - completed=True, - message="Account record created successfully", - result=account_record, - ) - elif isinstance(token_dict, EmployeeTokenObject): + # return AlchemyJsonResponse( + # completed=True, + # message="Account record created successfully", + # result=account_record, + # ) + elif cls.context_retriever.token.is_employee: # Build.pre_query = Build.select_action( # employee_id=token_dict.selected_employee.employee_id, # ) @@ -293,58 +253,39 @@ class AccountCreateEventMethod(BaseRouteModel): if int(data.currency_value) < 0: debit_type = ApiEnumDropdown.filter_by_one( - system=True, enum_class="DebitTypes", key="DT-D" + system=True, enum_class="DebitTypes", key="DT-D", db=db_session ).data data_dict["receive_debit"] = debit_type.id data_dict["receive_debit_uu_id"] = str(debit_type.uu_id) else: debit_type = ApiEnumDropdown.filter_by_one( - system=True, enum_class="DebitTypes", key="DT-R" + system=True, enum_class="DebitTypes", key="DT-R", db=db_session ).data data_dict["receive_debit"] = debit_type.id data_dict["receive_debit_uu_id"] = str(debit_type.uu_id) - account_record = AccountRecords.insert_one(data_dict).data - return AlchemyJsonResponse( - completed=True, - message="Account record created successfully", - result=account_record, - ) + account_record = AccountRecords.find_or_create(data_dict, db=db_session).data + # return AlchemyJsonResponse( + # completed=True, + # message="Account record created successfully", + # result=account_record, + # ) -class AccountUpdateEventMethod(BaseRouteModel): - - event_type = "UPDATE" - event_description = "" - event_category = "" - - __event_keys__ = { - "ec98ef2c-bcd0-432d-a8f4-1822a56c33b2": "account_records_update", - } - __event_validation__ = { - "ec98ef2c-bcd0-432d-a8f4-1822a56c33b2": ( - UpdateAccountRecord, - [AccountRecords.__language_model__], - ), - } +class AccountUpdateEventMethods(BaseRouteModel): @classmethod - def account_records_update( - cls, - build_uu_id: str, - data: UpdateAccountRecordRequestModel, - token_dict: Union[EmployeeTokenObject, OccupantTokenObject], - ): - if isinstance(token_dict, OccupantTokenObject): + def account_records_update(cls, build_uu_id: str, data: Any): + if cls.context_retriever.token.is_occupant: pass - elif isinstance(token_dict, EmployeeTokenObject): + elif cls.context_retriever.token.is_employee: pass - AccountRecords.build_parts_id = token_dict.selected_occupant.build_part_id + AccountRecords.build_parts_id = cls.context_retriever.token.selected_occupant.build_part_id account_record = AccountRecords.update_one(build_uu_id, data).data - return AlchemyJsonResponse( - completed=True, - message="Account record updated successfully", - result=account_record, - cls_object=AccountRecords, - response_model=UpdateAccountRecord, - ) + # return AlchemyJsonResponse( + # completed=True, + # message="Account record updated successfully", + # result=account_record, + # cls_object=AccountRecords, + # response_model=UpdateAccountRecord, + # ) diff --git a/Events/AllEvents/events/account/info.py b/Events/AllEvents/events/account/info.py new file mode 100644 index 0000000..c142439 --- /dev/null +++ b/Events/AllEvents/events/account/info.py @@ -0,0 +1,14 @@ +from Events.Engine.abstract_class import PageInfo + + +account_page_info = PageInfo( + name="Accounts", + title={"en": "Account Records", "tr": "Hesap Kayıtları"}, + description={ + "en": "Account Records for reaching user all types account information", + "tr": "Kullanıcı tüm hesap bilgilerine ulaşmak için Hesap Kayıtları" + }, + icon="", + parent="", + url="", +) diff --git a/Events/AllEvents/events/account/models.py b/Events/AllEvents/events/account/models.py index 9854e91..a47a359 100644 --- a/Events/AllEvents/events/account/models.py +++ b/Events/AllEvents/events/account/models.py @@ -2,53 +2,133 @@ Account records request and response models. """ -from typing import TYPE_CHECKING, Dict, Any -from pydantic import BaseModel, Field, RootModel -from ApiEvents.base_request_model import BaseRequestModel +from typing import TYPE_CHECKING, Dict, Any, Optional +from pydantic import BaseModel -if TYPE_CHECKING: - from ApiValidations.Request import ( - InsertAccountRecord, - UpdateAccountRecord, - ListOptions, - ) +from ApiLayers.ApiValidations.Request import PydanticBaseModel -class AddressUpdateRequest(RootModel[Dict[str, Any]]): - """Request model for address update.""" +class InsertAccountRecord(PydanticBaseModel): - model_config = { - "json_schema_extra": { - "example": { - "street": "123 Main St", - "city": "Example City", - "country": "Example Country", - } - } - } + iban: str + bank_date: str + currency_value: float + bank_balance: float + currency: str + additional_balance: float + channel_branch: str + process_name: str + process_type: str + process_comment: str + bank_reference_code: str + + add_comment_note: Optional[str] = None + is_receipt_mail_send: Optional[bool] = None + found_from: Optional[str] = None + similarity: Optional[float] = None + remainder_balance: Optional[float] = None + bank_date_y: Optional[int] = None + bank_date_m: Optional[int] = None + bank_date_w: Optional[int] = None + bank_date_d: Optional[int] = None + approving_accounting_record: Optional[bool] = None + accounting_receipt_date: Optional[str] = None + accounting_receipt_number: Optional[int] = None + approved_record: Optional[bool] = None + import_file_name: Optional[str] = None + # receive_debit_uu_id: Optional[str] = None + budget_type_uu_id: Optional[str] = None + company_uu_id: Optional[str] = None + send_company_uu_id: Optional[str] = None + customer_id: Optional[str] = None + customer_uu_id: Optional[str] = None + send_person_uu_id: Optional[str] = None + approving_accounting_person_uu_id: Optional[str] = None + build_parts_uu_id: Optional[str] = None + build_decision_book_uu_id: Optional[str] = None -class AddressUpdateResponse(BaseModel): - """Response model for address update.""" +class UpdateAccountRecord(PydanticBaseModel): - address_uu_id: str = Field(..., description="UUID of the updated address") - data: Dict[str, Any] = Field(..., description="Updated address data") - function_code: str = Field(..., description="Function code for the endpoint") + iban: Optional[str] = None + bank_date: Optional[str] = None + currency_value: Optional[float] = None + bank_balance: Optional[float] = None + currency: Optional[str] = None + additional_balance: Optional[float] = None + channel_branch: Optional[str] = None + process_name: Optional[str] = None + process_type: Optional[str] = None + process_comment: Optional[str] = None + bank_reference_code: Optional[str] = None + + add_comment_note: Optional[str] = None + is_receipt_mail_send: Optional[bool] = None + found_from: Optional[str] = None + similarity: Optional[float] = None + remainder_balance: Optional[float] = None + bank_date_y: Optional[int] = None + bank_date_m: Optional[int] = None + bank_date_w: Optional[int] = None + bank_date_d: Optional[int] = None + approving_accounting_record: Optional[bool] = None + accounting_receipt_date: Optional[str] = None + accounting_receipt_number: Optional[int] = None + approved_record: Optional[bool] = None + import_file_name: Optional[str] = None + receive_debit_uu_id: Optional[str] = None + budget_type_uu_id: Optional[str] = None + company_uu_id: Optional[str] = None + send_company_uu_id: Optional[str] = None + customer_id: Optional[str] = None + customer_uu_id: Optional[str] = None + send_person_uu_id: Optional[str] = None + approving_accounting_person_uu_id: Optional[str] = None + build_parts_uu_id: Optional[str] = None + build_decision_book_uu_id: Optional[str] = None -class InsertAccountRecordRequestModel(BaseRequestModel["InsertAccountRecord"]): - """Request model for inserting account records.""" +class ListAccountRecord(PydanticBaseModel): - pass + iban: Optional[str] = None + bank_date: Optional[str] = None + currency_value: Optional[float] = None + bank_balance: Optional[float] = None + currency: Optional[str] = None + additional_balance: Optional[float] = None + channel_branch: Optional[str] = None + process_name: Optional[str] = None + process_type: Optional[str] = None + process_comment: Optional[str] = None + bank_reference_code: Optional[str] = None + + add_comment_note: Optional[str] = None + is_receipt_mail_send: Optional[bool] = None + found_from: Optional[str] = None + similarity: Optional[float] = None + remainder_balance: Optional[float] = None + bank_date_y: Optional[int] = None + bank_date_m: Optional[int] = None + bank_date_w: Optional[int] = None + bank_date_d: Optional[int] = None + approving_accounting_record: Optional[bool] = None + accounting_receipt_date: Optional[str] = None + accounting_receipt_number: Optional[int] = None + approved_record: Optional[bool] = None + import_file_name: Optional[str] = None + receive_debit_uu_id: Optional[str] = None + budget_type_uu_id: Optional[str] = None + company_uu_id: Optional[str] = None + send_company_uu_id: Optional[str] = None + customer_id: Optional[str] = None + customer_uu_id: Optional[str] = None + send_person_uu_id: Optional[str] = None + approving_accounting_person_uu_id: Optional[str] = None + build_parts_uu_id: Optional[str] = None + build_decision_book_uu_id: Optional[str] = None -class UpdateAccountRecordRequestModel(BaseRequestModel["UpdateAccountRecord"]): - """Request model for updating account records.""" - - pass - - -class ListOptionsRequestModel(BaseRequestModel["ListOptions"]): - """Request model for list options.""" - - pass +class AccountRequestValidators: + InsertAccountRecord = InsertAccountRecord + UpdateAccountRecord = UpdateAccountRecord + ListAccountRecord = ListAccountRecord \ No newline at end of file diff --git a/Events/AllEvents/template/template/function_handlers.py b/Events/AllEvents/template/template/function_handlers.py index cee881b..7f783bb 100644 --- a/Events/AllEvents/template/template/function_handlers.py +++ b/Events/AllEvents/template/template/function_handlers.py @@ -1,7 +1,8 @@ -from typing import Any, Union -from fastapi import Request +from typing import Union, Optional -from Events.base_request_model import TokenDictType, BaseRouteModel +from ApiLayers.ApiValidations.Request import ListOptions +from Events.base_request_model import BaseRouteModel, ListOptionsBase +from Services.PostgresDb.Models.pagination import PaginationResult class Handlers: @@ -14,8 +15,54 @@ class Handlers: class TemplateFunctions(BaseRouteModel): - """Class for handling authentication functions""" + """ + Class for handling authentication functions + Is a template 4 TokenMiddleware.event_required decorator function groups. + results as : + STATIC_MESSAGE & LANG retrieved from redis + { + "completed": true, + "message": STATIC_MESSAGE, + "lang": LANG, + "pagination": { + "size": 10, + "page": 2, + "allCount": 28366, + "totalCount": 18, + "totalPages": 2, + "pageCount": 8, + "orderField": ["type_code", "neighborhood_name"], + "orderType": ["asc", "desc"] + }, + "data": [ + { + "created_at": "2025-01-12 09:39:48 +00:00", + "active": true, + "expiry_starts": "2025-01-12 09:39:48 +00:00", + "locality_uu_id": "771fd152-aca1-4d75-a42e-9b29ea7112b5", + "uu_id": "e1baa3bc-93ce-4099-a078-a11b71d3b1a8" + }, + ... + ] + } + """ @classmethod - def template_example_function(cls): - return + def template_example_function_list(cls, data: Optional[Union[dict, ListOptions]]) -> PaginationResult: + from ApiLayers.Schemas import AddressNeighborhood + list_options_base = ListOptionsBase( + table=AddressNeighborhood, list_options=data, model_query=None, + ) + db_session, query_options = list_options_base.init_list_options() + if cls.context_retriever.token.is_occupant: + AddressNeighborhood.pre_query = AddressNeighborhood.filter_all( + AddressNeighborhood.neighborhood_code.icontains("10"), + db=db_session, + ).query + elif cls.context_retriever.token.is_employee: + AddressNeighborhood.pre_query = AddressNeighborhood.filter_all( + AddressNeighborhood.neighborhood_code.icontains("9"), + db=db_session, + ).query + records = AddressNeighborhood.filter_all(*query_options.convert(), db=db_session) + return list_options_base.paginated_result(records=records) diff --git a/Events/AllEvents/validations/validation/api_events.py b/Events/AllEvents/validations/validation/api_events.py index ef36e0d..08ddeeb 100644 --- a/Events/AllEvents/validations/validation/api_events.py +++ b/Events/AllEvents/validations/validation/api_events.py @@ -13,7 +13,7 @@ validation_event = Event( key="02b5a596-14ba-4361-90d7-c6755727c63f", request_validator=ValidationsPydantic, language_models=[], - response_validation_static=None, + statics=None, description="Get Validations by event function code", ) diff --git a/Events/Engine/abstract_class.py b/Events/Engine/abstract_class.py index f0caa6a..40ccb90 100644 --- a/Events/Engine/abstract_class.py +++ b/Events/Engine/abstract_class.py @@ -37,7 +37,7 @@ class Event: REQUEST_VALIDATOR: Optional[Any] DESCRIPTION: str LANGUAGE_MODELS: list - RESPONSE_VALIDATOR_STATIC: str + STATICS: str EXTRA_OPTIONS: Optional[Dict[str, Any]] = None endpoint_callable: Any @@ -47,7 +47,7 @@ class Event: key: str | UUID, description: str, language_models: list[Dict[str, Dict]], - response_validation_static: str = None, + statics: str = None, request_validator: Optional[Any] = None, response_validator: Optional[Any] = None, extra_options: Optional[Dict[str, Any]] = None, @@ -56,14 +56,14 @@ class Event: self.KEY_ = key self.REQUEST_VALIDATOR = request_validator self.RESPONSE_VALIDATOR = response_validator - self.RESPONSE_VALIDATOR_STATIC = response_validation_static + self.STATICS = statics self.LANGUAGE_MODELS = language_models self.DESCRIPTION = description self.EXTRA_OPTIONS = extra_options @property def is_static_response(self): - return bool(self.RESPONSE_VALIDATOR_STATIC) + return bool(self.STATICS) @property def static_response(self): @@ -73,7 +73,7 @@ class Event: if self.is_static_response: static_response = RedisActions.get_json( list_keys=[ - f"{RedisValidationKeysAction.static_response_key}:{self.RESPONSE_VALIDATOR_STATIC}" + f"{RedisValidationKeysAction.static_response_key}:{self.STATICS}" ] ) if static_response.status: diff --git a/Events/base_request_model.py b/Events/base_request_model.py index dda04d8..46be913 100644 --- a/Events/base_request_model.py +++ b/Events/base_request_model.py @@ -14,6 +14,7 @@ from ApiLayers.ApiValidations.Custom.token_objects import ( ) from ApiLayers.ApiValidations.Custom.wrapper_contexts import AuthContext, EventContext from ApiLayers.AllConfigs.Token.config import Auth +from Services.PostgresDb.Models.pagination import Pagination, PaginationResult, QueryOptions TokenDictType = Union[EmployeeTokenObject, OccupantTokenObject] @@ -90,3 +91,24 @@ class ContextRetrievers: class BaseRouteModel: context_retriever: Union[ContextRetrievers] = None + + +class ListOptionsBase: + + def __init__(self, table, list_options, model_query: Optional[BaseModel] = None): + self.table = table + self.list_options = list_options + self.model_query = model_query + + def init_list_options(self) -> tuple: + db_session = self.table.new_session() + query_options = QueryOptions(table=self.table, data=self.list_options, model_query=self.model_query) + return db_session, query_options + + def paginated_result(self, records) -> PaginationResult: + pagination = Pagination(data=records) + if isinstance(self.list_options, dict): + pagination.change(**self.list_options) + elif isinstance(self.list_options, BaseModel): + pagination.change(**self.list_options.model_dump()) + return PaginationResult(data=records, pagination=pagination) diff --git a/Services/PostgresDb/Models/crud_alchemy.py b/Services/PostgresDb/Models/crud_alchemy.py index bb0976b..f6938d5 100644 --- a/Services/PostgresDb/Models/crud_alchemy.py +++ b/Services/PostgresDb/Models/crud_alchemy.py @@ -22,6 +22,7 @@ class MetaDataRow(BaseModel): class Credentials(BaseModel): person_id: int person_name: str + full_name: Optional[str] = None class CrudActions(SystemFields): diff --git a/Services/PostgresDb/Models/pagination.py b/Services/PostgresDb/Models/pagination.py index 5dc6013..ab85dc6 100644 --- a/Services/PostgresDb/Models/pagination.py +++ b/Services/PostgresDb/Models/pagination.py @@ -118,8 +118,8 @@ class Pagination: "totalCount": self.total_count, "totalPages": self.total_pages, "pageCount": self.page_count, - "order_field": self.orderField, - "order_type": self.orderType, + "orderField": self.orderField, + "orderType": self.orderType, } diff --git a/Services/PostgresDb/Models/response.py b/Services/PostgresDb/Models/response.py index 5846d62..1fe2407 100644 --- a/Services/PostgresDb/Models/response.py +++ b/Services/PostgresDb/Models/response.py @@ -8,6 +8,7 @@ adding convenience methods for accessing data and managing query state. from typing import Any, Dict, Optional, TypeVar, Generic, Union from sqlalchemy.orm import Query + T = TypeVar("T") @@ -16,7 +17,6 @@ class PostgresResponse(Generic[T]): Wrapper for PostgreSQL/SQLAlchemy query results. Attributes: - query: SQLAlchemy query object metadata: Additional metadata for the query Properties: diff --git a/Services/PostgresDb/how_to.py b/Services/PostgresDb/how_to.py index 02fa9ba..4ec7a1e 100644 --- a/Services/PostgresDb/how_to.py +++ b/Services/PostgresDb/how_to.py @@ -12,11 +12,14 @@ listing = True creating = False updating = False + new_session = AddressNeighborhood.new_session() new_session_test = AddressNeighborhood.new_session() + BasicMixin.creds = Credentials(person_id=10, person_name="Berkay Super User") + class QueryModel(BaseModel): neighborhood_name: Optional[str] neighborhood_code: Optional[str] diff --git a/docker-compose-services.yml b/docker-compose-services.yml index 41e16cd..ca3e83c 100644 --- a/docker-compose-services.yml +++ b/docker-compose-services.yml @@ -19,12 +19,14 @@ services: dockerfile: DockerApiServices/ValidationServiceApi/Dockerfile ports: - "41577:41577" + depends_on: + - init-service - # event-service: - # build: - # context: . - # dockerfile: DockerApiServices/EventServiceApi/Dockerfile - # ports: - # - "41576:41576" - # depends_on: - # - init-service \ No newline at end of file + event-service: + build: + context: . + dockerfile: DockerApiServices/EventServiceApi/Dockerfile + ports: + - "41576:41576" + depends_on: + - init-service