refactor: remove backward compatibility code for pre-launch baseline

Clean up accumulated backward-compat shims, deprecated wrappers, unused
aliases, and legacy code across the codebase. Since the platform is not
live yet, this establishes a clean baseline.

Changes:
- Delete deprecated middleware/context.py (RequestContext, get_request_context)
- Remove unused factory get_store_email_settings_service()
- Remove deprecated pagination_full macro, /admin/platform-homepage route
- Remove ConversationResponse, InvoiceSettings* unprefixed aliases
- Simplify celery_config.py (remove empty LEGACY_TASK_MODULES)
- Standardize billing exceptions: *Error aliases → *Exception names
- Consolidate duplicate TierNotFoundError/FeatureNotFoundError classes
- Remove deprecated is_admin_request() from Store/PlatformContextManager
- Remove is_platform_default field, MediaUploadResponse legacy flat fields
- Remove MediaItemResponse.url alias, update JS to use file_url
- Update all affected tests and documentation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-13 21:58:59 +01:00
parent 531487f5c9
commit 8968e7d9cd
31 changed files with 172 additions and 774 deletions

View File

@@ -6,7 +6,7 @@ Admin pages for managing platform and store content pages.
"""
from fastapi import APIRouter, Depends, Path, Request
from fastapi.responses import HTMLResponse, RedirectResponse
from fastapi.responses import HTMLResponse
from sqlalchemy.orm import Session
from app.api.deps import get_db, require_menu_access
@@ -22,22 +22,6 @@ router = APIRouter()
# ============================================================================
@router.get("/platform-homepage", include_in_schema=False)
async def admin_platform_homepage_manager(
request: Request,
current_user: User = Depends(require_menu_access("platforms", FrontendType.ADMIN)),
db: Session = Depends(get_db),
):
"""
Deprecated: Redirects to platforms page.
Platform homepages are now managed via:
- /admin/platforms → Select platform → Homepage button
- Or directly: /admin/content-pages?platform_code={code}&slug=home
"""
return RedirectResponse(url="/admin/platforms", status_code=302)
@router.get("/content-pages", response_class=HTMLResponse, include_in_schema=False)
async def admin_content_pages_list(
request: Request,

View File

@@ -90,7 +90,6 @@ class ContentPageResponse(BaseModel):
show_in_header: bool
show_in_legal: bool
is_platform_page: bool = False
is_platform_default: bool = False # Deprecated: use is_platform_page
is_store_default: bool = False
is_store_override: bool = False
page_tier: str | None = None

View File

@@ -37,7 +37,6 @@ class MediaItemResponse(BaseModel):
filename: str
original_filename: str | None = None
file_url: str
url: str | None = None # Alias for file_url for JS compatibility
thumbnail_url: str | None = None
media_type: str # image, video, document
mime_type: str | None = None
@@ -53,11 +52,6 @@ class MediaItemResponse(BaseModel):
model_config = {"from_attributes": True}
def model_post_init(self, __context: Any) -> None:
"""Set url from file_url if not provided."""
if self.url is None:
object.__setattr__(self, "url", self.file_url)
class MediaListResponse(BaseModel):
"""Paginated list of media items."""
@@ -80,13 +74,6 @@ class MediaUploadResponse(BaseModel):
success: bool = True
message: str | None = None
media: MediaItemResponse | None = None
# Legacy fields for backwards compatibility
id: int | None = None
file_url: str | None = None
thumbnail_url: str | None = None
filename: str | None = None
file_size: int | None = None
media_type: str | None = None
class UploadedFileInfo(BaseModel):

View File

@@ -15,7 +15,6 @@ from app.modules.cms.services.media_service import (
)
from app.modules.cms.services.store_email_settings_service import (
StoreEmailSettingsService,
get_store_email_settings_service, # Deprecated: use store_email_settings_service
store_email_settings_service,
)
from app.modules.cms.services.store_theme_service import (
@@ -32,5 +31,4 @@ __all__ = [
"store_theme_service",
"StoreEmailSettingsService",
"store_email_settings_service",
"get_store_email_settings_service", # Deprecated
]

View File

@@ -481,14 +481,3 @@ class StoreEmailSettingsService:
# Module-level service instance (singleton pattern)
store_email_settings_service = StoreEmailSettingsService()
# Deprecated: Factory function for backwards compatibility
def get_store_email_settings_service(db: Session) -> StoreEmailSettingsService:
"""
Factory function to get a StoreEmailSettingsService instance.
Deprecated: Use the singleton `store_email_settings_service` instead and pass
`db` to individual methods.
"""
return store_email_settings_service

View File

@@ -262,9 +262,9 @@ function mediaPickerMixin(storeIdGetter, multiSelect = false) {
*/
setMainImage(media) {
if (this.form) {
this.form.primary_image_url = media.url;
this.form.primary_image_url = media.file_url;
}
mediaPickerLog.info('Main image set:', media.url);
mediaPickerLog.info('Main image set:', media.file_url);
},
/**
@@ -272,13 +272,13 @@ function mediaPickerMixin(storeIdGetter, multiSelect = false) {
*/
addAdditionalImages(mediaList) {
if (this.form && Array.isArray(this.form.additional_images)) {
const newUrls = mediaList.map(m => m.url);
const newUrls = mediaList.map(m => m.file_url);
this.form.additional_images = [
...this.form.additional_images,
...newUrls
];
}
mediaPickerLog.info('Additional images added:', mediaList.map(m => m.url));
mediaPickerLog.info('Additional images added:', mediaList.map(m => m.file_url));
},
/**

View File

@@ -73,7 +73,7 @@ function storeContentPagesManager() {
// Platform pages - filter to only show actual platform defaults
const allPages = platformResponse.data || platformResponse || [];
this.platformPages = allPages.filter(p => p.is_platform_default);
this.platformPages = allPages.filter(p => p.is_platform_page);
// Store's custom pages (includes overrides)
this.customPages = storeResponse.data || storeResponse || [];