Webshop - Admin Deep-Dive Modules (3D, CMS, Marketing, Monitoring)¶
Overview¶
This document specifies legacy admin modules that are high-risk and were not documented in the baseline admin migration spec.
Checklist coverage:
- AD-006 Customer tags management
- AD-010 Subscriptions admin
- AD-022 3D customers/sites/default wheels/model links
- AD-023 3D external vehicles module
- AD-024 CMS history/team/jobs/banners/blog/catalogue/tutorials/events/logos
- AD-025 Marketing signatures/team templates
- AD-028 Spotlight/popular articles admin
- AD-029 Article ads admin (tyre/wheel/accessory)
- AD-030 Slider admin
- AD-031 Banner/adverts admin
- AD-032 Reviews admin
- AD-038 Mailing list templates and text variables
- AD-039 Security monitoring (hacking attempts log)
- AD-040 System settings and cache admin
- VD-004 3D model entity linkage to vehicles
- VD-005 3D wheel entity and associations
- MK-003 Legacy subscription entity and admin
- MK-004 Reviews domain and admin
- MK-005 Blog/tutorial/events/about-us content flows
- MK-006 Sliders/banners/adverts CMS tooling
- MK-007 Customer tags and tag-brand mappings
- MK-010 Team signatures and team pages
- OP-011 Monitoring screens for hacking attempts
- DM-016 3D entities (model/wheel)
Primary legacy evidence:
- _admin/config/menu.php
- _admin/config/routing.php
- _admin/controller/classes/atx/customers/*
- _admin/controller/classes/atx/system/AdminSettingController.php
- _admin/controller/classes/atx/vehicles/simulator/*
- _core/controller/classes/atx/vehicles/simulator/VehicleExternalController.php
- _admin/controller/classes/atx/cms/*, _admin/controller/classes/atx/pages/*, _admin/controller/classes/atx/articles/*, _admin/controller/classes/atx/adverts/*, _admin/controller/classes/atx/mandrill/*
- _core/config/doctrine/customers.CustomerTag.orm.xml
- _core/config/doctrine/customers.CustomerTagBrand.orm.xml
- _core/config/doctrine/customers.Subscription.orm.xml
- _core/config/doctrine/customers.Review.orm.xml
- _core/config/doctrine/vehicles.simulator.ThreeDModel.orm.xml
- _core/config/doctrine/articles.wheels.simulator.ThreeDWheel.orm.xml
- _core/config/doctrine/cms.BlogPost.orm.xml
- _core/config/doctrine/articles.BlogPost.orm.xml
- _core/config/doctrine/pages.Slide.orm.xml
- _core/model/classes/atx/logs/LogError.php
- _core/controller/admin/cms/ajax/a_action.php
Legacy Capabilities (As-Is)¶
Customer Tags, Subscriptions, And Reviews¶
AdminCustomerTagController supports browsing and editing tag configuration that impacts storefront behavior:
- Tag logo upload (/images/customer-tags)
- Parent label translations
- Menu visibility flags per category
- CSS overrides
- Permission matrix JSON
- Product category toggles
- showInOECorner, showPickupFields, showDropshippingDropdown, enableDocumentPortal
- Per-tag invoice notification text (NL/FR/EN)
- Tag-brand rules (CustomerTagBrand) with type (sets or spare_wheels), brand binding, language labels, sort order, login-only flag, and vehicle-brand filters
AdminSubscriptionController exposes a simple list-and-remove flow by email key. Legacy customer_subscription is a small state table (emailAddress, subscribed, reason).
AdminReviewController supports:
- Create/update review (name, quote, rating)
- Optional picture upload to /images/reviews
- Active/inactive toggle from list view
3D Simulator Admin Modules¶
Legacy 3D admin is spread across multiple controllers:
- AdminThreeDModelController: model scans from source assets, default wheel assignment, vehicle model linking, activation/version/comment flags, numberplate position/background, and regeneration jobs
- AdminThreeDWheelController: wheel source discovery, wheel creation/linking, wheel image scan processing
- AdminThreeDCustomerController: simulator site config (site, ip, mail, language, external list id, allow-change-list flag, FB options), numberplate upload/resize, password reset mail
- AdminConsumerController: simulator consumer API key/customer coupling, allowed domains, reseller flags, logo upload
- VehicleExternalController: external vehicle list CRUD, CSV import, link/unlink external vehicles to 3D model IDs, simulator-manage permission checks
Core entity surfaces involved:
- threed_model (ThreeDModel)
- article_wheel_threed (ThreeDWheel)
- external list/vehicle objects (VehicleExternalList, VehicleExternal)
CMS And Marketing Content Modules¶
Legacy content/editor stack is mixed:
- CMS blog stack (
atx\cms\BlogPost): - Categories (
memory,tutorial,events,news) - Multilingual translations and slug/title/teaser/body
- Multi-image media with sort order
-
Optional YouTube video id
-
Legacy posts stack (
atx\articles\BlogPost): - Grouped translations (
groupId+ per-language row) - Tag entities (
blog_post_tag) - Thumbnail/picture handling
- Inline body image extraction path
Additional CMS modules:
- History timeline items with multilingual fields + image uploads
- Team and jobs pages with localized copy and image constraints
- Catalogue items with localized titles and image/url scheduling field
- CMS banners/text variables (AdminTextController) including named text entries (banner, cart-banner)
- Old template module (admin.template_*) and new template module (admin.emailTemplates_*)
Marketing modules:
- Signatures (admin.team_*, mandrill team table)
- Spotlight/popular articles (admin.articlePopular_*) with promo windows and category targeting
- Sliders (admin.slider_*) with priority, category, URL/page/video modes, tag/category targeting, visibility modes, and OE-corner exclusion
- Adverts (admin.adverts_*) with per-language text/CTA, time windows, tag/category targeting, article-group placement, and binary image assets
Security Monitoring (Hacking Attempts)¶
The admin menu contains a dedicated monitoring section (logerror) with hour/day/month tabs and classification drilldown (cms_getLogErrors*).
Legacy log model (LogError) indicates captured fields include:
- identity/network (User, Ip, Agent, browser/system)
- request context (Url, AjaxFunction, AjaxAction, Get, Post)
- security flags (IllegalParam, IllegalExec, IllegalWpAttempt)
- operator notes (Analysis, Reaction)
System Settings And Cache Admin (AD-040)¶
Legacy admin exposes two dedicated dialogs from menu config:
1. systemsettings:
- Loads all settings via admin.setting_getSettings.
- Allows writing values via admin.setting_saveSetting (type, name, value, array).
- Clears aggregate settings cache key (allSettings) after updates.
- Includes direct putOffline / putOnline actions.
cache:- Loads cache overview via
admin.setting_getCache. - Flushes application cache via
admin.setting_flushCache->CacheJanitor::clean().
This module is operationally high impact because it modifies runtime config and availability state from admin UI.
Current Gaps And Risks To Resolve In Migration¶
- Content is split across two blog systems (
articles.BlogPostandcms.BlogPost) with overlapping use-cases. - Upload validation is inconsistent across modules (image mime/type/size/processing rules vary and are often UI-driven).
- Admin mutation actions have weak auditability (limited change history and operator attribution at feature level).
- 3D processing is tightly coupled to mutable filesystem structure and synchronous heavy operations.
- Simulator list-link permissions rely on contextual checks (
bAdminvssimulatorManage) and need explicit RBAC in Symfony. - Monitoring feature wiring is legacy-script based (
cms_getLogErrors*) and should be formalized in modern controllers/services. - Review and subscription modules are operationally shallow (no lifecycle workflow, moderation queue, or retention policy).
- Marketing targeting logic is duplicated across slides and adverts and needs a shared policy layer.
- System settings/cache actions (including offline toggles) are mutable from admin without explicit per-change audit metadata.
Target Migration Specification (Symfony)¶
Scope¶
In-scope for this phase: - Admin customer tags, subscriptions, reviews - Admin 3D modules (models/wheels/sites/external lists) - CMS content modules (posts/blog/history/team/jobs/catalogue/banners/text variables) - Marketing admin modules (signatures/spotlight/slides/adverts) - Monitoring dashboard for hacking-attempt logs
Out-of-scope for this phase: - Public storefront rendering redesign - Full simulator rendering engine rewrite
Domain Rules To Preserve¶
- Customer tags remain the central toggle surface for storefront segmentation and document-portal eligibility.
- 3D site/list management keeps explicit allow-change-list behavior for simulator-managed accounts.
- CMS and marketing content remains multilingual (minimum NL/FR/EN parity where legacy already supports it).
- Slider and advert targeting must preserve customer-tag and customer-category filters, including OE-corner exclusions.
- Monitoring keeps hour/day/month aggregation plus detailed classification view.
Required Improvements¶
- Consolidate dual blog data models behind one canonical content domain.
- Standardize file upload policy (mime sniffing, max size, extension checks, image transform safeguards).
- Enforce explicit RBAC per module/action, not only menu visibility.
- Add immutable audit trail for admin writes (who/when/what before/after).
- Move long-running 3D processing to queue workers with retry and failure visibility.
- Centralize targeting logic (tags/categories/visibility windows) shared by slides and adverts.
- Define subscription and review lifecycle behavior (state transitions, retention, moderation, deletion policy).
- Define monitoring retention/masking policy for sensitive request payload fields.
Suggested Target Components¶
Application services:
- CustomerTagAdminService
- SubscriptionAdminService
- ReviewAdminService
- ThreeDModelAdminService
- ThreeDSiteAdminService
- ExternalVehicleListService
- CmsContentAdminService
- MarketingPlacementService
- SecurityMonitoringService
Background jobs:
- 3d:scan-model
- 3d:scan-wheel
- 3d:rebuild-screenshot
- security-monitoring:aggregate
Key aggregates/entities:
- CustomerTag, CustomerTagBrand, Subscription, Review
- ThreeDModel, ThreeDWheel, ThreeDSite, ExternalVehicleList, ExternalVehicleLink
- ContentItem (canonical replacement for dual blog models)
- Slide, Advert, Signature
- SecurityAttemptLog
Data Migration Notes¶
- Preserve existing
customer_tag,customer_tag_brand,customer_subscription, andcustomer_reviewdata. - Preserve 3D entities (
threed_model,article_wheel_threed) and external list/link tables, with source IDs untouched. - Preserve both legacy post systems during transition; add source marker to canonical content projection.
- Preserve slider/advert targeting relations (tags, customer categories, visibility flags, OE-corner flags).
- Preserve security monitoring history where available; apply explicit retention/masking policy on migration.
Acceptance Scenarios (Gherkin)¶
Feature: Admin deep-dive modules
Scenario: Update customer tag with brand and vehicle filters
Given an admin opens customer tag "42"
When the admin enables document portal and adds a brand rule with vehicle filters
Then the customer tag should be persisted with updated brand mappings
Scenario: Remove subscription entry by email
Given a subscription exists for "user@example.com"
When an admin removes that subscription from the admin dialog
Then the subscription entry should no longer be returned by the admin list
Scenario: Create review with image and activate it
Given an admin submits a review with rating 4.5 and an image
When the review is saved and active is set to true
Then the review should be visible in admin listing as active
Scenario: Link external vehicle to 3D model
Given an external vehicle list exists
And a 3D model exists
When an admin links vehicle "X" to model "Y"
Then the link should be persisted for that list
Scenario: Prevent simulator-managed user from changing list when disabled
Given a simulator-managed site has allow-change-list set to false
When that user attempts to add or delete external links
Then the mutation should be rejected
Scenario: Save slider with targeting and visibility
Given an admin edits a slide with tag filters and customer categories
When the slide is saved with visibility "users only"
Then the targeting and visibility rules should be persisted and applied
Scenario: Save advert with date window and category targeting
Given an admin edits an advert with visibleFrom and visibleUntil
And assigns customer categories and tags
When the advert is saved
Then only matching customers within the date window should satisfy display criteria
Scenario: Maintain multilingual CMS blog content
Given an admin edits a CMS blog item
When NL, FR, and EN translation fields are saved
Then each translation should be retrievable with its own slug/title/body
Scenario: View monitoring aggregation and details
Given hacking-attempt logs exist for today
When an admin opens monitoring tabs for hour and day
Then aggregated counts and classification details should be available
Scenario: Audit trail is written for admin mutations
Given audit logging is enabled
When an admin updates tags, 3D links, or marketing placements
Then each mutation should produce a traceable audit record
Open Decisions¶
- Should migration fully merge legacy
articlesandcmsblog stacks, or keep a compatibility layer for one release? - Should advert image storage remain DB binary or move to object/file storage with metadata references?
- Should subscription admin remain remove-only, or become explicit opt-in/opt-out workflow with provenance?
- What retention period and masking rules apply to hacking-attempt request payload data?
- Which island owns long-running 3D operations operationally: Webshop Admin, Vehicle Data, or shared Ops?