- Introduced a new view component for product hardware hero section (_ProductHardwarePrHero.cshtml) that displays product details including titles, features, and a copy with expandable text. - Created a homepage hero products component (Default.cshtml) to showcase the first product in a list and provide navigation dots for additional products. - Added a placeholder for when no products are available, guiding users to set products in the backend. - Included a new image asset (vehicle-transportation.png) for use in the product hero section.
16 KiB
Frontend Refresh and Media Storage Plan
Purpose
This plan defines the first major rebuild track for the storefront and media layer. The goal is to replace the current storefront theme while introducing a private S3-compatible media storage layer that can later take over nopCommerce product pictures and support a controlled production migration.
The current data volume is small, so the plan favors clear boundaries and reversible migration steps over heavy batch infrastructure.
Fixed Decisions
- The existing storefront theme can be abandoned for the public frontend rebuild.
- A new theme will be created instead of modifying
DefaultCleanin place. - The first frontend implementation is desktop-first. Responsive behavior can be added later, but HTML and CSS structure should leave room for responsive breakpoints.
- The storefront rebuild is not only visual CSS work. It may require Razor view changes, model/factory changes, controller changes, admin settings, widget changes, and seed/config data.
- Product-related visuals should use existing product picture data where practical instead of being recreated as static theme images.
- Media objects must not expose raw S3, MinIO, or bucket URLs to browsers.
- AWS S3 will be used for development/test and production object storage.
- MinIO will be used in stage as an S3-compatible replacement.
- All browser-facing media URLs must go through the application, using a media proxy.
- CloudFront is intentionally out of scope because DNS is not controlled by the team.
- Existing production migration can use a planned maintenance window of roughly half a day to one day.
Target Architecture
Storage
Create an application-level media storage abstraction instead of mounting S3 as a filesystem.
The storage layer should support:
- AWS S3 for test/prod.
- MinIO for stage.
- Private buckets only.
- No public object ACLs.
- Configurable endpoint, bucket, region, access key, secret, and path-style addressing.
Proposed interface:
public interface IMediaStorage
{
Task<MediaObjectInfo> PutAsync(MediaPutRequest request, CancellationToken cancellationToken = default);
Task<MediaReadResult> GetAsync(string objectKey, CancellationToken cancellationToken = default);
Task<MediaObjectInfo?> HeadAsync(string objectKey, CancellationToken cancellationToken = default);
Task DeleteAsync(string objectKey, CancellationToken cancellationToken = default);
Task<bool> ExistsAsync(string objectKey, CancellationToken cancellationToken = default);
}
Browser-Facing URLs
Media URLs should be stable application URLs, not object storage URLs.
Examples:
/media/assets/{assetId}/{seoName}
/media/pictures/{pictureId}/{size}/{seoName}
/media/pictures/{pictureId}/original/{seoName}
Optional compatibility route for existing rich editor HTML:
/images/uploaded/{**path}
This route can temporarily proxy legacy uploaded paths while old HTML is migrated.
Media Proxy
Add a media proxy controller responsible for reading from storage and streaming the response.
Required behavior:
- Stream object content without buffering entire files in memory.
- Return correct
Content-Type. - Return
Content-Lengthwhen available. - Return
ETagand/orLast-Modifiedwhen available. - Support conditional requests with
304 Not Modified. - Apply browser cache headers.
- Keep private object storage credentials server-side only.
Later behavior:
- Support HTTP
Rangerequests for video and large media. - Add authorization rules if private customer/vendor media is introduced.
- Add image transformation variants if needed beyond nopCommerce thumbnail behavior.
Data Model Direction
Use explicit metadata tables rather than relying on physical paths inside HTML or S3 object keys alone.
Managed Media Assets
Add a new managed media asset model for non-product-picture assets such as homepage visuals, banners, rich editor images, icons, downloadable presentation media, and future marketing media.
Suggested fields:
IdStorageProviderBucketObjectKeyFileNameSeoFileNameMimeTypeFileSizeWidthHeightChecksumAltTextTitleUsageTypeCreatedOnUtcUpdatedOnUtcDeleted
Product Pictures
Keep nopCommerce product picture concepts intact:
- Keep
Picture. - Keep
ProductPicture. - Keep existing picture metadata such as MIME type, SEO filename, alt, title, and display order.
Add storage mapping for picture binaries, either with a dedicated PictureStorage table or by reusing the managed media asset table with a product-picture usage type.
Suggested picture storage fields:
PictureIdStorageProviderBucketObjectKeyOriginalFileNameMimeTypeFileSizeWidthHeightChecksumCreatedOnUtc
PictureBinary should remain untouched during initial rollout and migration dry runs. It can be cleared only after production validation and rollback risk is acceptable.
Phase 1: New Frontend Theme and Media Storage Foundation
This is the first major step.
Scope
- Create the new frontend theme.
- Build the initial
IMediaStorageabstraction. - Implement S3-compatible storage for AWS S3 and MinIO.
- Add media proxy routes.
- Add admin-managed media assets for assets currently handled as static files.
- Update new frontend views to use managed media asset URLs instead of hardcoded static files.
- Add or adjust application data needed by the new storefront, such as homepage section configuration, featured product selections, category/application links, and managed media references.
- Adjust public model factories/controllers only when the new frontend requires data that existing models do not expose.
Theme Work
- Create
Themes/Kneo. - Add a new
theme.json. - Add new frontend CSS/JS asset structure.
- Override only the required public views and partials.
- Keep
DefaultCleanavailable as a reference and fallback. - Build the first version as a desktop-first layout matching the supplied design screenshots.
- Use semantic section/partial boundaries so mobile breakpoints can be added later without replacing the markup.
- Prioritize the main storefront paths:
- Home page
- Header/navigation
- Footer
- Category/listing pages
- Product cards
- Product detail page
- Cart entry points and purchase CTA surfaces
Media Storage Work
- Add configuration for S3-compatible storage:
- Provider
- Endpoint
- Region
- Bucket
- Access key
- Secret key
- Force path style
- Public proxy base path
- Implement AWS S3/MinIO client code behind
IMediaStorage. - Add managed media metadata persistence.
- Add media proxy controller and routes.
- Add admin upload/list/edit/delete flow for managed assets.
- Add rich editor insertion path for new managed media assets.
- Add controlled ways to reference managed media from storefront sections, rather than hardcoding object keys or bucket URLs in Razor views.
Storefront Data Work
The redesigned home page and other new storefront surfaces may require data that the current theme does not model explicitly.
Possible data/config needs:
- Home hero copy and media references.
- Featured hardware/product list.
- Recommended books/product list.
- Application domain tiles and links.
- Section display order.
- Header navigation entries.
- CTA target URLs.
Implementation options, from simplest to most flexible:
- Use existing nopCommerce categories/products/manufacturers where the content naturally maps to catalog data.
- Use settings for small global values such as hero title, subtitle, and CTA links.
- Use a custom table/model for repeatable home page sections if the content needs admin management.
- Use widgets only when the content needs to be independently pluggable.
Avoid encoding business-editable homepage content directly in CSS or static HTML unless it is clearly temporary.
Static Asset Conversion
Convert frontend-owned non-CSS media from static files into managed media where practical.
Examples:
- Homepage hero images
- Banner images
- Landing/media blocks
- Editorial image assets
- Future video poster images
CSS-only assets can remain under the theme if they are purely presentational and not expected to change through admin workflows.
Out of Scope
- Existing
PictureServicereplacement. - Existing product picture migration.
- Bulk rewriting existing product descriptions.
- Deleting
PictureBinary. - CloudFront integration.
Acceptance Criteria
- New theme can be selected and renders core storefront pages.
- New frontend assets can be uploaded to S3/MinIO through the application.
- New frontend views render media through application proxy URLs.
- No browser-visible raw S3 or MinIO URLs.
- Stage can switch between AWS S3-compatible config and MinIO config.
- Existing product pictures still work through current nopCommerce behavior.
- Required home page data can be configured or seeded without editing Razor/CSS for normal content updates.
Phase 2: Apply Media Storage to Picture Service
Scope
Replace product picture binary storage/read behavior with the new media storage layer while keeping existing public and admin behavior as stable as possible.
Work Items
- Extend or replace
IPictureServiceimplementation. - Make new product picture uploads write to S3/MinIO.
- Make
GetPictureUrlAsyncreturn media proxy URLs. - Make original and generated thumbnail reads flow through the proxy.
- Decide whether thumbnails are:
- generated on demand and stored in S3/MinIO, or
- generated during upload/update and stored as variants.
- Preserve existing product picture metadata and product associations.
- Keep compatibility for pictures still stored in DB during rollout.
Compatibility Strategy
During rollout, product pictures may exist in two states:
- Legacy DB-backed picture:
PictureBinary.BinaryDataexists and no storage mapping exists. - New storage-backed picture: storage mapping exists and object is in S3/MinIO.
The picture service should support both until migration is complete.
Acceptance Criteria
- New product image uploads are stored in S3/MinIO.
- Existing DB-backed product images still render.
- Product image URLs are application proxy URLs.
- Admin product picture add/edit/delete behavior still works.
- Category pages, product detail pages, carts, orders, and search thumbnails render correctly.
Phase 3: Migration Plan and Migration Tooling
Scope
Build and test tools to migrate existing DB-backed product pictures and legacy rich editor uploads into the new storage system.
Product Picture Migration
Migration tool responsibilities:
- Scan
Picturerecords. - Read current binary data from
PictureBinary. - Generate deterministic object keys.
- Upload originals to S3/MinIO.
- Create storage mapping records.
- Verify object exists and size/checksum matches.
- Mark migration status.
- Produce a migration report.
Suggested object key format:
pictures/{pictureId}/original/{safeSeoName-or-pictureId}.{extension}
pictures/{pictureId}/thumbs/{size}/{safeSeoName-or-pictureId}.{extension}
Thumbs may be generated lazily after migration unless performance testing shows preload is needed.
Rich Editor Upload Migration
Migration tool responsibilities:
- Scan product descriptions and other rich editor fields for
/images/uploaded/.... - Resolve matching local files from the current production filesystem.
- Upload files to managed media storage.
- Create managed media asset records.
- Optionally rewrite HTML to
/media/assets/.... - Produce a report of missing local files and rewritten references.
If direct rewrite is risky, keep /images/uploaded/{**path} as a legacy proxy route during the transition.
Production Cutover
Expected maintenance-window flow:
- Enable maintenance mode.
- Freeze product/media edits.
- Run product picture migration.
- Run rich editor media migration.
- Validate migration report.
- Switch production config to storage-backed picture service.
- Clear application cache.
- Run smoke tests on critical pages.
- Disable maintenance mode.
Rollback Strategy
- Do not delete or clear
PictureBinaryduring initial production cutover. - Keep legacy local uploaded files until product verification is complete.
- Keep DB and filesystem backups from immediately before migration.
- If needed, switch config back to DB-backed picture behavior and legacy static uploaded files.
Acceptance Criteria
- All existing product pictures have storage mapping records.
- All migrated objects exist in S3/MinIO.
- Product pages render after clearing browser/application cache.
- Missing rich editor files are reported explicitly.
- No raw object storage URLs appear in rendered storefront HTML.
Risks and Controls
Web Server Bandwidth
Without CloudFront, all media flows through the application.
Controls:
- Stream responses.
- Use browser caching.
- Use conditional GET.
- Add Range support before serving large videos.
- Keep image sizes reasonable.
Cache Invalidation
Stable URLs can cause stale browser caches when media is replaced.
Controls:
- Prefer immutable object keys for replaced files.
- Include version or content hash in proxy URLs when needed.
- Use
ETagandLast-Modified.
Legacy HTML References
Existing rich editor HTML may point to missing local files.
Controls:
- Build a scanner before production migration.
- Report missing files before cutover.
- Keep a compatibility proxy route.
S3-Compatible Differences
AWS S3 and MinIO differ in endpoint style, path style, metadata, and local TLS behavior.
Controls:
- Keep all provider differences inside
S3MediaStorage. - Test against MinIO in stage and AWS S3 in test.
- Avoid provider-specific URLs in persisted HTML.
Suggested Implementation Order
- Add configuration and
IMediaStorage. - Add S3/MinIO implementation.
- Add media metadata tables and migrations.
- Add media proxy read endpoint.
- Add admin-managed media upload/list/edit flow.
- Create
Themes/Kneo. - Convert new frontend non-CSS media to managed assets.
- Integrate managed assets with rich editor for new content.
- Add storage-backed picture service compatibility.
- Build migration scanner/report.
- Build product picture migration tool.
- Build rich editor media migration tool.
- Run dry runs on stage.
- Execute production migration during maintenance window.
Deployment Memo
This section tracks deploy-time work that should not be forgotten as the project evolves.
Phase 1 Deploy Checklist
- Add S3/MinIO configuration values for the target environment.
- Create the target bucket in AWS S3 or MinIO.
- Keep the bucket private.
- Create or provision application credentials with only the required bucket permissions.
- Confirm application config does not expose raw S3/MinIO URLs to rendered HTML.
- Run database migrations for managed media metadata.
- Seed required storefront settings/data:
- active theme set to
Kneo - home hero configuration
- featured product/book selections
- application tiles
- navigation entries if they are data-driven
- active theme set to
- Upload required non-product homepage media into managed media storage.
- Verify media proxy can read from S3/MinIO in the deployed environment.
- Verify cache headers and conditional GET behavior on media responses.
- Confirm existing product pictures still render through the legacy picture path.
- Clear application cache after theme/settings changes.
- Smoke test:
- home page
- category/listing page
- product detail page
- cart entry point
- admin media upload/list
Phase 2 Deploy Checklist
- Run database migrations for picture storage mapping.
- Enable storage-backed picture service in the target environment.
- Confirm new product picture uploads write to S3/MinIO.
- Confirm legacy DB-backed product pictures still render.
- Verify generated thumbnail behavior.
- Clear picture/model caches.
- Smoke test:
- product image upload in admin
- product detail gallery
- product card thumbnails
- cart/order thumbnails
Phase 3 Migration Checklist
- Take database backup.
- Back up legacy local media directories, especially
wwwroot/images/uploaded. - Enable maintenance mode.
- Freeze product and media edits.
- Run migration dry-run/report first if possible.
- Run product picture migration.
- Run rich editor media migration.
- Verify migration counts and missing-file report.
- Switch production config to storage-backed picture service.
- Clear application and CDN/browser-relevant caches where applicable.
- Smoke test critical storefront and admin pages.
- Keep
PictureBinarydata and legacy uploaded files until post-cutover validation is complete. - Disable maintenance mode.