4.9 KiB
4.9 KiB
Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog.
[0.2.0] - 2026-07-09
Added
- Shipping: registered Lunar's
lunarphp/table-rate-shippingplugin (ShippingPlugin) directly onCorePlugin, so table-rate shipping is available to every consumer app without per-app wiring. - Product migration/import framework (
Modules\Core\MigrateImport): a source-agnostic pipeline for importing a vendor's product catalog into Lunar.boboko:migrate:importArtisan command — interactively prompts for source, type (export/API), and credentials or file path, then dispatches the import as a queued job (RunMigrateImportJob) on the default queue. The file-path prompt resolves relative tostorage/app/private/imports/, so answering e.g.shopifypicks up the first CSV found inimports/shopify/automatically.ImportSpec,Importerinterface, andImporterFactory(source+type → importer class) as the extension points for future sources (WooCommerce, etc.) and mechanisms (API vs. file export).import_mappingstable +ImportMappingmodel: a polymorphic (source, source_type, external_id) → model mapping used by every resolver to make imports idempotent and safely re-runnable.DefaultLocalehelper wrapping Lunar'sLanguage::getDefault()->code, used anywhere a translatable field needs a locale key, instead of assumingapp()->getLocale()matches Lunar's configured default.- Shopify CSV export importer (
Shopify\ShopifyExportImporter), the first working source/type combination, verified end-to-end against a real 183-product/693-variant/332-image Shopify export (row counts in the CSV match 1:1 with imported Products/Variants/Media):ShopifyCsvReader+ProductGroupgroup Shopify's flat, repeated-handle CSV rows into one row-group per product (product row, variant rows, image rows).- Ten resolvers under
Shopify\Resolvers, each responsible for idempotently resolving-or-creating one Lunar entity:TaxClassResolver,ProductTypeResolver(auto-attaches system attributes to new types),BrandResolver,TagResolver,CollectionResolver(multi-level, multi-collection support via>-delimited breadcrumbs),ProductOptionResolver(dedupes options/values by slugified name so case variants like "Size"/"size" resolve to one row),AssetResolver(Spatie MediaLibrary viaProduct::addMedia(), matches local export images by UUID first, filename fallback),PriceResolver(minor-unit conversion per currency),ImportAttributeResolverandProductAttributeResolver(customcost_per_item/seo_title/seo_descriptionattributes, field-type-awareattribute_datawriting).
docs/shopify-import.md— full CSV-to-Lunar field mapping reference and import design notes.docs/lunar.md— new "Gotchas" section documenting non-obvious Lunar behavior hit while building the importer (table-prefix/nested-set race, requiredProductOption.handle, per-groupAttribute.position, etc.).CONTRIBUTE.md— local dev setup (path-repo +bin/dc-core.sh), and the manual DB-verification workflow used to build this feature.
Fixed
ProductOptionResolvercreated duplicateProductOption/ProductOptionValuerows when the same option or value appeared with different casing across products (e.g. Shopify export rows using both "Size" and "size"), and could create a duplicate value within a single product's own variant rows due to relying on a stale lazy-loaded relation. Both now resolve by normalized (slugified) identity queried fresh from the database.boboko:migrate:importcould dispatch an import job with a blank file path (silent no-op failure) if the file-path prompt was answered empty; it now re-prompts until a valid, existing file is given.
[0.0.1] - 2026-07-03
First release.
Added
- OTP-based authentication built around
Userinstead ofCustomer(UserOtpService,UserOtpMail), replacing the earlier customer-scoped OTP flow. UserCreatedevent with aCreateCustomerForUserlistener to provision a Lunar customer automatically when a user is created.UserRelationManagerfor managing users from the customer resource in the panel.- Stoic image UI component (
resources/views/ui/stoic-image.blade.php) and its YAML-driven config/service (seeStoic::class). config/core.phpfor module-level configuration.AuthServiceProviderandCustomerServiceProvidernow register alongsideCoreServiceProvider.- Migrations: add OTP to
users, drop OTP from Lunarcustomers, droppasswordfromusers, makenamenullable onusersand Lunarcustomers. docs/modules.mddocumenting module structure.
Removed
CustomerOtpMailandCustomerOtpService, superseded by the user-based OTP flow.
Dependencies
- Added explicit
symfony/yamlrequirement (used directly byStoic::loadConfig()).