customerId)->get(); $addresses = CartAddress::whereIn('cart_id', $carts->pluck('id'))->get(); return new ProviderExportResult('carts', [ 'addresses' => $addresses->map(fn (CartAddress $address) => [ 'type' => $address->type, 'first_name' => $address->first_name, 'last_name' => $address->last_name, 'line_one' => $address->line_one, 'city' => $address->city, 'postcode' => $address->postcode, 'contact_email' => $address->contact_email, 'contact_phone' => $address->contact_phone, ])->all(), 'carts' => $carts->map(fn (Cart $cart) => [ 'id' => $cart->id, 'meta' => $this->metaOnly($cart), ])->all(), ]); } public function exportForUser(UserSubject $subject): ProviderExportResult { return new ProviderExportResult('carts', []); } public function eraseForCustomer(CustomerSubject $subject): ProviderErasureResult { $carts = Cart::where('customer_id', $subject->customerId)->get(); CartAddress::whereIn('cart_id', $carts->pluck('id'))->delete(); foreach ($carts as $cart) { $meta = (array) $cart->meta; foreach (self::META_KEYS as $key) { unset($meta[$key]); } $cart->update(['meta' => $meta]); } return new ProviderErasureResult('carts', ErasureOutcome::Erased); } public function eraseForUser(UserSubject $subject): ProviderErasureResult { return new ProviderErasureResult('carts', ErasureOutcome::Skipped, 'Carts belong to Customer accounts, not individual users.'); } /** * @return array */ private function metaOnly(Cart $cart): array { $meta = (array) $cart->meta; return array_intersect_key($meta, array_flip(self::META_KEYS)); } }