diff --git a/ApiControllers/abstracts/event_clusters.py b/ApiControllers/abstracts/event_clusters.py index b7b4e0b..7cb9d20 100644 --- a/ApiControllers/abstracts/event_clusters.py +++ b/ApiControllers/abstracts/event_clusters.py @@ -40,7 +40,7 @@ class EventCluster: db=db_session, ).data: for event in self.events: - event_to_save_database = Events.find_or_create( + event_dict_to_save = dict( function_code=event.key, function_class=event.name, description=event.description, @@ -54,13 +54,16 @@ class EventCluster: Events.function_class, Events.endpoint_code, Events.endpoint_uu_id, - ], + ] ) + event_to_save_database = Events.find_or_create(**event_dict_to_save) if event_to_save_database.meta_data.created: - event_to_save_database.save(db=db_session) - print( - f"UUID: {event_to_save_database.uu_id} event is saved to {to_save_endpoint.uu_id}" - ) + print(f"UUID: {event_to_save_database.uu_id} event is saved to {to_save_endpoint.uu_id}") + else: + event_to_save_database.update(**event_dict_to_save) + if event_to_save_database.meta_data.updated: + print(f"UUID: {event_to_save_database.uu_id} event is updated to {to_save_endpoint.uu_id}") + event_to_save_database.save(db=db_session) def match_event(self, event_key: str) -> "Event": """ diff --git a/ApiServices/IdentityService/Events/people/supers_events.py b/ApiServices/IdentityService/Events/people/supers_events.py index b372619..1f98530 100644 --- a/ApiServices/IdentityService/Events/people/supers_events.py +++ b/ApiServices/IdentityService/Events/people/supers_events.py @@ -17,7 +17,7 @@ SupersPeopleCreateEvent = Event( key="ec4c2404-a61b-46c7-bbdf-ce3357e6cf41", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Create events of people endpoint", + description="Super Users Create events of people endpoint", ) # Update endpoint @@ -26,7 +26,7 @@ SupersPeopleUpdateEvent = Event( key="91e77de4-9f29-4309-b121-4aad256d440c", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Update events of people endpoint", + description="Super Users Update events of people endpoint", ) # List endpoint @@ -35,7 +35,7 @@ SupersPeopleListEvent = Event( key="6828d280-e587-400d-a622-c318277386c3", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="List events of people endpoint", + description="Super Users List events of people endpoint", ) diff --git a/ApiServices/IdentityService/Events/user/supers_events.py b/ApiServices/IdentityService/Events/user/supers_events.py index 679e2a6..53f658b 100644 --- a/ApiServices/IdentityService/Events/user/supers_events.py +++ b/ApiServices/IdentityService/Events/user/supers_events.py @@ -10,7 +10,7 @@ SuperUsersListEvent = Event( key="341b394f-9f11-4abb-99e7-4b27fa6bf012", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="List events of users endpoint", + description="Super User List events of users endpoint", ) # Create endpoint @@ -19,7 +19,7 @@ SuperUsersCreateEvent = Event( key="4e7e189e-e015-4ff8-902d-60138cbc77a6", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Create events of users endpoint", + description="Super User Create events of users endpoint", ) # Update endpoint @@ -28,7 +28,7 @@ SuperUsersUpdateEvent = Event( key="efa4aa4a-d414-4391-91ee-97eb617b7755", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Update events of users endpoint", + description="Super User Update events of users endpoint", ) diff --git a/ApiServices/ManagementService/Endpoints/application/route.py b/ApiServices/ManagementService/Endpoints/application/route.py index 54f4d7f..da53240 100644 --- a/ApiServices/ManagementService/Endpoints/application/route.py +++ b/ApiServices/ManagementService/Endpoints/application/route.py @@ -5,7 +5,7 @@ from ApiControllers.abstracts.default_validations import CommonHeaders from ApiControllers.providers.token_provider import TokenProvider from Controllers.Postgres.pagination import PaginateOnly, Pagination, PaginationResult -from Controllers.Postgres.response import EndpointResponse +from Controllers.Postgres.response import EndpointResponse, CreateEndpointResponse from Schemas import Applications from Validations.application.validations import ( RequestApplication, @@ -66,18 +66,18 @@ def application_create_route( created_application = Applications.find_or_create( db=db_session, include_args=[ - Applications.application_for == data.application_for, - Applications.application_code == data.application_code, - Applications.site_url == data.site_url, - ] - ** created_application_dict, + Applications.application_for, + Applications.application_code, + Applications.site_url, + ], + **created_application_dict, ) if created_application.meta_data.created: - return EndpointResponse( + return CreateEndpointResponse( message="MSG0001-INSERT", data=created_application, ).response - return EndpointResponse( + return CreateEndpointResponse( message="MSG0002-FOUND", data=created_application, ).response @@ -98,23 +98,23 @@ def application_update_route( """ token_object = TokenProvider.get_dict_from_redis(token=headers.token) with Applications.new_session() as db_session: - updated_application_dict = data.model_dump() + updated_application_dict = data.model_dump(exclude_unset=True, exclude_none=True) found_application = Applications.filter_one( Applications.uu_id == application_uuid, db=db_session ).data if not found_application: - return EndpointResponse( + return CreateEndpointResponse( message="MSG0002-FOUND", data=found_application, ).response - updated_application = found_application.update(**updated_application_dict) + updated_application = found_application.update(db=db_session,**updated_application_dict) updated_application.save(db_session) if updated_application.meta_data.updated: - return EndpointResponse( + return CreateEndpointResponse( message="MSG0003-UPDATE", data=updated_application, ).response - return EndpointResponse( + return CreateEndpointResponse( message="MSG0003-UPDATE", data=updated_application, ).response diff --git a/ApiServices/ManagementService/Endpoints/event_endpoints/route.py b/ApiServices/ManagementService/Endpoints/event_endpoints/route.py index 9877e45..8cb30bc 100644 --- a/ApiServices/ManagementService/Endpoints/event_endpoints/route.py +++ b/ApiServices/ManagementService/Endpoints/event_endpoints/route.py @@ -1,5 +1,5 @@ -from fastapi import APIRouter, Depends from typing import Any +from fastapi import APIRouter, Depends from ApiControllers.abstracts.default_validations import CommonHeaders from ApiControllers.providers.token_provider import TokenProvider diff --git a/ApiServices/ManagementService/Events/application/supers_events.py b/ApiServices/ManagementService/Events/application/supers_events.py index 21a8633..2ccc50c 100644 --- a/ApiServices/ManagementService/Events/application/supers_events.py +++ b/ApiServices/ManagementService/Events/application/supers_events.py @@ -14,7 +14,7 @@ ApplicationListEvent = Event( key="b4efda1e-bde7-4659-ab1a-ef74c0fd88b6", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="List events of users endpoint", + description="Super Users List applications endpoint", ) # Create endpoint @@ -23,7 +23,7 @@ ApplicationCreateEvent = Event( key="f53ca9aa-5536-4d77-9129-78d67e61db4a", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Create events of users endpoint", + description="Super Users Create applications endpoint", ) # Update endpoint @@ -32,7 +32,7 @@ ApplicationUpdateEvent = Event( key="0e9a855e-4e69-44b5-8ac2-825daa32840c", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Update events of users endpoint", + description="Super Users Update applications endpoint", ) #Bind Application to employee @@ -41,7 +41,7 @@ ApplicationBindEmployeeEvent = Event( key="26a96c2d-bca8-41cb-8ac1-f3ca8124434b", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Bind events of users endpoint", + description="Super Users Application Bind employee endpoint", ) #Bind Application to occupant @@ -50,7 +50,7 @@ ApplicationBindOccupantEvent = Event( key="4eaf2bb0-2a42-4d21-ae65-a9259ebee189", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Bind events of users endpoint", + description="Super Users Application Bind occupant endpoint", ) diff --git a/ApiServices/ManagementService/Events/event_endpoints/supers_events.py b/ApiServices/ManagementService/Events/event_endpoints/supers_events.py index 6a1cb4c..d303917 100644 --- a/ApiServices/ManagementService/Events/event_endpoints/supers_events.py +++ b/ApiServices/ManagementService/Events/event_endpoints/supers_events.py @@ -18,7 +18,7 @@ EventsListEvent = Event( key="0a08c64b-ce20-4791-b1e9-014db6b75ea7", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="List services endpoint", + description="Super Users List services endpoint", ) @@ -28,7 +28,7 @@ EventRegisterServiceEvent = Event( key="e18e7f89-5708-4a15-9258-99b0903ed43d", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Register service endpoint", + description="Super Users Register service endpoint", ) # Bind employee extra endpoint @@ -37,7 +37,7 @@ EventBindEmployeeExtraEvent = Event( key="cd452928-4256-4fb4-b81e-0ca41d723616", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Bind service to employee extra endpoint", + description="Super Users Bind service to employee extra endpoint", ) # Bind occupant extra endpoint @@ -46,7 +46,7 @@ EventBindOccupantExtraEvent = Event( key="cb11a150-8049-45c9-8cf3-d5290ffd2e4a", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="Bind service to occupant extra endpoint", + description="Super Users Bind service to occupant extra endpoint", ) diff --git a/ApiServices/ManagementService/Events/service_endpoints/supers_events.py b/ApiServices/ManagementService/Events/service_endpoints/supers_events.py index ca7cc3c..d985ac0 100644 --- a/ApiServices/ManagementService/Events/service_endpoints/supers_events.py +++ b/ApiServices/ManagementService/Events/service_endpoints/supers_events.py @@ -10,7 +10,7 @@ ServiceEndpointListEvent = Event( key="7da6ceac-925a-4faa-9cc5-3f34396b5684", request_validator=None, # TODO: Add request validator response_validator=None, # TODO: Add response validator - description="List services endpoint", + description="Super Users List services endpoint", ) diff --git a/ApiServices/TemplateService/Dockerfile b/ApiServices/TemplateService/Dockerfile deleted file mode 100644 index 3627a8f..0000000 --- a/ApiServices/TemplateService/Dockerfile +++ /dev/null @@ -1,29 +0,0 @@ -FROM python:3.12-slim - -WORKDIR / - -# Install system dependencies and Poetry -RUN apt-get update && apt-get install -y --no-install-recommends gcc && rm -rf /var/lib/apt/lists/* && pip install --no-cache-dir poetry - -# Copy Poetry configuration -COPY /pyproject.toml ./pyproject.toml - -# Configure Poetry and install dependencies with optimizations -RUN poetry config virtualenvs.create false && poetry install --no-interaction --no-ansi --no-root --only main \ -&& pip cache purge && rm -rf ~/.cache/pypoetry - -# Copy application code -COPY /ApiControllers /ApiControllers -COPY /ApiDefaults /ApiDefaults -COPY /Controllers /Controllers -COPY /Schemas /Schemas - -COPY /ApiServices/IdentityService/Endpoints /ApiDefaults/Endpoints -COPY /ApiServices/IdentityService/Events /ApiDefaults/Events -COPY /ApiServices/IdentityService/Validations /ApiDefaults/Validations - -# Set Python path to include app directory -ENV PYTHONPATH=/ PYTHONUNBUFFERED=1 PYTHONDONTWRITEBYTECODE=1 - -# Run the application using the configured uvicorn server -CMD ["poetry", "run", "python", "ApiDefaults/app.py"] diff --git a/ApiServices/TemplateService/Endpoints/people/route.py b/ApiServices/TemplateService/Endpoints/people/route.py deleted file mode 100644 index 8687b2e..0000000 --- a/ApiServices/TemplateService/Endpoints/people/route.py +++ /dev/null @@ -1,67 +0,0 @@ -from fastapi import APIRouter, Depends - -from ApiControllers.abstracts.default_validations import CommonHeaders -from ApiControllers.providers.token_provider import TokenProvider -from Controllers.Postgres.pagination import PaginateOnly -from Events.people.cluster import PeopleRouterCluster - - -people_route = APIRouter(prefix="/people", tags=["People"]) - - -@people_route.post( - path="/list", - description="List people endpoint", - operation_id="f102db46-031a-43e4-966a-dae6896f985b", -) -def people_route_list( - data: PaginateOnly, - headers: CommonHeaders = Depends(CommonHeaders.as_dependency), -): - """ - List people endpoint - """ - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - event_founder_dict = dict(endpoint_code=headers.operation_id, token=token_object) - event_key = TokenProvider.retrieve_event_codes(**event_founder_dict) - FoundCluster = PeopleRouterCluster.get_event_cluster("PeopleList") - event_cluster_matched = FoundCluster.match_event(event_key=event_key) - return event_cluster_matched.event_callable(data=data) - - -@people_route.post( - path="/create", - description="Create people endpoint", - operation_id="eb465fde-337f-4b81-94cf-28c6d4f2b1b6", -) -def people_route_create( - headers: CommonHeaders = Depends(CommonHeaders.as_dependency), -): - """ - Create people endpoint - """ - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - event_founder_dict = dict(endpoint_code=headers.operation_id, token=token_object) - event_key = TokenProvider.retrieve_event_codes(**event_founder_dict) - FoundCluster = PeopleRouterCluster.get_event_cluster("PeopleCreate") - event_cluster_matched = FoundCluster.match_event(event_key=event_key) - return event_cluster_matched.event_callable() - - -@people_route.post( - path="/update", - description="Update people endpoint", - operation_id="c9e5ba69-6915-43f5-8f9c-a5c2aa865b89", -) -def people_route_update( - headers: CommonHeaders = Depends(CommonHeaders.as_dependency), -): - """ - Update people endpoint - """ - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - event_founder_dict = dict(endpoint_code=headers.operation_id, token=token_object) - event_key = TokenProvider.retrieve_event_codes(**event_founder_dict) - FoundCluster = PeopleRouterCluster.get_event_cluster("PeopleUpdate") - event_cluster_matched = FoundCluster.match_event(event_key=event_key) - return event_cluster_matched.event_callable() diff --git a/ApiServices/TemplateService/Endpoints/routes.py b/ApiServices/TemplateService/Endpoints/routes.py deleted file mode 100644 index df1570b..0000000 --- a/ApiServices/TemplateService/Endpoints/routes.py +++ /dev/null @@ -1,18 +0,0 @@ -from fastapi import APIRouter - - -def get_routes() -> list[APIRouter]: - from .people.route import people_route - from .user.route import user_route - - return [user_route, people_route] - - -def get_safe_endpoint_urls() -> list[tuple[str, str]]: - return [ - ("/", "GET"), - ("/docs", "GET"), - ("/redoc", "GET"), - ("/openapi.json", "GET"), - ("/metrics", "GET"), - ] diff --git a/ApiServices/TemplateService/Endpoints/user/route.py b/ApiServices/TemplateService/Endpoints/user/route.py deleted file mode 100644 index a9bba73..0000000 --- a/ApiServices/TemplateService/Endpoints/user/route.py +++ /dev/null @@ -1,72 +0,0 @@ -import uuid - -from fastapi import APIRouter, Header -from typing import Any - -from ApiDefaults.config import api_config -from Events.user.cluster import UserRouterCluster -from ApiControllers.providers.token_provider import TokenProvider -from ApiControllers.abstracts.default_validations import CommonHeaders -from Controllers.Postgres.pagination import PaginateOnly - -user_route = APIRouter(prefix="/user", tags=["User"]) - - -@user_route.post( - path="/list", - description="List users endpoint", - operation_id="1aca3094-fe80-4e0f-a460-1a506419082a", -) -def user_list_route( - data: PaginateOnly, - headers: CommonHeaders, -): - """ - List users endpoint - """ - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - event_founder_dict = dict(endpoint_code=headers.operation_id, token=token_object) - event_key = TokenProvider.retrieve_event_codes(**event_founder_dict) - FoundCluster = UserRouterCluster.get_event_cluster("UserList") - event_cluster_matched = FoundCluster.match_event(event_key=event_key) - return event_cluster_matched.event_callable(data=data) - - -@user_route.post( - path="/create", - description="Create users endpoint", - operation_id="9686211f-4260-485d-8076-186c22c053aa", -) -def user_create_route( - data: Any, - headers: CommonHeaders, -): - """ - Create users endpoint - """ - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - event_founder_dict = dict(endpoint_code=headers.operation_id, token=token_object) - event_key = TokenProvider.retrieve_event_codes(**event_founder_dict) - FoundCluster = UserRouterCluster.get_event_cluster("UserCreate") - event_cluster_matched = FoundCluster.match_event(event_key=event_key) - return event_cluster_matched.event_callable(data=data) - - -@user_route.post( - path="/update", - description="Update users endpoint", - operation_id="268e887b-5ff5-4f99-b1be-7e127e28a198", -) -def user_update_route( - data: Any, - headers: CommonHeaders, -): - """ - Update users endpoint - """ - token_object = TokenProvider.get_dict_from_redis(token=headers.token) - event_founder_dict = dict(endpoint_code=headers.operation_id, token=token_object) - event_key = TokenProvider.retrieve_event_codes(**event_founder_dict) - FoundCluster = UserRouterCluster.get_event_cluster("UserUpdate") - event_cluster_matched = FoundCluster.match_event(event_key=event_key) - return event_cluster_matched.event_callable(data=data) \ No newline at end of file diff --git a/ApiServices/TemplateService/Events/__init__.py b/ApiServices/TemplateService/Events/__init__.py deleted file mode 100644 index 20b9623..0000000 --- a/ApiServices/TemplateService/Events/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -from .people.cluster import PeopleRouterCluster -from .user.cluster import UserRouterCluster - - -__all__ = [ - "PeopleRouterCluster", - "UserRouterCluster", -] diff --git a/ApiServices/TemplateService/Events/people/cluster.py b/ApiServices/TemplateService/Events/people/cluster.py deleted file mode 100644 index fbd2519..0000000 --- a/ApiServices/TemplateService/Events/people/cluster.py +++ /dev/null @@ -1,25 +0,0 @@ -from ApiControllers.abstracts.event_clusters import EventCluster, RouterCluster -from .supers_events import ( - SupersPeopleCreateEvent, - SupersPeopleUpdateEvent, - SupersPeopleListEvent, -) - -PeopleRouterCluster = RouterCluster(name="PeopleRouterCluster") - -PeopleEventClusterList = EventCluster( - name="PeopleList", endpoint_uu_id="f102db46-031a-43e4-966a-dae6896f985b" -) -PeopleEventClusterList.add_event(SupersPeopleListEvent) -PeopleEventClusterCreate = EventCluster( - name="PeopleCreate", endpoint_uu_id="eb465fde-337f-4b81-94cf-28c6d4f2b1b6" -) -PeopleEventClusterCreate.add_event(SupersPeopleCreateEvent) -PeopleEventClusterUpdate = EventCluster( - name="PeopleUpdate", endpoint_uu_id="c9e5ba69-6915-43f5-8f9c-a5c2aa865b89" -) -PeopleEventClusterUpdate.add_event(SupersPeopleUpdateEvent) - -PeopleRouterCluster.set_event_cluster(PeopleEventClusterList) -PeopleRouterCluster.set_event_cluster(PeopleEventClusterCreate) -PeopleRouterCluster.set_event_cluster(PeopleEventClusterUpdate) diff --git a/ApiServices/TemplateService/Events/people/supers_events.py b/ApiServices/TemplateService/Events/people/supers_events.py deleted file mode 100644 index b372619..0000000 --- a/ApiServices/TemplateService/Events/people/supers_events.py +++ /dev/null @@ -1,103 +0,0 @@ -from ApiControllers.abstracts.event_clusters import Event -from Validations.people.validations import ( - REQUESTAWMXNTKMGPPOJWRCTZUBADNFLQDBDYVQAORFAVCSXUUHEBQHCEPCSKFBADBODFDBPYKOVINV, -) -from Controllers.Postgres.pagination import ( - ListOptions, - Pagination, - PaginationResult, - PaginateOnly, -) -from Controllers.Postgres.response import EndpointResponse -from Schemas import People - - -SupersPeopleCreateEvent = Event( - name="supers_people_create", - key="ec4c2404-a61b-46c7-bbdf-ce3357e6cf41", - request_validator=None, # TODO: Add request validator - response_validator=None, # TODO: Add response validator - description="Create events of people endpoint", -) - -# Update endpoint -SupersPeopleUpdateEvent = Event( - name="supers_people_update", - key="91e77de4-9f29-4309-b121-4aad256d440c", - request_validator=None, # TODO: Add request validator - response_validator=None, # TODO: Add response validator - description="Update events of people endpoint", -) - -# List endpoint -SupersPeopleListEvent = Event( - name="supers_people_list", - key="6828d280-e587-400d-a622-c318277386c3", - request_validator=None, # TODO: Add request validator - response_validator=None, # TODO: Add response validator - description="List events of people endpoint", -) - - -def supers_people_create_callable(): - """ - Example callable method - """ - - return { - "completed": True, - "message": "Example callable method 2", - "info": { - "host": "example_host", - "user_agent": "example_user_agent", - }, - } - - -SupersPeopleCreateEvent.event_callable = supers_people_create_callable - - -def supers_people_update_callable(): - """ - Example callable method - """ - - return { - "completed": True, - "message": "Example callable method 2", - "info": { - "host": "example_host", - "user_agent": "example_user_agent", - }, - } - - -SupersPeopleUpdateEvent.event_callable = supers_people_update_callable - - -def supers_people_list_callable(data: PaginateOnly): - """ - Example callable method - """ - list_options = PaginateOnly(**data.model_dump()) - with People.new_session() as db_session: - if list_options.query: - people_list = People.filter_all( - *People.convert(list_options.query), db=db_session - ) - else: - people_list = People.filter_all(db=db_session) - pagination = Pagination(data=people_list) - pagination.change(**list_options.model_dump()) - pagination_result = PaginationResult( - data=people_list, - pagination=pagination, - response_model=REQUESTAWMXNTKMGPPOJWRCTZUBADNFLQDBDYVQAORFAVCSXUUHEBQHCEPCSKFBADBODFDBPYKOVINV, - ) - return EndpointResponse( - message="MSG0002-LIST", - pagination_result=pagination_result, - ).response - - -SupersPeopleListEvent.event_callable = supers_people_list_callable diff --git a/ApiServices/TemplateService/Events/user/cluster.py b/ApiServices/TemplateService/Events/user/cluster.py deleted file mode 100644 index 58b602b..0000000 --- a/ApiServices/TemplateService/Events/user/cluster.py +++ /dev/null @@ -1,27 +0,0 @@ -from ApiControllers.abstracts.event_clusters import EventCluster, RouterCluster -from .supers_events import ( - SuperUsersListEvent, - SuperUsersCreateEvent, - SuperUsersUpdateEvent, -) - -UserRouterCluster = RouterCluster(name="UserRouterCluster") - -UserEventClusterList = EventCluster( - name="UserList", endpoint_uu_id="1aca3094-fe80-4e0f-a460-1a506419082a" -) -UserEventClusterList.add_event(SuperUsersListEvent) - -UserEventClusterCreate = EventCluster( - name="UserCreate", endpoint_uu_id="9686211f-4260-485d-8076-186c22c053aa" -) -UserEventClusterCreate.add_event(SuperUsersCreateEvent) - -UserEventClusterUpdate = EventCluster( - name="UserUpdate", endpoint_uu_id="268e887b-5ff5-4f99-b1be-7e127e28a198" -) -UserEventClusterUpdate.add_event(SuperUsersUpdateEvent) - -UserRouterCluster.set_event_cluster(UserEventClusterList) -UserRouterCluster.set_event_cluster(UserEventClusterCreate) -UserRouterCluster.set_event_cluster(UserEventClusterUpdate) diff --git a/ApiServices/TemplateService/Events/user/supers_events.py b/ApiServices/TemplateService/Events/user/supers_events.py deleted file mode 100644 index 679e2a6..0000000 --- a/ApiServices/TemplateService/Events/user/supers_events.py +++ /dev/null @@ -1,94 +0,0 @@ -from ApiControllers.abstracts.event_clusters import Event -from Controllers.Postgres.pagination import Pagination, PaginationResult, PaginateOnly -from Controllers.Postgres.response import EndpointResponse -from Schemas import Users - - -# List endpoint -SuperUsersListEvent = Event( - name="supers_users_list", - key="341b394f-9f11-4abb-99e7-4b27fa6bf012", - request_validator=None, # TODO: Add request validator - response_validator=None, # TODO: Add response validator - description="List events of users endpoint", -) - -# Create endpoint -SuperUsersCreateEvent = Event( - name="supers_users_create", - key="4e7e189e-e015-4ff8-902d-60138cbc77a6", - request_validator=None, # TODO: Add request validator - response_validator=None, # TODO: Add response validator - description="Create events of users endpoint", -) - -# Update endpoint -SuperUsersUpdateEvent = Event( - name="supers_users_update", - key="efa4aa4a-d414-4391-91ee-97eb617b7755", - request_validator=None, # TODO: Add request validator - response_validator=None, # TODO: Add response validator - description="Update events of users endpoint", -) - - -def supers_users_list_callable(list_options: PaginateOnly): - """ - Example callable method - """ - list_options = PaginateOnly(**list_options.model_dump()) - with Users.new_session() as db_session: - if list_options.query: - users_list = Users.filter_all( - *Users.convert(list_options.query), db=db_session - ) - else: - users_list = Users.filter_all(db=db_session) - pagination = Pagination(data=users_list) - pagination.change(**list_options.model_dump()) - pagination_result = PaginationResult( - data=users_list, - pagination=pagination, - # response_model="", - ).pagination.as_dict - return EndpointResponse( - message="MSG0003-LIST", - pagination_result=pagination_result, - ).response - - -SuperUsersListEvent.event_callable = supers_users_list_callable - - -def supers_users_create_callable(): - """ - Example callable method - """ - return { - "completed": True, - "message": "Example callable method 2", - "info": { - "host": "example_host", - "user_agent": "example_user_agent", - }, - } - - -SuperUsersCreateEvent.event_callable = supers_users_create_callable - - -def supers_users_update_callable(): - """ - Example callable method - """ - return { - "completed": True, - "message": "Example callable method 2", - "info": { - "host": "example_host", - "user_agent": "example_user_agent", - }, - } - - -SuperUsersUpdateEvent.event_callable = supers_users_update_callable diff --git a/ApiServices/TemplateService/Validations/__init__.py b/ApiServices/TemplateService/Validations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/ApiServices/TemplateService/Validations/lists/validations.py b/ApiServices/TemplateService/Validations/lists/validations.py deleted file mode 100644 index d3e7125..0000000 --- a/ApiServices/TemplateService/Validations/lists/validations.py +++ /dev/null @@ -1,26 +0,0 @@ -from pydantic import BaseModel -from typing import Optional - - -class ListOptions(BaseModel): - """ - Query for list option abilities - """ - - page: Optional[int] = 1 - size: Optional[int] = 10 - order_field: Optional[str] = "id" - order_type: Optional[str] = "asc" - # include_joins: Optional[list] = None - query: Optional[dict] = None - - -class PaginateOnly(BaseModel): - """ - Query for list option abilities - """ - - page: Optional[int] = 1 - size: Optional[int] = 10 - order_field: Optional[str] = "id" - order_type: Optional[str] = "asc" diff --git a/ApiServices/TemplateService/Validations/people/validations.py b/ApiServices/TemplateService/Validations/people/validations.py deleted file mode 100644 index 7ccfe77..0000000 --- a/ApiServices/TemplateService/Validations/people/validations.py +++ /dev/null @@ -1,24 +0,0 @@ -from pydantic import BaseModel - - -class REQUESTAWMXNTKMGPPOJWRCTZUBADNFLQDBDYVQAORFAVCSXUUHEBQHCEPCSKFBADBODFDBPYKOVINV( - BaseModel -): - uu_id: str - created_at: str - updated_at: str - person_tag: str - expiry_starts: str - expiry_ends: str - firstname: str - middle_name: str - surname: str - birth_date: str - birth_place: str - sex_code: str - country_code: str - tax_no: str - active: bool - deleted: bool - is_confirmed: bool - is_notification_send: bool diff --git a/ApiServices/TemplateService/Validations/user/validations.py b/ApiServices/TemplateService/Validations/user/validations.py deleted file mode 100644 index a24bcd9..0000000 --- a/ApiServices/TemplateService/Validations/user/validations.py +++ /dev/null @@ -1,33 +0,0 @@ -from pydantic import BaseModel - - -class FF7C859A068EB4583A47AB5924EC8C19A033881823FBA42EAAD089BF7AC8059CE(BaseModel): - """ - a13143ade48954c2ba3f86869e027de5b28c8a9b619bf4ef28264a8e375371601 - """ - - pass - - -class F1B82565925FF4F5DAD2A36370788305A0A362E031EAC4A9E8BDFF4F35E265A6C(BaseModel): - """ - aa487ab3bfd9e4e6abc2db714ac6197f60bbc9068ac6541e7a815d5b1e969796b - """ - - pass - - -class F3117E7D66FE6471C8452B97AB504EF0C29822B6395CA4D65A18FDD563F0EC8D7(BaseModel): - """ - a1bf55a214b684438a97a47e4f097ac7ae27b0dff03c4475cbd4301e24a032aac - """ - - pass - - -class F33B4DE316B8A456480DD6ED5B5E2D35A2E6FCAF74BAC40D7A2970D318B153F85(BaseModel): - """ - F33B4DE316B8A456480DD6ED5B5E2D35A2E6FCAF74BAC40D7A2970D318B153F85 - """ - - pass diff --git a/Controllers/Postgres/response.py b/Controllers/Postgres/response.py index 3a8a84b..7a672f1 100644 --- a/Controllers/Postgres/response.py +++ b/Controllers/Postgres/response.py @@ -134,3 +134,21 @@ class EndpointResponse(BaseModel): "data": resutl_data, "pagination": pagination_dict, } + + +class CreateEndpointResponse(BaseModel): + """Create endpoint response model.""" + + completed: bool = True + message: str = "Success" + data: Any + + @property + def response(self): + """Convert response to dictionary format.""" + return { + "completed": self.completed, + "message": self.message, + "data": self.data, + } + diff --git a/WebServices/client-frontend/src/apicalls/api-fetcher.ts b/WebServices/client-frontend/src/apicalls/api-fetcher.ts new file mode 100644 index 0000000..112a305 --- /dev/null +++ b/WebServices/client-frontend/src/apicalls/api-fetcher.ts @@ -0,0 +1,177 @@ +"use server"; +import { retrieveAccessToken } from "@/apicalls/cookies/token"; +import { + DEFAULT_RESPONSE, + defaultHeaders, + FetchOptions, + HttpMethod, + ApiResponse, + DEFAULT_TIMEOUT, +} from "./basics"; + +/** + * Creates a promise that rejects after a specified timeout + * @param ms Timeout in milliseconds + * @param controller AbortController to abort the fetch request + * @returns A promise that rejects after the timeout + */ +const createTimeoutPromise = ( + ms: number, + controller: AbortController +): Promise => { + return new Promise((_, reject) => { + setTimeout(() => { + controller.abort(); + reject(new Error(`Request timed out after ${ms}ms`)); + }, ms); + }); +}; + +/** + * Prepares a standardized API response + * @param response The response data + * @param statusCode HTTP status code + * @returns Standardized API response + */ +const prepareResponse = ( + response: T, + statusCode: number +): ApiResponse => { + try { + return { + status: statusCode, + data: response || ({} as T), + }; + } catch (error) { + console.error("Error preparing response:", error); + return { + ...DEFAULT_RESPONSE, + error: "Response parsing error", + } as ApiResponse; + } +}; + +/** + * Core fetch function with timeout and error handling + * @param url The URL to fetch + * @param options Fetch options + * @param headers Request headers + * @param payload Request payload + * @returns API response + */ +async function coreFetch( + url: string, + options: FetchOptions = {}, + headers: Record = defaultHeaders, + payload?: any +): Promise> { + const { method = "POST", cache = false, timeout = DEFAULT_TIMEOUT } = options; + + try { + const controller = new AbortController(); + const signal = controller.signal; + + const fetchOptions: RequestInit = { + method, + headers, + cache: cache ? "force-cache" : "no-cache", + signal, + }; + + // Add body if needed + if (method !== "GET" && payload) { + fetchOptions.body = JSON.stringify( + // Handle special case for updateDataWithToken + payload.payload ? payload.payload : payload + ); + } + + // Create timeout promise + const timeoutPromise = createTimeoutPromise(timeout, controller); + + // Race between fetch and timeout + const response = (await Promise.race([ + fetch(url, fetchOptions), + timeoutPromise, + ])) as Response; + + const responseJson = await response.json(); + + if (process.env.NODE_ENV !== "production") { + console.log("Fetching:", url, fetchOptions); + console.log("Response:", responseJson); + } + + return prepareResponse(responseJson, response.status); + } catch (error) { + console.error(`Fetch error (${url}):`, error); + return { + ...DEFAULT_RESPONSE, + error: error instanceof Error ? error.message : "Network error", + } as ApiResponse; + } +} + +/** + * Fetch data without authentication + */ +async function fetchData( + endpoint: string, + payload?: any, + method: HttpMethod = "POST", + cache: boolean = false, + timeout: number = DEFAULT_TIMEOUT +): Promise> { + return coreFetch( + endpoint, + { method, cache, timeout }, + defaultHeaders, + payload + ); +} + +/** + * Fetch data with authentication token + */ +async function fetchDataWithToken( + endpoint: string, + payload?: any, + method: HttpMethod = "POST", + cache: boolean = false, + timeout: number = DEFAULT_TIMEOUT +): Promise> { + const accessToken = (await retrieveAccessToken()) || ""; + const headers = { + ...defaultHeaders, + "eys-acs-tkn": accessToken, + }; + + return coreFetch(endpoint, { method, cache, timeout }, headers, payload); +} + +/** + * Update data with authentication token and UUID + */ +async function updateDataWithToken( + endpoint: string, + uuid: string, + payload?: any, + method: HttpMethod = "POST", + cache: boolean = false, + timeout: number = DEFAULT_TIMEOUT +): Promise> { + const accessToken = (await retrieveAccessToken()) || ""; + const headers = { + ...defaultHeaders, + "eys-acs-tkn": accessToken, + }; + + return coreFetch( + `${endpoint}/${uuid}`, + { method, cache, timeout }, + headers, + payload + ); +} + +export { fetchData, fetchDataWithToken, updateDataWithToken }; diff --git a/WebServices/client-frontend/src/apicalls/api-fetcher.tsx b/WebServices/client-frontend/src/apicalls/api-fetcher.tsx deleted file mode 100644 index c31b0c3..0000000 --- a/WebServices/client-frontend/src/apicalls/api-fetcher.tsx +++ /dev/null @@ -1,144 +0,0 @@ -"use server"; -import { retrieveAccessToken } from "@/apicalls/cookies/token"; - -const defaultHeaders = { - accept: "application/json", - language: "tr", - domain: "evyos.com.tr", - tz: "GMT+3", - "Content-type": "application/json", -}; - -const DefaultResponse = { - error: "Hata tipi belirtilmedi", - status: "500", - data: {}, -}; - -const cacheList = ["no-cache", "no-store", "force-cache", "only-if-cached"]; - -const prepareResponse = (response: any, statusCode: number) => { - try { - return { - status: statusCode, - data: response || {}, - }; - } catch (error) { - console.error("Error preparing response:", error); - return { - ...DefaultResponse, - error: "Response parsing error", - }; - } -}; - -const fetchData = async ( - endpoint: string, - payload: any, - method: string = "POST", - cache: boolean = false -) => { - try { - const headers = { - ...defaultHeaders, - }; - const fetchOptions: RequestInit = { - method, - headers, - cache: cache ? "force-cache" : "no-cache", - }; - - if (method === "POST" && payload) { - fetchOptions.body = JSON.stringify(payload); - } - - const response = await fetch(endpoint, fetchOptions); - const responseJson = await response.json(); - console.log("Fetching:", endpoint, fetchOptions); - console.log("Response:", responseJson); - return prepareResponse(responseJson, response.status); - } catch (error) { - console.error("Fetch error:", error); - return { - ...DefaultResponse, - error: error instanceof Error ? error.message : "Network error", - }; - } -}; - -const updateDataWithToken = async ( - endpoint: string, - uuid: string, - payload: any, - method: string = "POST", - cache: boolean = false -) => { - const accessToken = (await retrieveAccessToken()) || ""; - const headers = { - ...defaultHeaders, - "eys-acs-tkn": accessToken, - }; - - try { - const fetchOptions: RequestInit = { - method, - headers, - cache: cache ? "force-cache" : "no-cache", - }; - - if (method !== "GET" && payload) { - fetchOptions.body = JSON.stringify(payload.payload); - } - - const response = await fetch(`${endpoint}/${uuid}`, fetchOptions); - const responseJson = await response.json(); - console.log("Fetching:", `${endpoint}/${uuid}`, fetchOptions); - console.log("Response:", responseJson); - return prepareResponse(responseJson, response.status); - } catch (error) { - console.error("Update error:", error); - return { - ...DefaultResponse, - error: error instanceof Error ? error.message : "Network error", - }; - } -}; - -const fetchDataWithToken = async ( - endpoint: string, - payload: any, - method: string = "POST", - cache: boolean = false -) => { - const accessToken = (await retrieveAccessToken()) || ""; - const headers = { - ...defaultHeaders, - "eys-acs-tkn": accessToken, - }; - - try { - const fetchOptions: RequestInit = { - method, - headers, - cache: cache ? "force-cache" : "no-cache", - }; - - if (method === "POST" && payload) { - fetchOptions.body = JSON.stringify(payload); - } - - const response = await fetch(endpoint, fetchOptions); - const responseJson = await response.json(); - console.log("Fetching:", endpoint, fetchOptions); - console.log("Response:", responseJson); - return prepareResponse(responseJson, response.status); - } catch (error) { - console.error("Fetch with token error:", error); - return { - ...DefaultResponse, - error: error instanceof Error ? error.message : "Network error", - }; - } -}; - -export { fetchData, fetchDataWithToken, updateDataWithToken }; diff --git a/WebServices/client-frontend/src/apicalls/basics.ts b/WebServices/client-frontend/src/apicalls/basics.ts index 46f4d58..b74f7a2 100644 --- a/WebServices/client-frontend/src/apicalls/basics.ts +++ b/WebServices/client-frontend/src/apicalls/basics.ts @@ -3,18 +3,34 @@ const formatServiceUrl = (url: string) => { return url.startsWith("http") ? url : `http://${url}`; }; -export const baseUrlAuth = formatServiceUrl( +const baseUrlAuth = formatServiceUrl( process.env.NEXT_PUBLIC_AUTH_SERVICE_URL || "auth_service:8001" ); -export const baseUrlPeople = formatServiceUrl( +const baseUrlPeople = formatServiceUrl( process.env.NEXT_PUBLIC_VALIDATION_SERVICE_URL || "identity_service:8002" ); -// export const baseUrlEvent = formatServiceUrl( -// process.env.NEXT_PUBLIC_EVENT_SERVICE_URL || "eventservice:8888" -// ); -export const tokenSecret = process.env.TOKENSECRET_90 || ""; +const baseUrlApplication = formatServiceUrl( + process.env.NEXT_PUBLIC_MANAGEMENT_SERVICE_URL || "management_service:8004" +); -export const cookieObject: any = { +// Types for better type safety +type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH"; + +interface ApiResponse { + status: number; + data: T; + error?: string; +} + +interface FetchOptions { + method?: HttpMethod; + cache?: boolean; + timeout?: number; +} + +const tokenSecret = process.env.TOKENSECRET_90 || ""; + +const cookieObject: any = { httpOnly: true, path: "/", sameSite: "none", @@ -23,53 +39,29 @@ export const cookieObject: any = { priority: "high", }; -interface FilterListInterface { - page?: number | null | undefined; - size?: number | null | undefined; - orderField?: string | null | undefined; - orderType?: string | null | undefined; - includeJoins?: any[] | null | undefined; - query?: any | null | undefined; -} +// Constants +const DEFAULT_TIMEOUT = 10000; // 10 seconds +const defaultHeaders = { + accept: "application/json", + language: "tr", + domain: "management.com.tr", + tz: "GMT+3", + "Content-type": "application/json", +}; +const DEFAULT_RESPONSE: ApiResponse = { + error: "Hata tipi belirtilmedi", + status: 500, + data: {}, +}; -class FilterList { - page: number; - size: number; - orderField: string; - orderType: string; - includeJoins: any[]; - query: any; - - constructor({ - page = 1, - size = 5, - orderField = "id", - orderType = "asc", - includeJoins = [], - query = {}, - }: FilterListInterface = {}) { - this.page = page ?? 1; - this.size = size ?? 5; - this.orderField = orderField ?? "uu_id"; - this.orderType = orderType ?? "asc"; - this.orderType = this.orderType.startsWith("a") ? "asc" : "desc"; - this.includeJoins = includeJoins ?? []; - this.query = query ?? {}; - } - - filter() { - return { - page: this.page, - size: this.size, - orderField: this.orderField, - orderType: this.orderType, - includeJoins: this.includeJoins, - query: this.query, - }; - } -} - -const defaultFilterList = new FilterList({}); - -export { FilterList, defaultFilterList }; -export type { FilterListInterface }; +export type { HttpMethod, ApiResponse, FetchOptions }; +export { + DEFAULT_TIMEOUT, + DEFAULT_RESPONSE, + defaultHeaders, + baseUrlAuth, + baseUrlPeople, + baseUrlApplication, + tokenSecret, + cookieObject, +}; diff --git a/WebServices/client-frontend/src/components/common/FormDisplay/CreateComponent.tsx b/WebServices/client-frontend/src/components/common/FormDisplay/CreateComponent.tsx index 77d3756..7deeb92 100644 --- a/WebServices/client-frontend/src/components/common/FormDisplay/CreateComponent.tsx +++ b/WebServices/client-frontend/src/components/common/FormDisplay/CreateComponent.tsx @@ -2,29 +2,17 @@ import React, { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card"; -import { CreateComponentProps } from "./types"; +import { CreateComponentProps, FieldDefinition } from "./types"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Checkbox } from "@/components/ui/checkbox"; import { zodResolver } from "@hookform/resolvers/zod"; -import { useForm } from "react-hook-form"; +import { useForm, SubmitHandler } from "react-hook-form"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { AlertCircle } from "lucide-react"; -// Import field definitions type -interface FieldDefinition { - type: string; - group: string; - label: string; - options?: string[]; - readOnly?: boolean; - required?: boolean; - defaultValue?: any; - name?: string; -} - export function CreateComponent({ refetch, setMode, @@ -33,6 +21,7 @@ export function CreateComponent({ lang, translations, formProps = {}, + apiUrl, }: CreateComponentProps) { const t = translations[lang as keyof typeof translations] || {}; @@ -75,7 +64,7 @@ export function CreateComponent({ formState: { errors }, setValue, watch, - } = useForm({ + } = useForm>({ defaultValues, resolver: validationSchema ? zodResolver(validationSchema) : undefined, }); @@ -83,14 +72,26 @@ export function CreateComponent({ const formValues = watch(); // Handle form submission - const onSubmit = async (data: Record) => { + const onSubmit: SubmitHandler> = async (data) => { try { - console.log("Form data to save:", data); + if (apiUrl) { + const createUrl = `${apiUrl}/create`; + const response = await fetch(createUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + }); + console.log("Response:", response.ok); + if (!response.ok) { + throw new Error(`API error: ${response.status}`); + } - // Here you would make an API call to save the data - // For example: await createApplication(data); + const createdItem = await response.json(); + console.log("Created item:", createdItem); + } - // Mock API call success if (refetch) refetch(); setMode("list"); setSelectedItem(null); @@ -140,13 +141,13 @@ export function CreateComponent({ return (
{errorMessage && ( @@ -159,13 +160,13 @@ export function CreateComponent({ return (