From 3316894c2733d58f5c7cb5bbe54128454a3b8c32 Mon Sep 17 00:00:00 2001 From: Samir Boulahtit Date: Sat, 13 Dec 2025 12:57:26 +0100 Subject: [PATCH] fix: resolve all architecture validation warnings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Service layer: - Remove db.commit() calls from credentials_service.py (SVC-006) - Move transaction control to API endpoint level - Rename client.py -> client_service.py (NAM-002) - Rename credentials.py -> credentials_service.py (NAM-002) JavaScript: - Use centralized logger in admin letzshop.js (JS-001) - Replace console.log/error with LogConfig logger Frontend templates: - Use page_header_flex macro for page header (FE-007) - Use error_state macro for error display (FE-003) - Use table_wrapper macro for vendors table (FE-005) - Use modal macro for configuration and orders modals (FE-004) All 31 Letzshop tests pass. Architecture validation: 0 errors, 0 warnings. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- app/api/v1/admin/letzshop.py | 3 + app/api/v1/vendor/letzshop.py | 3 + app/services/letzshop/__init__.py | 4 +- .../letzshop/{client.py => client_service.py} | 2 +- ...{credentials.py => credentials_service.py} | 15 +- app/templates/admin/letzshop.html | 629 ++++++++---------- static/admin/js/letzshop.js | 29 +- 7 files changed, 300 insertions(+), 385 deletions(-) rename app/services/letzshop/{client.py => client_service.py} (99%) rename app/services/letzshop/{credentials.py => credentials_service.py} (97%) diff --git a/app/api/v1/admin/letzshop.py b/app/api/v1/admin/letzshop.py index 3d46f9db..431e6e2b 100644 --- a/app/api/v1/admin/letzshop.py +++ b/app/api/v1/admin/letzshop.py @@ -164,6 +164,7 @@ def create_or_update_vendor_credentials( auto_sync_enabled=credentials_data.auto_sync_enabled, sync_interval_minutes=credentials_data.sync_interval_minutes, ) + db.commit() logger.info( f"Admin {current_admin.email} updated Letzshop credentials for vendor {vendor.name}" @@ -211,6 +212,7 @@ def update_vendor_credentials( auto_sync_enabled=credentials_data.auto_sync_enabled, sync_interval_minutes=credentials_data.sync_interval_minutes, ) + db.commit() except CredentialsNotFoundError: raise ResourceNotFoundException( "LetzshopCredentials", str(vendor_id), @@ -256,6 +258,7 @@ def delete_vendor_credentials( "LetzshopCredentials", str(vendor_id), message=f"Letzshop credentials not configured for vendor {vendor.name}" ) + db.commit() logger.info( f"Admin {current_admin.email} deleted Letzshop credentials for vendor {vendor.name}" diff --git a/app/api/v1/vendor/letzshop.py b/app/api/v1/vendor/letzshop.py index 00613ca9..3795a163 100644 --- a/app/api/v1/vendor/letzshop.py +++ b/app/api/v1/vendor/letzshop.py @@ -131,6 +131,7 @@ def save_credentials( auto_sync_enabled=credentials_data.auto_sync_enabled, sync_interval_minutes=credentials_data.sync_interval_minutes, ) + db.commit() logger.info(f"Vendor user {current_user.email} updated Letzshop credentials") @@ -167,6 +168,7 @@ def update_credentials( auto_sync_enabled=credentials_data.auto_sync_enabled, sync_interval_minutes=credentials_data.sync_interval_minutes, ) + db.commit() except CredentialsNotFoundError: raise ResourceNotFoundException("LetzshopCredentials", str(vendor_id)) @@ -198,6 +200,7 @@ def delete_credentials( raise ResourceNotFoundException( "LetzshopCredentials", str(current_user.token_vendor_id) ) + db.commit() logger.info(f"Vendor user {current_user.email} deleted Letzshop credentials") return LetzshopSuccessResponse(success=True, message="Letzshop credentials deleted") diff --git a/app/services/letzshop/__init__.py b/app/services/letzshop/__init__.py index ea8d083e..a73f578f 100644 --- a/app/services/letzshop/__init__.py +++ b/app/services/letzshop/__init__.py @@ -9,14 +9,14 @@ Provides: - Fulfillment sync service """ -from .client import ( +from .client_service import ( LetzshopAPIError, LetzshopAuthError, LetzshopClient, LetzshopClientError, LetzshopConnectionError, ) -from .credentials import ( +from .credentials_service import ( CredentialsError, CredentialsNotFoundError, LetzshopCredentialsService, diff --git a/app/services/letzshop/client.py b/app/services/letzshop/client_service.py similarity index 99% rename from app/services/letzshop/client.py rename to app/services/letzshop/client_service.py index 6bf03d91..93963304 100644 --- a/app/services/letzshop/client.py +++ b/app/services/letzshop/client_service.py @@ -1,4 +1,4 @@ -# app/services/letzshop/client.py +# app/services/letzshop/client_service.py """ GraphQL client for Letzshop marketplace API. diff --git a/app/services/letzshop/credentials.py b/app/services/letzshop/credentials_service.py similarity index 97% rename from app/services/letzshop/credentials.py rename to app/services/letzshop/credentials_service.py index 7584fc28..d42a895a 100644 --- a/app/services/letzshop/credentials.py +++ b/app/services/letzshop/credentials_service.py @@ -1,4 +1,4 @@ -# app/services/letzshop/credentials.py +# app/services/letzshop/credentials_service.py """ Letzshop credentials management service. @@ -13,7 +13,7 @@ from sqlalchemy.orm import Session from app.utils.encryption import decrypt_value, encrypt_value, mask_api_key from models.database.letzshop import VendorLetzshopCredentials -from .client import LetzshopClient +from .client_service import LetzshopClient logger = logging.getLogger(__name__) @@ -127,8 +127,7 @@ class LetzshopCredentialsService: ) self.db.add(credentials) - self.db.commit() - self.db.refresh(credentials) + self.db.flush() logger.info(f"Created Letzshop credentials for vendor {vendor_id}") return credentials @@ -168,8 +167,7 @@ class LetzshopCredentialsService: if sync_interval_minutes is not None: credentials.sync_interval_minutes = sync_interval_minutes - self.db.commit() - self.db.refresh(credentials) + self.db.flush() logger.info(f"Updated Letzshop credentials for vendor {vendor_id}") return credentials @@ -189,7 +187,7 @@ class LetzshopCredentialsService: return False self.db.delete(credentials) - self.db.commit() + self.db.flush() logger.info(f"Deleted Letzshop credentials for vendor {vendor_id}") return True @@ -370,8 +368,7 @@ class LetzshopCredentialsService: credentials.last_sync_status = status credentials.last_sync_error = error - self.db.commit() - self.db.refresh(credentials) + self.db.flush() return credentials diff --git a/app/templates/admin/letzshop.html b/app/templates/admin/letzshop.html index 3d610b5b..8b639668 100644 --- a/app/templates/admin/letzshop.html +++ b/app/templates/admin/letzshop.html @@ -1,6 +1,11 @@ {# app/templates/admin/letzshop.html #} {% extends "admin/base.html" %} +{% from 'shared/macros/headers.html' import page_header_flex, refresh_button %} +{% from 'shared/macros/alerts.html' import error_state, alert_dynamic %} +{% from 'shared/macros/tables.html' import table_wrapper, table_header %} +{% from 'shared/macros/modals.html' import modal %} + {% block title %}Letzshop Management{% endblock %} {% block alpine_data %}adminLetzshop(){% endblock %} @@ -11,48 +16,15 @@ {% block content %} -
-
-

- Letzshop Management -

-

- Manage Letzshop integration for all vendors -

-
- -
+{% call page_header_flex(title='Letzshop Management', subtitle='Manage Letzshop integration for all vendors') %} + {{ refresh_button(loading_var='loading', onclick='refreshData()') }} +{% endcall %} -
- -
-

-
- -
+{{ alert_dynamic(type='success', title='', message_var='successMessage', show_condition='successMessage') }} -
- -
-

Error

-

-
- -
+{{ error_state(title='Error', error_var='error', show_condition='error && !loading') }}
@@ -115,338 +87,273 @@
-
-
- +{% call table_wrapper() %} + {{ table_header(['Vendor', 'Status', 'Auto-Sync', 'Last Sync', 'Orders', 'Actions']) }} + + + + + +{% endcall %} + + +
+ + Showing - of + + + + + +
+ + +{% call modal('configModal', 'Configure Letzshop', 'showConfigModal', size='md') %} +

+ Configuring: +

+ +
+ +
+ +
+ + +
+
+ + +
+ +
+ + +
+ + +
+
+ +
+ +
+ + +
+
+ +{% endcall %} + + +{% call modal('ordersModal', 'Vendor Orders', 'showOrdersModal', size='xl') %} +

+ Orders for: +

+ +
+ +
+ +
+
- - - - - - - + + + + + + - - - -
VendorStatusAuto-SyncLast SyncOrdersActions
OrderCustomerTotalStatusDate