where('tenant_id', \tenant()->getKey())->where('status', 1)->get() ); } // *** --- START CONTACTS --- /** * Get Contacts * * @param \App\Models\AppUser $app_user * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function getContacts(AppUser $app_user): \Illuminate\Http\Resources\Json\AnonymousResourceCollection { return ContactResource::collection( Contact::query()->whereHas('appUser', function (Builder $q) use ($app_user) { $q->where('tenant_id', \tenant()->getKey())->where('id', $app_user->id); })->get() ); } /** * Upsert contacts * * @param \App\Http\Requests\Api\Contacts\UpsertContactsRequest $request * @param \App\Models\AppUser $app_user * @return \Illuminate\Http\JsonResponse */ public function upsertContact( UpsertContactsRequest $request, AppUser $app_user ): \Illuminate\Http\JsonResponse { /** @var \Illuminate\Support\Collection */ $formularies = Formulary::query()->pluck('slug')->flip(); $contactQuery = Contact::query()->whereHas('appUser', function (Builder $q) use ($app_user) { $q->where('tenant_id', \tenant()->getKey())->where('id', $app_user->getKey()); }); \collect($request->contacts)->each( function (array $contactRequestData) use ($contactQuery, $formularies, $app_user) { /** @var \App\Models\Contact $model */ $model = (clone $contactQuery)->where('id', Arr::get($contactRequestData, 'id'))->firstOrNew(); $contactRequestData['timestamp'] = Carbon::parse($contactRequestData['timestamp'], 'UTC') ->setTimezone(\now()->getTimezone()); // @phpstan-ignore logicalAnd.leftAlwaysTrue if ($model->timestamp and $model->timestamp->gte($contactRequestData['timestamp'])) { return; } // * Set parse values on data prop to fill in model. $contactRequestData['data'] = \collect($contactRequestData['dataParsed']) // * FILTER CONTACT DATA WITH ACTUAL FORMULARY ->filter(function (Input $input) use ($formularies) { return $formularies->has($input->data->formSlug); }); $model->fill($contactRequestData); $model->app_user_id = $app_user->getKey(); // * Send contact to Feature if ( !empty($contactRequestData['send_to_app_user_id']) and ($destUser = AppUser::query()->where('id', $contactRequestData['send_to_app_user_id'])->first()) ) { $model->appUser()->associate($destUser); } $model->saveOrFail(); } ); // * HTTP 200 is ok. return \response()->json(); } /** * Destroy contacts * * @param \App\Http\Requests\Api\Contacts\DestroyContactsRequest $request * @param \App\Models\AppUser $app_user * @return \Illuminate\Http\JsonResponse */ public function destroyContacts(DestroyContactsRequest $request, AppUser $app_user): \Illuminate\Http\JsonResponse { Contact::query()->whereIn('id', $request->validated()['contactUuidList']) ->whereHas('appUser', function (Builder $q) use ($app_user) { $q->where('tenant_id', \tenant()->getKey())->where('id', $app_user->id); })->delete(); // * HTTP 200 is ok. return \response()->json(); } // *** --- END CONTACTS --- /** * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function getDirectories(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection { return DirectoryResource::collection( Directory::query()->where('tenant_id', \tenant()->getKey())->orderBy('order')->get() ); } /** * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function getDocuments(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection { return DocumentResource::collection( Document::query()->where('tenant_id', \tenant()->getKey())->where('status', 1)->get() ); } /** * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection */ public function getFormularies(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection { return FormularyResource::collection( Formulary::query()->where('tenant_id', \tenant()->getKey())->orderBy('order')->get() ); } /** * @param \App\Http\Requests\Api\SendFlyerRequest $request * @return string */ public function sendFlyer(Request $request): string { $requestData = $request->emails; $email = $requestData['email']; $subject = $requestData['subject']; $message = $requestData['message']; $app_user_id = $requestData['app_user_id']; $docs = \json_decode($requestData['documents'], true); $user = AppUser::find($app_user_id); $attach = []; $filesName = []; $noExists = []; foreach ($docs as $doc) { $exists = Storage::disk('public') ->exists(sprintf('docs/%s/%s.%s', \tenant()->getKey(), $doc['uuid'], $doc['type'])); if ($exists) { array_push($attach, URL::temporarySignedRoute( 'bo.docs.download', now()->addDays(30), ['tenant' => \tenant()->getKey(), 'uuid' => $doc['uuid']] )); array_push($filesName, $doc['title']); } else { array_push($noExists, $doc['title']); } } if (count($noExists) === 0) { $mail = new SendFlyer([ 'body' => $message, 'from' => $user->email, 'fromName' => $user->firstname . ' ' . $user->lastname, 'subject' => sprintf("[%s] - %s", \tenant('name'), $subject), 'attach' => $attach, 'filesName' => $filesName, ]); Mail::to($email)->cc($user->email)->queue($mail); } else { $mail = new SendFlyerFailed([ 'email' => $email, 'message' => $message, 'subject' => $subject, 'filesName' => $filesName, 'noExists' => $noExists ]); Mail::to($user->email)->queue($mail); } //end if return 'OK'; } }