feat: add logging, marketplace, and admin enhancements

Database & Migrations:
- Add application_logs table migration for hybrid cloud logging
- Add companies table migration and restructure vendor relationships

Logging System:
- Implement hybrid logging system (database + file)
- Add log_service for centralized log management
- Create admin logs page with filtering and viewing capabilities
- Add init_log_settings.py script for log configuration
- Enhance core logging with database integration

Marketplace Integration:
- Add marketplace admin page with product management
- Create marketplace vendor page with product listings
- Implement marketplace.js for both admin and vendor interfaces
- Add marketplace integration documentation

Admin Enhancements:
- Add imports management page and functionality
- Create settings page for admin configuration
- Add vendor themes management page
- Enhance vendor detail and edit pages
- Improve code quality dashboard and violation details
- Add logs viewing and management
- Update icons guide and shared icon system

Architecture & Documentation:
- Document frontend structure and component architecture
- Document models structure and relationships
- Add vendor-in-token architecture documentation
- Add vendor RBAC (role-based access control) documentation
- Document marketplace integration patterns
- Update architecture patterns documentation

Infrastructure:
- Add platform static files structure (css, img, js)
- Move architecture_scan.py to proper models location
- Update model imports and registrations
- Enhance exception handling
- Update dependency injection patterns

UI/UX:
- Improve vendor edit interface
- Update admin user interface
- Enhance page templates documentation
- Add vendor marketplace interface
This commit is contained in:
2025-12-01 21:51:07 +01:00
parent 915734e9b4
commit cc74970223
56 changed files with 8440 additions and 202 deletions

View File

@@ -54,6 +54,18 @@ from .cart import (
ProductNotAvailableForCartException,
)
# Company exceptions
from .company import (
CompanyAlreadyExistsException,
CompanyHasVendorsException,
CompanyNotActiveException,
CompanyNotFoundException,
CompanyNotVerifiedException,
CompanyValidationException,
InvalidCompanyDataException,
UnauthorizedCompanyAccessException,
)
# Customer exceptions
from .customer import (
CustomerAlreadyExistsException,
@@ -284,6 +296,15 @@ __all__ = [
"InsufficientInventoryForCartException",
"InvalidCartQuantityException",
"ProductNotAvailableForCartException",
# Company exceptions
"CompanyNotFoundException",
"CompanyAlreadyExistsException",
"CompanyNotActiveException",
"CompanyNotVerifiedException",
"UnauthorizedCompanyAccessException",
"InvalidCompanyDataException",
"CompanyValidationException",
"CompanyHasVendorsException",
# MarketplaceProduct exceptions
"MarketplaceProductNotFoundException",
"MarketplaceProductAlreadyExistsException",

View File

@@ -364,8 +364,30 @@ def _redirect_to_login(request: Request) -> RedirectResponse:
logger.debug("Redirecting to /admin/login")
return RedirectResponse(url="/admin/login", status_code=302)
if context_type == RequestContext.VENDOR_DASHBOARD:
logger.debug("Redirecting to /vendor/login")
return RedirectResponse(url="/vendor/login", status_code=302)
# Extract vendor code from the request path
# Path format: /vendor/{vendor_code}/...
path_parts = request.url.path.split('/')
vendor_code = None
# Find vendor code in path
if len(path_parts) >= 3 and path_parts[1] == 'vendor':
vendor_code = path_parts[2]
# Fallback: try to get from request state
if not vendor_code:
vendor = getattr(request.state, "vendor", None)
if vendor:
vendor_code = vendor.subdomain
# Construct proper login URL with vendor code
if vendor_code:
login_url = f"/vendor/{vendor_code}/login"
else:
# Fallback if we can't determine vendor code
login_url = "/vendor/login"
logger.debug(f"Redirecting to {login_url}")
return RedirectResponse(url=login_url, status_code=302)
if context_type == RequestContext.SHOP:
# For shop context, redirect to shop login (customer login)
# Calculate base_url for proper routing (supports domain, subdomain, and path-based access)