Feat: Privacy Concern redesign to match project structure

This commit is contained in:
2026-09-16 01:21:22 +03:00
parent 027f7e8982
commit 68233f43ef
33 changed files with 77 additions and 66 deletions
+1 -1
View File
@@ -169,7 +169,7 @@ no one — a business-account erasure must never block anyone's access.
`Modules\Core\Auth\Services\UserOtpService` — nothing else changes). `Modules\Core\Auth\Services\UserOtpService` — nothing else changes).
```php ```php
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
$service = app(PrivacyService::class); $service = app(PrivacyService::class);
@@ -3,7 +3,7 @@
namespace Modules\Core\Command; namespace Modules\Core\Command;
use Illuminate\Console\Command; use Illuminate\Console\Command;
use Modules\Core\Privacy\ErasureRequestStatus; use Modules\Core\Privacy\Enums\ErasureRequestStatus;
use Modules\Core\Privacy\Jobs\EraseDataSubjectJob; use Modules\Core\Privacy\Jobs\EraseDataSubjectJob;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
@@ -2,10 +2,10 @@
namespace Modules\Core\Privacy\Contracts; namespace Modules\Core\Privacy\Contracts;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\ProviderErasureResult; use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\ProviderExportResult; use Modules\Core\Privacy\DTOs\ProviderExportResult;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
/** /**
* Implemented by any module that holds personal data and wants it included in * Implemented by any module that holds personal data and wants it included in
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\DTOs;
use Lunar\Models\Customer; use Lunar\Models\Customer;
@@ -1,6 +1,8 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\DTOs;
use Modules\Core\Privacy\Enums\ErasureOutcome;
/** /**
* Every registered provider's outcome, assembled into one right-of-erasure response * Every registered provider's outcome, assembled into one right-of-erasure response
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\DTOs;
/** /**
* Every registered provider's export, assembled into one right-of-access response. * Every registered provider's export, assembled into one right-of-access response.
@@ -1,6 +1,8 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\DTOs;
use Modules\Core\Privacy\Enums\ErasureOutcome;
/** /**
* One provider's outcome on an erasure request. `reason` is required whenever * One provider's outcome on an erasure request. `reason` is required whenever
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\DTOs;
/** /**
* One provider's contribution to a right-of-access export. `provider` is a short, * One provider's contribution to a right-of-access export. `provider` is a short,
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\DTOs;
use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Contracts\Auth\Authenticatable;
use Lunar\Base\LunarUser; use Lunar\Base\LunarUser;
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\Enums;
/** /**
* What actually happened to a provider's data on an erasure request. None of these * What actually happened to a provider's data on an erasure request. None of these
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\Enums;
enum ErasureRequestStatus: string enum ErasureRequestStatus: string
{ {
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\Enums;
enum ExportRequestStatus: string enum ExportRequestStatus: string
{ {
+1 -1
View File
@@ -2,7 +2,7 @@
namespace Modules\Core\Privacy\Events; namespace Modules\Core\Privacy\Events;
use Modules\Core\Privacy\ExportReport; use Modules\Core\Privacy\DTOs\ExportReport;
use Modules\Core\Privacy\Models\DataExportRequest; use Modules\Core\Privacy\Models\DataExportRequest;
/** /**
@@ -8,7 +8,7 @@ use Filament\Notifications\Notification;
use Lunar\Admin\Support\Extending\BaseExtension; use Lunar\Admin\Support\Extending\BaseExtension;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Auth\Models\Staff; use Modules\Core\Auth\Models\Staff;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* Adds "Request erasure" / "Request export" header actions to the Customer * Adds "Request erasure" / "Request export" header actions to the Customer
@@ -15,10 +15,10 @@ use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Privacy\ErasureRequestStatus; use Modules\Core\Privacy\Enums\ErasureRequestStatus;
use Modules\Core\Privacy\Filament\Resources\DataErasureRequestResource\Pages; use Modules\Core\Privacy\Filament\Resources\DataErasureRequestResource\Pages;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* Read-mostly audit view over data_erasure_requests — staff can see every request * Read-mostly audit view over data_erasure_requests — staff can see every request
@@ -13,7 +13,7 @@ use Filament\Resources\Resource;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Modules\Core\Privacy\ExportRequestStatus; use Modules\Core\Privacy\Enums\ExportRequestStatus;
use Modules\Core\Privacy\Filament\Resources\DataExportRequestResource\Pages; use Modules\Core\Privacy\Filament\Resources\DataExportRequestResource\Pages;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\Models\DataExportRequest; use Modules\Core\Privacy\Models\DataExportRequest;
+1 -1
View File
@@ -8,7 +8,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* Runs PrivacyService::completeErasure() for one due DataErasureRequest, dispatched * Runs PrivacyService::completeErasure() for one due DataErasureRequest, dispatched
+6 -6
View File
@@ -9,13 +9,13 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\Events\PersonalDataGathered; use Modules\Core\Privacy\Events\PersonalDataGathered;
use Modules\Core\Privacy\ExportReport; use Modules\Core\Privacy\DTOs\ExportReport;
use Modules\Core\Privacy\ExportRequestStatus; use Modules\Core\Privacy\Enums\ExportRequestStatus;
use Modules\Core\Privacy\Models\DataExportRequest; use Modules\Core\Privacy\Models\DataExportRequest;
use Modules\Core\Privacy\PrivacyManager; use Modules\Core\Privacy\Services\PrivacyManager;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
/** /**
* Gathers every registered PersonalDataProvider's export data for one request, all * Gathers every registered PersonalDataProvider's export data for one request, all
@@ -27,7 +27,7 @@ use Modules\Core\Privacy\UserSubject;
* generated PDF), that's the point to reconsider — not before. * generated PDF), that's the point to reconsider — not before.
* *
* Calls each provider's *ForCustomer() or *ForUser() method depending on the * Calls each provider's *ForCustomer() or *ForUser() method depending on the
* request's polymorphic subject — see Modules\Core\Privacy\PrivacyService and * request's polymorphic subject — see Modules\Core\Privacy\Services\PrivacyService and
* docs/privacy.md "User-scope vs Customer-scope". * docs/privacy.md "User-scope vs Customer-scope".
* *
* Writing the gathered data to a file is intentionally NOT done here — see * Writing the gathered data to a file is intentionally NOT done here — see
@@ -4,9 +4,9 @@ namespace Modules\Core\Privacy\Listeners;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Modules\Core\Auth\Events\UserAuthenticated; use Modules\Core\Auth\Events\UserAuthenticated;
use Modules\Core\Privacy\ErasureRequestStatus; use Modules\Core\Privacy\Enums\ErasureRequestStatus;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* Logging back in during a pending erasure request's grace period IS the "I * Logging back in during a pending erasure request's grace period IS the "I
@@ -7,7 +7,7 @@ use Illuminate\Contracts\Queue\ShouldQueue;
use Lunar\Base\LunarUser; use Lunar\Base\LunarUser;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Privacy\Events\UserErasureRequested; use Modules\Core\Privacy\Events\UserErasureRequested;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* When a User's erasure leaves a Customer account with no remaining User at all, * When a User's erasure leaves a Customer account with no remaining User at all,
@@ -8,7 +8,7 @@ use Modules\Core\Export\CsvColumn;
use Modules\Core\Export\CsvWriter; use Modules\Core\Export\CsvWriter;
use Modules\Core\Privacy\Events\PersonalDataExportFileWritten; use Modules\Core\Privacy\Events\PersonalDataExportFileWritten;
use Modules\Core\Privacy\Events\PersonalDataGathered; use Modules\Core\Privacy\Events\PersonalDataGathered;
use Modules\Core\Privacy\ExportRequestStatus; use Modules\Core\Privacy\Enums\ExportRequestStatus;
use ZipArchive; use ZipArchive;
/** /**
+2 -2
View File
@@ -7,12 +7,12 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphTo;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Privacy\ErasureRequestStatus; use Modules\Core\Privacy\Enums\ErasureRequestStatus;
/** /**
* A pending, cancelled, or completed right-of-erasure request — the grace-period * A pending, cancelled, or completed right-of-erasure request — the grace-period
* record between "subject/staff asked for this" and "providers actually erased * record between "subject/staff asked for this" and "providers actually erased
* their data" (see Modules\Core\Privacy\PrivacyService, which creates/processes * their data" (see Modules\Core\Privacy\Services\PrivacyService, which creates/processes
* these). * these).
* *
* `subject` is polymorphic — either a Lunar Customer (business account) or a User * `subject` is polymorphic — either a Lunar Customer (business account) or a User
+1 -1
View File
@@ -5,7 +5,7 @@ namespace Modules\Core\Privacy\Models;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\Relations\MorphTo;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Privacy\ExportRequestStatus; use Modules\Core\Privacy\Enums\ExportRequestStatus;
/** /**
* A right-of-access export request. Created synchronously (fast — one insert), then * A right-of-access export request. Created synchronously (fast — one insert), then
@@ -4,11 +4,11 @@ namespace Modules\Core\Privacy\Providers;
use Lunar\Models\Address; use Lunar\Models\Address;
use Modules\Core\Privacy\Contracts\PersonalDataProvider; use Modules\Core\Privacy\Contracts\PersonalDataProvider;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\ErasureOutcome; use Modules\Core\Privacy\Enums\ErasureOutcome;
use Modules\Core\Privacy\ProviderErasureResult; use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\ProviderExportResult; use Modules\Core\Privacy\DTOs\ProviderExportResult;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
/** /**
* A customer's saved addresses (lunar_addresses) — belong to the Customer * A customer's saved addresses (lunar_addresses) — belong to the Customer
@@ -17,7 +17,8 @@ use Modules\Core\Privacy\UserSubject;
* OrderAddress, handled by OrderDataProvider), so they're freely deleted outright * OrderAddress, handled by OrderDataProvider), so they're freely deleted outright
* rather than pseudonymized in place. * rather than pseudonymized in place.
*/ */
class AddressDataProvider implements PersonalDataProvider class
AddressDataProvider implements PersonalDataProvider
{ {
public function name(): string public function name(): string
{ {
+5 -5
View File
@@ -5,11 +5,11 @@ namespace Modules\Core\Privacy\Providers;
use Lunar\Models\Cart; use Lunar\Models\Cart;
use Lunar\Models\CartAddress; use Lunar\Models\CartAddress;
use Modules\Core\Privacy\Contracts\PersonalDataProvider; use Modules\Core\Privacy\Contracts\PersonalDataProvider;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\ErasureOutcome; use Modules\Core\Privacy\Enums\ErasureOutcome;
use Modules\Core\Privacy\ProviderErasureResult; use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\ProviderExportResult; use Modules\Core\Privacy\DTOs\ProviderExportResult;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
/** /**
* Carts and cart addresses (lunar_carts, lunar_cart_addresses) belong to the * Carts and cart addresses (lunar_carts, lunar_cart_addresses) belong to the
@@ -4,11 +4,11 @@ namespace Modules\Core\Privacy\Providers;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Privacy\Contracts\PersonalDataProvider; use Modules\Core\Privacy\Contracts\PersonalDataProvider;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\ErasureOutcome; use Modules\Core\Privacy\Enums\ErasureOutcome;
use Modules\Core\Privacy\ProviderErasureResult; use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\ProviderExportResult; use Modules\Core\Privacy\DTOs\ProviderExportResult;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
/** /**
* The Customer record itself (lunar_customers) and, on the User side, the User's * The Customer record itself (lunar_customers) and, on the User side, the User's
+5 -5
View File
@@ -5,11 +5,11 @@ namespace Modules\Core\Privacy\Providers;
use Lunar\Models\Order; use Lunar\Models\Order;
use Lunar\Models\OrderAddress; use Lunar\Models\OrderAddress;
use Modules\Core\Privacy\Contracts\PersonalDataProvider; use Modules\Core\Privacy\Contracts\PersonalDataProvider;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\ErasureOutcome; use Modules\Core\Privacy\Enums\ErasureOutcome;
use Modules\Core\Privacy\ProviderErasureResult; use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\ProviderExportResult; use Modules\Core\Privacy\DTOs\ProviderExportResult;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
/** /**
* Orders and order addresses (lunar_orders, lunar_order_addresses) belong to the * Orders and order addresses (lunar_orders, lunar_order_addresses) belong to the
+5 -5
View File
@@ -4,11 +4,11 @@ namespace Modules\Core\Privacy\Providers;
use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Builder;
use Modules\Core\Privacy\Contracts\PersonalDataProvider; use Modules\Core\Privacy\Contracts\PersonalDataProvider;
use Modules\Core\Privacy\CustomerSubject; use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\ErasureOutcome; use Modules\Core\Privacy\Enums\ErasureOutcome;
use Modules\Core\Privacy\ProviderErasureResult; use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\ProviderExportResult; use Modules\Core\Privacy\DTOs\ProviderExportResult;
use Modules\Core\Privacy\UserSubject; use Modules\Core\Privacy\DTOs\UserSubject;
use Modules\Core\Review\Models\ProductReview; use Modules\Core\Review\Models\ProductReview;
/** /**
@@ -8,10 +8,10 @@ use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Modules\Core\Privacy\ErasureRequestStatus; use Modules\Core\Privacy\Enums\ErasureRequestStatus;
use Modules\Core\Privacy\Filament\Resources\DataErasureRequestResource; use Modules\Core\Privacy\Filament\Resources\DataErasureRequestResource;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* Lists erasure requests where the record being viewed (Customer or User) is the * Lists erasure requests where the record being viewed (Customer or User) is the
@@ -8,7 +8,7 @@ use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables\Columns\TextColumn; use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Filters\SelectFilter; use Filament\Tables\Filters\SelectFilter;
use Filament\Tables\Table; use Filament\Tables\Table;
use Modules\Core\Privacy\ExportRequestStatus; use Modules\Core\Privacy\Enums\ExportRequestStatus;
use Modules\Core\Privacy\Filament\Resources\DataExportRequestResource; use Modules\Core\Privacy\Filament\Resources\DataExportRequestResource;
use Modules\Core\Privacy\Models\DataExportRequest; use Modules\Core\Privacy\Models\DataExportRequest;
@@ -11,7 +11,7 @@ use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Modules\Core\Customer\RelationManagers\UserRelationManager as CoreUserRelationManager; use Modules\Core\Customer\RelationManagers\UserRelationManager as CoreUserRelationManager;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;
use Modules\Core\Privacy\PrivacyService; use Modules\Core\Privacy\Services\PrivacyService;
/** /**
* Extends core's own Customer -> User relation manager to add: * Extends core's own Customer -> User relation manager to add:
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\Services;
use LogicException; use LogicException;
use Illuminate\Contracts\Container\Container; use Illuminate\Contracts\Container\Container;
@@ -1,6 +1,6 @@
<?php <?php
namespace Modules\Core\Privacy; namespace Modules\Core\Privacy\Services;
use Illuminate\Contracts\Auth\Authenticatable; use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
@@ -8,6 +8,12 @@ use Illuminate\Support\Facades\Event;
use Lunar\Base\LunarUser; use Lunar\Base\LunarUser;
use Lunar\Models\Customer; use Lunar\Models\Customer;
use Modules\Core\Auth\Models\Staff; use Modules\Core\Auth\Models\Staff;
use Modules\Core\Privacy\DTOs\CustomerSubject;
use Modules\Core\Privacy\DTOs\ErasureReport;
use Modules\Core\Privacy\DTOs\ProviderErasureResult;
use Modules\Core\Privacy\DTOs\UserSubject;
use Modules\Core\Privacy\Enums\ErasureRequestStatus;
use Modules\Core\Privacy\Enums\ExportRequestStatus;
use Modules\Core\Privacy\Events\UserErasureRequested; use Modules\Core\Privacy\Events\UserErasureRequested;
use Modules\Core\Privacy\Jobs\ExportDataSubjectJob; use Modules\Core\Privacy\Jobs\ExportDataSubjectJob;
use Modules\Core\Privacy\Models\DataErasureRequest; use Modules\Core\Privacy\Models\DataErasureRequest;