validated(); $crmCustomer = CustomerInfo::getFromEmail($service->brand, $validatedData['email'])->first(); if ($crmCustomer) { // Update the optin field. $crmCustomer->opt_in = \boolval($validatedData['opt_in']); // Check the saving. if (!$crmCustomer->saveOrFail()) { // @codeCoverageIgnoreStart throw new CrmException('Api failed to update customer optin.'); // @codeCoverageIgnoreEnd } // Associate answers if presents. if (isset($validatedData['answer_id'])) { $crmCustomer->answers()->attach($validatedData['answer_id']); } } else { // Get the single optin if exist or create it. /** @var \App\Models\SingleOptin */ $singleOptin = SingleOptin::query() ->where('email', $validatedData['email']) ->whereHas('brand', function ($q) use ($service) { $q->whereKey($service->brand->getKey()); }) ->firstOrNew(); // Update the optin field and check the saving. if (!$this->changeOptin($service, $request, \boolval($validatedData['opt_in']), $singleOptin)) { // @codeCoverageIgnoreStart throw new CrmException('Api failed to update single optin.'); // @codeCoverageIgnoreEnd } // Associate answers if presents. if (isset($validatedData['answer_id'])) { $singleOptin->answers()->attach($validatedData['answer_id']); } } //end if return response()->json(); } /** * Creates a new Single optin or destroys it if exists using hashcode. * * @param \App\Http\Requests\Api\V4\SingleOptinRemoveWithHashcodeRequest $request * @param \App\Models\Service $service * @return \Illuminate\Http\JsonResponse * @throws \App\Exceptions\Api\V4\CrmException If the single optin could not be removed. */ public function optoutWithHashcode( SingleOptinRemoveWithHashcodeRequest $request, Service $service ): \Illuminate\Http\JsonResponse { $validatedData = $request->validated(); $crmCustomer = CustomerInfo::getFromHashcode($service->brand, $validatedData['hashcode'])->first(); if ($crmCustomer) { // Update the optin field. $crmCustomer->opt_in = false; // Check the saving. if (!$crmCustomer->saveOrFail()) { // @codeCoverageIgnoreStart throw new CrmException('Api failed to update customer optin.'); // @codeCoverageIgnoreEnd } } else { // Get the single optin if exist or create it. /** @var \App\Models\SingleOptin */ $singleOptin = SingleOptin::query()->where('hashcode', $validatedData['hashcode']) ->whereHas('brand', function ($q) use ($service) { $q->whereId($service->brand->getKey()); })->firstOrFail(); // Update the optin field and check the saving. if ($singleOptin and !$this->changeOptin($service, $request, false, $singleOptin)) { // @codeCoverageIgnoreStart throw new CrmException('Api failed to update single optin.'); // @codeCoverageIgnoreEnd } } //end if return response()->json(); } /** * Changes the optin state. * * @param \App\Models\Service $service * @param \App\Http\Requests\Api\V4\BaseApiRequest $request * @param boolean $optin * @param \App\Models\SingleOptin $singleOptin * @return boolean Returns false in case of failure. */ private function changeOptin(Service $service, BaseApiRequest $request, bool $optin, SingleOptin $singleOptin): bool { if ($optin) { $singleOptin->fill($request->validated()); $singleOptin->brand()->associate($service->brand); return $singleOptin->save(); } return $singleOptin->delete() !== false; } }