2023-07-13 08:34:54 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers\API;
|
|
|
|
|
|
|
|
|
|
use App\Http\Controllers\Controller;
|
2023-08-28 19:08:23 +02:00
|
|
|
use App\Http\Requests\Api\Contacts\DestroyContactsRequest;
|
|
|
|
|
use App\Http\Requests\Api\Contacts\UpsertContactsRequest;
|
2023-07-21 14:53:44 +02:00
|
|
|
use App\Http\Resources\AppUserResource;
|
|
|
|
|
use App\Http\Resources\ContactResource;
|
|
|
|
|
use App\Http\Resources\DirectoryResource;
|
|
|
|
|
use App\Http\Resources\DocumentResource;
|
2023-08-23 09:44:51 +02:00
|
|
|
use App\Http\Resources\FormularyResource;
|
2023-08-31 12:48:31 +02:00
|
|
|
use App\Lib\Inputs\Definition\Input;
|
2023-07-13 08:34:54 +00:00
|
|
|
use App\Mail\SendFlyer;
|
|
|
|
|
use App\Mail\SendFlyerFailed;
|
|
|
|
|
use App\Models\AppUser;
|
|
|
|
|
use App\Models\Contact;
|
|
|
|
|
use App\Models\Directory;
|
|
|
|
|
use App\Models\Document;
|
2023-08-23 09:44:51 +02:00
|
|
|
use App\Models\Formulary;
|
2023-07-13 08:34:54 +00:00
|
|
|
use App\Models\Setting;
|
|
|
|
|
use GuzzleHttp\Exception\ClientException;
|
2023-08-28 19:08:23 +02:00
|
|
|
use Illuminate\Database\Eloquent\Builder;
|
2023-07-13 08:34:54 +00:00
|
|
|
use Illuminate\Http\Request;
|
2023-08-28 19:08:23 +02:00
|
|
|
use Illuminate\Support\Arr;
|
2023-09-01 16:50:18 +02:00
|
|
|
use Illuminate\Support\Carbon;
|
2023-07-13 08:34:54 +00:00
|
|
|
use Illuminate\Support\Facades\Mail;
|
|
|
|
|
use Illuminate\Support\Facades\Storage;
|
|
|
|
|
use Illuminate\Support\Facades\URL;
|
|
|
|
|
|
|
|
|
|
class SyncController extends Controller
|
|
|
|
|
{
|
|
|
|
|
/**
|
2025-06-12 15:47:26 +02:00
|
|
|
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-07-13 08:34:54 +00:00
|
|
|
*/
|
2025-06-12 15:47:26 +02:00
|
|
|
public function getUsers(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-07-13 08:34:54 +00:00
|
|
|
{
|
2025-06-12 15:47:26 +02:00
|
|
|
return AppUserResource::collection(
|
2025-05-28 15:16:35 +02:00
|
|
|
AppUser::query()->where('tenant_id', \tenant()->getKey())->where('status', 1)->get()
|
2025-06-12 15:47:26 +02:00
|
|
|
);
|
2023-07-13 08:34:54 +00:00
|
|
|
}
|
|
|
|
|
|
2023-08-28 19:08:23 +02:00
|
|
|
// *** --- START CONTACTS ---
|
|
|
|
|
|
2023-07-13 08:34:54 +00:00
|
|
|
/**
|
2023-08-28 19:08:23 +02:00
|
|
|
* Get Contacts
|
|
|
|
|
*
|
|
|
|
|
* @param \App\Models\AppUser $app_user
|
|
|
|
|
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
|
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function getContacts(AppUser $app_user): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-08-28 19:08:23 +02:00
|
|
|
{
|
|
|
|
|
return ContactResource::collection(
|
2025-05-28 15:16:35 +02:00
|
|
|
Contact::query()->whereHas('appUser', function (Builder $q) use ($app_user) {
|
|
|
|
|
$q->where('tenant_id', \tenant()->getKey())->where('id', $app_user->id);
|
2023-08-28 19:08:23 +02:00
|
|
|
})->get()
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Upsert contacts
|
|
|
|
|
*
|
|
|
|
|
* @param \App\Http\Requests\Api\Contacts\UpsertContactsRequest $request
|
|
|
|
|
* @param \App\Models\AppUser $app_user
|
2025-05-20 10:16:12 +02:00
|
|
|
* @return \Illuminate\Http\JsonResponse
|
2023-08-28 19:08:23 +02:00
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function upsertContact(
|
|
|
|
|
UpsertContactsRequest $request,
|
|
|
|
|
AppUser $app_user
|
|
|
|
|
): \Illuminate\Http\JsonResponse {
|
2023-08-31 12:48:31 +02:00
|
|
|
/** @var \Illuminate\Support\Collection<string,integer> */
|
|
|
|
|
$formularies = Formulary::query()->pluck('slug')->flip();
|
2025-05-28 15:16:35 +02:00
|
|
|
$contactQuery = Contact::query()->whereHas('appUser', function (Builder $q) use ($app_user) {
|
|
|
|
|
$q->where('tenant_id', \tenant()->getKey())->where('id', $app_user->getKey());
|
2023-08-28 19:08:23 +02:00
|
|
|
});
|
|
|
|
|
|
2025-05-26 15:16:55 +02:00
|
|
|
\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();
|
2023-09-01 16:50:18 +02:00
|
|
|
}
|
2025-05-26 15:16:55 +02:00
|
|
|
);
|
2023-08-28 19:08:23 +02:00
|
|
|
|
|
|
|
|
// * HTTP 200 is ok.
|
|
|
|
|
return \response()->json();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Destroy contacts
|
|
|
|
|
*
|
|
|
|
|
* @param \App\Http\Requests\Api\Contacts\DestroyContactsRequest $request
|
|
|
|
|
* @param \App\Models\AppUser $app_user
|
2025-05-20 10:16:12 +02:00
|
|
|
* @return \Illuminate\Http\JsonResponse
|
2023-07-13 08:34:54 +00:00
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function destroyContacts(DestroyContactsRequest $request, AppUser $app_user): \Illuminate\Http\JsonResponse
|
2023-07-13 08:34:54 +00:00
|
|
|
{
|
2025-05-28 15:16:35 +02:00
|
|
|
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);
|
2023-08-29 11:39:46 +02:00
|
|
|
})->delete();
|
2023-08-28 19:08:23 +02:00
|
|
|
|
|
|
|
|
// * HTTP 200 is ok.
|
|
|
|
|
return \response()->json();
|
2023-07-13 08:34:54 +00:00
|
|
|
}
|
|
|
|
|
|
2023-08-28 19:08:23 +02:00
|
|
|
// *** --- END CONTACTS ---
|
|
|
|
|
|
2023-07-13 08:34:54 +00:00
|
|
|
/**
|
2025-05-20 10:16:12 +02:00
|
|
|
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-07-13 08:34:54 +00:00
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function getDirectories(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-07-13 08:34:54 +00:00
|
|
|
{
|
2025-05-26 15:16:55 +02:00
|
|
|
return DirectoryResource::collection(
|
2025-05-28 15:16:35 +02:00
|
|
|
Directory::query()->where('tenant_id', \tenant()->getKey())->orderBy('order')->get()
|
2025-05-26 15:16:55 +02:00
|
|
|
);
|
2023-07-13 08:34:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2025-05-20 10:16:12 +02:00
|
|
|
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-07-13 08:34:54 +00:00
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function getDocuments(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-07-13 08:34:54 +00:00
|
|
|
{
|
2025-05-26 15:16:55 +02:00
|
|
|
return DocumentResource::collection(
|
2025-05-28 15:16:35 +02:00
|
|
|
Document::query()->where('tenant_id', \tenant()->getKey())->where('status', 1)->get()
|
2025-05-26 15:16:55 +02:00
|
|
|
);
|
2023-07-13 08:34:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param \Illuminate\Http\Request $request
|
|
|
|
|
* @return array
|
|
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function getVersion(Request $request): array
|
2023-07-13 08:34:54 +00:00
|
|
|
{
|
|
|
|
|
$app_uuid = $request->app_uuid;
|
|
|
|
|
$app_version = $request->app_version;
|
2025-05-28 15:16:35 +02:00
|
|
|
$version = Setting::query()
|
|
|
|
|
->where('tenant_id', \tenant()->getKey())
|
|
|
|
|
->where('key', 'version')
|
|
|
|
|
->value('value');
|
|
|
|
|
$ShowIsActive = Setting::query()
|
|
|
|
|
->where('tenant_id', \tenant()->getKey())
|
|
|
|
|
->where('key', 'ShowIsActive')
|
|
|
|
|
->value('value');
|
2023-07-13 08:34:54 +00:00
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
$client = new \GuzzleHttp\Client();
|
|
|
|
|
$response = $client->request(
|
|
|
|
|
'GET',
|
|
|
|
|
'https://store.ldc.fr/api/get-version?token=@P$oi6or!bL2-r%3C&app_uuid=' . $app_uuid
|
|
|
|
|
);
|
|
|
|
|
$body = $response->getBody();
|
|
|
|
|
$storeVersion = json_decode($body)->version;
|
|
|
|
|
} catch (ClientException $e) {
|
|
|
|
|
$storeVersion = $app_version;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ($storeVersion > $app_version) {
|
|
|
|
|
$newApp = true;
|
|
|
|
|
} else {
|
|
|
|
|
$newApp = false;
|
|
|
|
|
}
|
|
|
|
|
|
2025-05-20 10:16:12 +02:00
|
|
|
return ['version' => $version, 'ShowIsActive' => $ShowIsActive, 'newApp' => $newApp];
|
2023-07-13 08:34:54 +00:00
|
|
|
}
|
|
|
|
|
|
2023-08-23 09:44:51 +02:00
|
|
|
/**
|
2025-05-20 10:16:12 +02:00
|
|
|
* @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-08-23 09:44:51 +02:00
|
|
|
*/
|
2025-05-20 10:16:12 +02:00
|
|
|
public function getFormularies(): \Illuminate\Http\Resources\Json\AnonymousResourceCollection
|
2023-08-23 09:44:51 +02:00
|
|
|
{
|
2025-05-26 15:16:55 +02:00
|
|
|
return FormularyResource::collection(
|
2025-05-28 15:16:35 +02:00
|
|
|
Formulary::query()->where('tenant_id', \tenant()->getKey())->orderBy('order')->get()
|
2025-05-26 15:16:55 +02:00
|
|
|
);
|
2023-08-23 09:44:51 +02:00
|
|
|
}
|
|
|
|
|
|
2023-07-13 08:34:54 +00:00
|
|
|
/**
|
2025-05-20 10:16:12 +02:00
|
|
|
* @param \App\Http\Requests\Api\SendFlyerRequest $request
|
2023-07-13 08:34:54 +00:00
|
|
|
* @return string
|
|
|
|
|
*/
|
2025-05-28 15:16:35 +02:00
|
|
|
public function sendFlyer(Request $request): string
|
2023-07-13 08:34:54 +00:00
|
|
|
{
|
2025-09-01 10:50:04 +02:00
|
|
|
$requestData = $request->emails;
|
2023-09-01 09:30:16 +02:00
|
|
|
$email = $requestData['email'];
|
|
|
|
|
$subject = $requestData['subject'];
|
|
|
|
|
$message = $requestData['message'];
|
|
|
|
|
$app_user_id = $requestData['app_user_id'];
|
2025-09-01 10:50:04 +02:00
|
|
|
$docs = \json_decode($requestData['documents'], true);
|
2023-07-13 08:34:54 +00:00
|
|
|
|
|
|
|
|
$user = AppUser::find($app_user_id);
|
|
|
|
|
|
|
|
|
|
$attach = [];
|
|
|
|
|
$filesName = [];
|
|
|
|
|
$noExists = [];
|
|
|
|
|
foreach ($docs as $doc) {
|
2025-05-26 11:46:46 +02:00
|
|
|
$exists = Storage::disk('public')
|
2025-05-28 15:16:35 +02:00
|
|
|
->exists(sprintf('docs/%s/%s.%s', \tenant()->getKey(), $doc['uuid'], $doc['type']));
|
2023-07-13 08:34:54 +00:00
|
|
|
if ($exists) {
|
|
|
|
|
array_push($attach, URL::temporarySignedRoute(
|
2025-05-26 15:16:55 +02:00
|
|
|
'bo.docs.download',
|
2023-07-13 08:34:54 +00:00
|
|
|
now()->addDays(30),
|
2025-05-28 15:16:35 +02:00
|
|
|
['tenant' => \tenant()->getKey(), 'uuid' => $doc['uuid']]
|
2023-07-13 08:34:54 +00:00
|
|
|
));
|
|
|
|
|
array_push($filesName, $doc['title']);
|
|
|
|
|
} else {
|
|
|
|
|
array_push($noExists, $doc['title']);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (count($noExists) === 0) {
|
2025-05-28 15:16:35 +02:00
|
|
|
$mail = new SendFlyer([
|
2025-05-20 10:16:12 +02:00
|
|
|
'body' => $message,
|
|
|
|
|
'from' => $user->email,
|
|
|
|
|
'fromName' => $user->firstname . ' ' . $user->lastname,
|
2025-06-04 12:10:04 +02:00
|
|
|
'subject' => sprintf("[%s] - %s", \tenant('name'), $subject),
|
2025-05-20 10:16:12 +02:00
|
|
|
'attach' => $attach,
|
2023-07-13 08:34:54 +00:00
|
|
|
'filesName' => $filesName,
|
|
|
|
|
]);
|
|
|
|
|
|
2025-09-01 18:23:21 +02:00
|
|
|
Mail::to($email)->cc($user->email)->queue($mail);
|
2023-07-13 08:34:54 +00:00
|
|
|
} else {
|
2025-05-28 15:16:35 +02:00
|
|
|
$mail = new SendFlyerFailed([
|
2025-05-20 10:16:12 +02:00
|
|
|
'email' => $email,
|
|
|
|
|
'message' => $message,
|
|
|
|
|
'subject' => $subject,
|
2023-07-13 08:34:54 +00:00
|
|
|
'filesName' => $filesName,
|
2025-05-20 10:16:12 +02:00
|
|
|
'noExists' => $noExists
|
2023-07-13 08:34:54 +00:00
|
|
|
]);
|
|
|
|
|
|
2025-05-28 15:16:35 +02:00
|
|
|
Mail::to($user->email)->queue($mail);
|
2023-07-13 08:34:54 +00:00
|
|
|
} //end if
|
|
|
|
|
return 'OK';
|
|
|
|
|
}
|
|
|
|
|
}
|