From 382ebfb58db7c49c1f4d1e40847eebd88b300e70 Mon Sep 17 00:00:00 2001 From: TCHOUKOUAHA Boris Gautier Date: Thu, 3 Apr 2025 15:38:40 +0100 Subject: [PATCH] feat(logging): Enhance logging across controllers and add GELF logger - Added detailed logging for user authentication processes in SocialApiAuth controllers (Facebook, Google, OSM, Twitter). - Implemented logging for SousCategorieController methods to track CRUD operations. - Enhanced TrackingController with logging for position creation. - Improved UserController with comprehensive logging for registration, login, logout, and user management. - Added logging for email verification processes in VerificationController. - Integrated GELF logger for centralized logging management. - Updated composer.json to include hedii/laravel-gelf-logger package. - Configured logging.php to set up GELF logging channel with appropriate settings. --- _ide_helper.php | 654 +++++++++++++----- .../Controllers/Api/AbonnementController.php | 156 ++++- app/Http/Controllers/Api/AdminController.php | 221 +++++- app/Http/Controllers/Api/BaseController.php | 247 ++++++- .../Controllers/Api/BatimentController.php | 287 +++++++- .../Controllers/Api/CategorieController.php | 245 ++++++- .../Controllers/Api/CommentaireController.php | 208 +++++- .../Api/EtablissementController.php | 322 +++++++++ .../Controllers/Api/HoraireController.php | 161 ++++- app/Http/Controllers/Api/ImageController.php | 164 ++++- .../Controllers/Api/OsmDataController.php | 66 ++ .../Controllers/Api/PaiementController.php | 41 +- .../Controllers/Api/PermissionController.php | 218 +++++- app/Http/Controllers/Api/RoleController.php | 219 +++++- .../Controllers/Api/SettingController.php | 93 ++- .../Api/SocialApiAuthAppleController.php | 62 +- .../Api/SocialApiAuthFacebookController.php | 62 +- .../Api/SocialApiAuthGoogleController.php | 61 +- .../Api/SocialApiAuthOsmController.php | 62 +- .../Api/SocialApiAuthTwitterController.php | 62 +- .../Api/SousCategorieController.php | 93 +++ .../Controllers/Api/TrackingController.php | 16 +- app/Http/Controllers/Api/UserController.php | 205 +++++- .../Api/VerificationController.php | 40 ++ composer.json | 1 + config/logging.php | 108 ++- 26 files changed, 3708 insertions(+), 366 deletions(-) diff --git a/_ide_helper.php b/_ide_helper.php index 27d429fb..a01f37e0 100644 --- a/_ide_helper.php +++ b/_ide_helper.php @@ -5,7 +5,7 @@ /** * A helper file for Laravel, to provide autocomplete information to your IDE - * Generated for Laravel 10.48.11. + * Generated for Laravel 10.48.29. * * This file should not be included in your code, only analyzed by your IDE! * @@ -722,7 +722,7 @@ * @param int $code * @param string $message * @param array $headers - * @return \Illuminate\Foundation\never + * @return never * @throws \Symfony\Component\HttpKernel\Exception\HttpException * @throws \Symfony\Component\HttpKernel\Exception\NotFoundHttpException * @static @@ -1146,7 +1146,7 @@ * Resolve all of the bindings for a given tag. * * @param string $tag - * @return \Illuminate\Container\iterable + * @return iterable * @static */ public static function tagged($tag) { //Method inherited from \Illuminate\Container\Container @@ -3535,8 +3535,8 @@ * * @template TCacheValue * @param array|string $key - * @param \Illuminate\Cache\TCacheValue|\Illuminate\Cache\(\Closure(): TCacheValue) $default - * @return \Illuminate\Cache\(TCacheValue is null ? mixed : TCacheValue) + * @param TCacheValue|(\Closure(): TCacheValue) $default + * @return (TCacheValue is null ? mixed : TCacheValue) * @static */ public static function get($key, $default = null) { @@ -3559,10 +3559,10 @@ /** * Obtains multiple cache items by their unique keys. * - * @return \Illuminate\Cache\iterable - * @param \Psr\SimpleCache\iterable $keys A list of keys that can be obtained in a single operation. + * @return iterable + * @param iterable $keys A list of keys that can be obtained in a single operation. * @param mixed $default Default value to return for keys that do not exist. - * @return \Psr\SimpleCache\iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. + * @return iterable A list of key => value pairs. Cache keys that do not exist or are stale will have $default as value. * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $keys is neither an array nor a Traversable, * or if any of the $keys are not a legal value. @@ -3577,8 +3577,8 @@ * * @template TCacheValue * @param array|string $key - * @param \Illuminate\Cache\TCacheValue|\Illuminate\Cache\(\Closure(): TCacheValue) $default - * @return \Illuminate\Cache\(TCacheValue is null ? mixed : TCacheValue) + * @param TCacheValue|(\Closure(): TCacheValue) $default + * @return (TCacheValue is null ? mixed : TCacheValue) * @static */ public static function pull($key, $default = null) { @@ -3632,7 +3632,7 @@ * Persists a set of key => value pairs in the cache, with an optional TTL. * * @return bool - * @param \Psr\SimpleCache\iterable $values A list of key => value pairs for a multiple-set operation. + * @param iterable $values A list of key => value pairs for a multiple-set operation. * @param null|int|\DateInterval $ttl Optional. The TTL value of this item. If no value is sent and * the driver supports TTL then the library may set a default value * for it or let the driver take care of that. @@ -3702,7 +3702,7 @@ * @param string $key * @param \Closure|\DateTimeInterface|\DateInterval|int|null $ttl * @param \Closure(): TCacheValue $callback - * @return \Illuminate\Cache\TCacheValue + * @return TCacheValue * @static */ public static function remember($key, $ttl, $callback) { @@ -3715,7 +3715,7 @@ * @template TCacheValue * @param string $key * @param \Closure(): TCacheValue $callback - * @return \Illuminate\Cache\TCacheValue + * @return TCacheValue * @static */ public static function sear($key, $callback) { @@ -3728,7 +3728,7 @@ * @template TCacheValue * @param string $key * @param \Closure(): TCacheValue $callback - * @return \Illuminate\Cache\TCacheValue + * @return TCacheValue * @static */ public static function rememberForever($key, $callback) { @@ -3764,7 +3764,7 @@ * Deletes multiple cache items in a single operation. * * @return bool - * @param \Psr\SimpleCache\iterable $keys A list of string-based keys to be deleted. + * @param iterable $keys A list of string-based keys to be deleted. * @return bool True if the items were successfully removed. False if there was an error. * @throws \Psr\SimpleCache\InvalidArgumentException * MUST be thrown if $keys is neither an array nor a Traversable, @@ -6700,10 +6700,10 @@ * * @template TWhenParameter * @template TWhenReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TWhenParameter)|TWhenParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TWhenReturnType + * @param (\Closure($this): TWhenParameter)|TWhenParameter|null $value + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $callback + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $default + * @return $this|TWhenReturnType * @static */ public static function when($value = null, $callback = null, $default = null) { @@ -6715,10 +6715,10 @@ * * @template TUnlessParameter * @template TUnlessReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TUnlessReturnType + * @param (\Closure($this): TUnlessParameter)|TUnlessParameter|null $value + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $callback + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default + * @return $this|TUnlessReturnType * @static */ public static function unless($value = null, $callback = null, $default = null) { @@ -6875,7 +6875,7 @@ /** * Determine if all of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $ability + * @param iterable|string $ability * @param array|mixed $arguments * @return bool * @static @@ -6887,7 +6887,7 @@ /** * Determine if any of the given abilities should be denied for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $ability + * @param iterable|string $ability * @param array|mixed $arguments * @return bool * @static @@ -6899,7 +6899,7 @@ /** * Determine if all of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param iterable|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -6911,7 +6911,7 @@ /** * Determine if any one of the given abilities should be granted for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param iterable|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -6923,7 +6923,7 @@ /** * Determine if all of the given abilities should be denied for the current user. * - * @param \Illuminate\Auth\Access\iterable|string $abilities + * @param iterable|string $abilities * @param array|mixed $arguments * @return bool * @static @@ -10787,6 +10787,7 @@ * @param array $files The request files ($_FILES) * @param array $server The server parameters ($_SERVER) * @param string|resource|null $content The raw body data + * @throws BadRequestException When the URI is invalid * @static */ public static function create($uri, $method = 'GET', $parameters = [], $cookies = [], $files = [], $server = [], $content = null) { //Method inherited from \Symfony\Component\HttpFoundation\Request @@ -10930,7 +10931,7 @@ * * * @internal - * @param \Symfony\Component\HttpFoundation\callable(): SessionInterface $factory + * @param callable(): SessionInterface $factory * @static */ public static function setSessionFactory($factory) { //Method inherited from \Symfony\Component\HttpFoundation\Request @@ -12018,8 +12019,8 @@ * * @template TEnum * @param string $key - * @param \Illuminate\Http\class-string $enumClass - * @return \Illuminate\Http\TEnum|null + * @param class-string $enumClass + * @return TEnum|null * @static */ public static function enum($key, $enumClass) { @@ -12143,7 +12144,7 @@ * Dump the request items and end the script. * * @param mixed $keys - * @return \Illuminate\Http\never + * @return never * @static */ public static function dd(...$keys) { @@ -15349,10 +15350,10 @@ * * @template TWhenParameter * @template TWhenReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TWhenParameter)|TWhenParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TWhenParameter): TWhenReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TWhenReturnType + * @param (\Closure($this): TWhenParameter)|TWhenParameter|null $value + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $callback + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $default + * @return $this|TWhenReturnType * @static */ public static function when($value = null, $callback = null, $default = null) { @@ -15364,10 +15365,10 @@ * * @template TUnlessParameter * @template TUnlessReturnType - * @param \Illuminate\Filesystem\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param \Illuminate\Filesystem\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|\Illuminate\Filesystem\TUnlessReturnType + * @param (\Closure($this): TUnlessParameter)|TUnlessParameter|null $value + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $callback + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default + * @return $this|TUnlessReturnType * @static */ public static function unless($value = null, $callback = null, $default = null) { @@ -17080,7 +17081,7 @@ /** * Use the given callback to resolve attributes for script tags. * - * @param \Illuminate\Foundation\(callable(string, string, ?array, ?array): array)|array $attributes + * @param (callable(string, string, ?array, ?array): array)|array $attributes * @return \Illuminate\Foundation\Vite * @static */ public static function useScriptTagAttributes($attributes) @@ -17091,7 +17092,7 @@ /** * Use the given callback to resolve attributes for style tags. * - * @param \Illuminate\Foundation\(callable(string, string, ?array, ?array): array)|array $attributes + * @param (callable(string, string, ?array, ?array): array)|array $attributes * @return \Illuminate\Foundation\Vite * @static */ public static function useStyleTagAttributes($attributes) @@ -17102,7 +17103,7 @@ /** * Use the given callback to resolve attributes for preload tags. * - * @param \Illuminate\Foundation\(callable(string, string, ?array, ?array): (array|false))|array|false $attributes + * @param (callable(string, string, ?array, ?array): (array|false))|array|false $attributes * @return \Illuminate\Foundation\Vite * @static */ public static function usePreloadTagAttributes($attributes) @@ -17221,6 +17222,126 @@ } } +namespace Althinect\FilamentSpatieRolesPermissions { + /** + * + * + */ class FilamentSpatieRolesPermissionsFacade { + /** + * Run a Closure when the facade has been resolved. + * + * @param \Closure $callback + * @return void + * @static + */ public static function resolved($callback) + { //Method inherited from \Illuminate\Support\Facades\Facade + \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::resolved($callback); + } + /** + * Convert the facade into a Mockery spy. + * + * @return \Mockery\MockInterface + * @static + */ public static function spy() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::spy(); + } + /** + * Initiate a partial mock on the facade. + * + * @return \Mockery\MockInterface + * @static + */ public static function partialMock() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::partialMock(); + } + /** + * Initiate a mock expectation on the facade. + * + * @return \Mockery\Expectation + * @static + */ public static function shouldReceive() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::shouldReceive(); + } + /** + * Initiate a mock expectation on the facade. + * + * @return \Mockery\Expectation + * @static + */ public static function expects() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::expects(); + } + /** + * Hotswap the underlying instance behind the facade. + * + * @param mixed $instance + * @return void + * @static + */ public static function swap($instance) + { //Method inherited from \Illuminate\Support\Facades\Facade + \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::swap($instance); + } + /** + * Get the root object behind the facade. + * + * @return mixed + * @static + */ public static function getFacadeRoot() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::getFacadeRoot(); + } + /** + * Clear a resolved facade instance. + * + * @param string $name + * @return void + * @static + */ public static function clearResolvedInstance($name) + { //Method inherited from \Illuminate\Support\Facades\Facade + \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::clearResolvedInstance($name); + } + /** + * Clear all of the resolved instances. + * + * @return void + * @static + */ public static function clearResolvedInstances() + { //Method inherited from \Illuminate\Support\Facades\Facade + \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::clearResolvedInstances(); + } + /** + * Get the application default aliases. + * + * @return \Illuminate\Support\Collection + * @static + */ public static function defaultAliases() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::defaultAliases(); + } + /** + * Get the application instance behind the facade. + * + * @return \Illuminate\Contracts\Foundation\Application|null + * @static + */ public static function getFacadeApplication() + { //Method inherited from \Illuminate\Support\Facades\Facade + return \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::getFacadeApplication(); + } + /** + * Set the application instance. + * + * @param \Illuminate\Contracts\Foundation\Application|null $app + * @return void + * @static + */ public static function setFacadeApplication($app) + { //Method inherited from \Illuminate\Support\Facades\Facade + \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade::setFacadeApplication($app); + } + } + } + namespace AnourValar\EloquentSerialize\Facades { /** * @@ -17229,8 +17350,9 @@ /** * Pack * - * @param \Illuminate\Database\Eloquent\Builder $builder + * @param \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Eloquent\Relations\Relation $builder * @return string + * @throws \RuntimeException * @static */ public static function serialize($builder) { @@ -17679,6 +17801,15 @@ { /** @var \Livewire\LivewireManager $instance */ return $instance->current(); + } + /** + * + * + * @static + */ public static function findSynth($keyOrTarget, $component) + { + /** @var \Livewire\LivewireManager $instance */ + return $instance->findSynth($keyOrTarget, $component); } /** * @@ -18038,6 +18169,48 @@ { /** @var \Maatwebsite\Excel\Excel $instance */ return $instance->queueImport($import, $filePath, $disk, $readerType); + } + /** + * Register a custom macro. + * + * @param string $name + * @param object|callable $macro + * @return void + * @static + */ public static function macro($name, $macro) + { + \Maatwebsite\Excel\Excel::macro($name, $macro); + } + /** + * Mix another object into the class. + * + * @param object $mixin + * @param bool $replace + * @return void + * @throws \ReflectionException + * @static + */ public static function mixin($mixin, $replace = true) + { + \Maatwebsite\Excel\Excel::mixin($mixin, $replace); + } + /** + * Checks if macro is registered. + * + * @param string $name + * @return bool + * @static + */ public static function hasMacro($name) + { + return \Maatwebsite\Excel\Excel::hasMacro($name); + } + /** + * Flush the existing macros. + * + * @return void + * @static + */ public static function flushMacros() + { + \Maatwebsite\Excel\Excel::flushMacros(); } /** * @@ -18170,7 +18343,7 @@ /** * * - * @return \Spatie\Health\Collection + * @return Collection * @static */ public static function registeredChecks() { @@ -18180,7 +18353,7 @@ /** * * - * @return \Spatie\Health\Collection + * @return Collection * @static */ public static function resultStores() { @@ -18317,10 +18490,20 @@ * * * @static - */ public static function withStackFrameArguments($withStackFrameArguments = true) + */ public static function withStackFrameArguments($withStackFrameArguments = true, $forcePHPIniSetting = false) { /** @var \Spatie\FlareClient\Flare $instance */ - return $instance->withStackFrameArguments($withStackFrameArguments); + return $instance->withStackFrameArguments($withStackFrameArguments, $forcePHPIniSetting); + } + /** + * + * + * @param class-string $exceptionClass + * @static + */ public static function overrideGrouping($exceptionClass, $type = 'exception_message_and_class') + { + /** @var \Spatie\FlareClient\Flare $instance */ + return $instance->overrideGrouping($exceptionClass, $type); } /** * @@ -18389,7 +18572,7 @@ /** * * - * @param \Spatie\FlareClient\FlareMiddleware\FlareMiddleware|array|\Spatie\FlareClient\class-string|callable $middleware + * @param \Spatie\FlareClient\FlareMiddleware\FlareMiddleware|array|class-string|callable $middleware * @return \Spatie\FlareClient\Flare * @static */ public static function registerMiddleware($middleware) @@ -18852,10 +19035,11 @@ * @param mixed $alias * @param bool $disableExtraConditions * @param string|null $morphable + * @param bool $hasCheck * @static - */ public static function performJoinForEloquentPowerJoins($builder, $joinType = 'leftJoin', $callback = null, $alias = null, $disableExtraConditions = false, $morphable = null) + */ public static function performJoinForEloquentPowerJoins($builder, $joinType = 'leftJoin', $callback = null, $alias = null, $disableExtraConditions = false, $morphable = null, $hasCheck = false) { - return \Illuminate\Database\Eloquent\Relations\Relation::performJoinForEloquentPowerJoins($builder, $joinType, $callback, $alias, $disableExtraConditions, $morphable); + return \Illuminate\Database\Eloquent\Relations\Relation::performJoinForEloquentPowerJoins($builder, $joinType, $callback, $alias, $disableExtraConditions, $morphable, $hasCheck); } /** * @@ -18937,10 +19121,11 @@ * @param mixed $callback * @param mixed $alias * @param bool $disableExtraConditions + * @param bool $hasCheck * @static - */ public static function performJoinForEloquentPowerJoinsForHasMany($builder, $joinType, $callback = null, $alias = null, $disableExtraConditions = false) + */ public static function performJoinForEloquentPowerJoinsForHasMany($builder, $joinType, $callback = null, $alias = null, $disableExtraConditions = false, $hasCheck = false) { - return \Illuminate\Database\Eloquent\Relations\Relation::performJoinForEloquentPowerJoinsForHasMany($builder, $joinType, $callback, $alias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Relations\Relation::performJoinForEloquentPowerJoinsForHasMany($builder, $joinType, $callback, $alias, $disableExtraConditions, $hasCheck); } /** * @@ -19212,22 +19397,24 @@ * * @see \Filament\Actions\Testing\TestsActions::assertActionVisible() * @param array|string $name + * @param array $arguments * @return static * @static - */ public static function assertActionVisible($name) + */ public static function assertActionVisible($name, $arguments = []) { - return \Livewire\Features\SupportTesting\Testable::assertActionVisible($name); + return \Livewire\Features\SupportTesting\Testable::assertActionVisible($name, $arguments); } /** * * * @see \Filament\Actions\Testing\TestsActions::assertActionHidden() * @param array|string $name + * @param array $arguments * @return static * @static - */ public static function assertActionHidden($name) + */ public static function assertActionHidden($name, $arguments = []) { - return \Livewire\Features\SupportTesting\Testable::assertActionHidden($name); + return \Livewire\Features\SupportTesting\Testable::assertActionHidden($name, $arguments); } /** * @@ -19539,6 +19726,31 @@ */ public static function assertFormExists($name = 'form') { return \Livewire\Features\SupportTesting\Testable::assertFormExists($name); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::assertFormComponentExists() + * @param string $componentKey + * @param \Closure|string $formName + * @param \Closure|null $checkComponentUsing + * @return static + * @static + */ public static function assertFormComponentExists($componentKey, $formName = 'form', $checkComponentUsing = null) + { + return \Livewire\Features\SupportTesting\Testable::assertFormComponentExists($componentKey, $formName, $checkComponentUsing); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::assertFormComponentDoesNotExist() + * @param string $componentKey + * @param string $formName + * @return static + * @static + */ public static function assertFormComponentDoesNotExist($componentKey, $formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::assertFormComponentDoesNotExist($componentKey, $formName); } /** * @@ -19552,6 +19764,18 @@ */ public static function assertFormFieldExists($fieldName, $formName = 'form', $checkFieldUsing = null) { return \Livewire\Features\SupportTesting\Testable::assertFormFieldExists($fieldName, $formName, $checkFieldUsing); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::assertFormFieldDoesNotExist() + * @param string $fieldName + * @param string $formName + * @return static + * @static + */ public static function assertFormFieldDoesNotExist($fieldName, $formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::assertFormFieldDoesNotExist($fieldName, $formName); } /** * @@ -19612,6 +19836,64 @@ */ public static function assertFormFieldIsVisible($fieldName, $formName = 'form') { return \Livewire\Features\SupportTesting\Testable::assertFormFieldIsVisible($fieldName, $formName); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::assertWizardStepExists() + * @param int $step + * @param string $formName + * @return static + * @static + */ public static function assertWizardStepExists($step, $formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::assertWizardStepExists($step, $formName); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::assertWizardCurrentStep() + * @param int $step + * @param string $formName + * @return static + * @static + */ public static function assertWizardCurrentStep($step, $formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::assertWizardCurrentStep($step, $formName); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::goToWizardStep() + * @param int $step + * @param string $formName + * @return static + * @static + */ public static function goToWizardStep($step, $formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::goToWizardStep($step, $formName); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::goToNextWizardStep() + * @param string $formName + * @return static + * @static + */ public static function goToNextWizardStep($formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::goToNextWizardStep($formName); + } + /** + * + * + * @see \Filament\Forms\Testing\TestsForms::goToPreviousWizardStep() + * @param string $formName + * @return static + * @static + */ public static function goToPreviousWizardStep($formName = 'form') + { + return \Livewire\Features\SupportTesting\Testable::goToPreviousWizardStep($formName); } /** * @@ -20423,12 +20705,12 @@ * * * @see \Filament\Tables\Testing\TestsActions::assertTableActionDataSet() - * @param array $data + * @param \Closure|array $state * @return static * @static - */ public static function assertTableActionDataSet($data) + */ public static function assertTableActionDataSet($state) { - return \Livewire\Features\SupportTesting\Testable::assertTableActionDataSet($data); + return \Livewire\Features\SupportTesting\Testable::assertTableActionDataSet($state); } /** * @@ -20783,12 +21065,12 @@ * * * @see \Filament\Tables\Testing\TestsBulkActions::assertTableBulkActionDataSet() - * @param array $data + * @param \Closure|array $state * @return static * @static - */ public static function assertTableBulkActionDataSet($data) + */ public static function assertTableBulkActionDataSet($state) { - return \Livewire\Features\SupportTesting\Testable::assertTableBulkActionDataSet($data); + return \Livewire\Features\SupportTesting\Testable::assertTableBulkActionDataSet($state); } /** * @@ -21327,11 +21609,34 @@ * * @see \Filament\Tables\Testing\TestsFilters::assertTableFilterExists() * @param string $name + * @param \Closure|null $checkFilterUsing + * @return static + * @static + */ public static function assertTableFilterExists($name, $checkFilterUsing = null) + { + return \Livewire\Features\SupportTesting\Testable::assertTableFilterExists($name, $checkFilterUsing); + } + /** + * + * + * @see \Filament\Tables\Testing\TestsFilters::assertTableFilterVisible() + * @param string $name + * @return static + * @static + */ public static function assertTableFilterVisible($name) + { + return \Livewire\Features\SupportTesting\Testable::assertTableFilterVisible($name); + } + /** + * + * + * @see \Filament\Tables\Testing\TestsFilters::assertTableFilterHidden() + * @param string $name * @return static * @static - */ public static function assertTableFilterExists($name) + */ public static function assertTableFilterHidden($name) { - return \Livewire\Features\SupportTesting\Testable::assertTableFilterExists($name); + return \Livewire\Features\SupportTesting\Testable::assertTableFilterHidden($name); } /** * @@ -22129,7 +22434,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * @template TModelValue * @param \Closure(): TModelValue $scope - * @return \Illuminate\Database\Eloquent\TModelValue + * @return TModelValue * @static */ public static function withSavepointIfNeeded($scope) { @@ -22456,10 +22761,10 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * @template TWhenParameter * @template TWhenReturnType - * @param \Illuminate\Database\Eloquent\(\Closure($this): TWhenParameter)|TWhenParameter|null $value - * @param \Illuminate\Database\Eloquent\(callable($this, TWhenParameter): TWhenReturnType)|null $callback - * @param \Illuminate\Database\Eloquent\(callable($this, TWhenParameter): TWhenReturnType)|null $default - * @return $this|\Illuminate\Database\Eloquent\TWhenReturnType + * @param (\Closure($this): TWhenParameter)|TWhenParameter|null $value + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $callback + * @param (callable($this, TWhenParameter): TWhenReturnType)|null $default + * @return $this|TWhenReturnType * @static */ public static function when($value = null, $callback = null, $default = null) { @@ -22471,10 +22776,10 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * @template TUnlessParameter * @template TUnlessReturnType - * @param \Illuminate\Database\Eloquent\(\Closure($this): TUnlessParameter)|TUnlessParameter|null $value - * @param \Illuminate\Database\Eloquent\(callable($this, TUnlessParameter): TUnlessReturnType)|null $callback - * @param \Illuminate\Database\Eloquent\(callable($this, TUnlessParameter): TUnlessReturnType)|null $default - * @return $this|\Illuminate\Database\Eloquent\TUnlessReturnType + * @param (\Closure($this): TUnlessParameter)|TUnlessParameter|null $value + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $callback + * @param (callable($this, TUnlessParameter): TUnlessReturnType)|null $default + * @return $this|TUnlessReturnType * @static */ public static function unless($value = null, $callback = null, $default = null) { @@ -22988,8 +23293,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::newPowerJoinClause() * @param \Illuminate\Database\Query\Builder $parentQuery - * @param mixed $type - * @param mixed $table + * @param string $type + * @param string $table * @param \Illuminate\Database\Eloquent\Model|null $model * @static */ public static function newPowerJoinClause($parentQuery, $type, $table, $model = null) @@ -23000,10 +23305,10 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::joinRelationship() - * @param mixed $relationName - * @param mixed $callback - * @param mixed $joinType - * @param mixed $useAlias + * @param string $relationName + * @param \Closure|array|string|null $callback + * @param string $joinType + * @param bool $useAlias * @param bool $disableExtraConditions * @param string|null $morphable * @static @@ -23015,126 +23320,135 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::joinRelationshipUsingAlias() - * @param mixed $relationName - * @param mixed $callback + * @param string $relationName + * @param \Closure|array|string|null $callback * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function joinRelationshipUsingAlias($relationName, $callback = null, $disableExtraConditions = false) + */ public static function joinRelationshipUsingAlias($relationName, $callback = null, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::joinRelationshipUsingAlias($relationName, $callback, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::joinRelationshipUsingAlias($relationName, $callback, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::leftJoinRelationshipUsingAlias() - * @param mixed $relationName - * @param mixed $callback + * @param string $relationName + * @param \Closure|array|string|null $callback * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function leftJoinRelationshipUsingAlias($relationName, $callback = null, $disableExtraConditions = false) + */ public static function leftJoinRelationshipUsingAlias($relationName, $callback = null, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::leftJoinRelationshipUsingAlias($relationName, $callback, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::leftJoinRelationshipUsingAlias($relationName, $callback, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::rightJoinRelationshipUsingAlias() - * @param mixed $relationName - * @param mixed $callback + * @param string $relationName + * @param \Closure|array|string|null $callback * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function rightJoinRelationshipUsingAlias($relationName, $callback = null, $disableExtraConditions = false) + */ public static function rightJoinRelationshipUsingAlias($relationName, $callback = null, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::rightJoinRelationshipUsingAlias($relationName, $callback, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::rightJoinRelationshipUsingAlias($relationName, $callback, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::joinRelation() - * @param mixed $relationName - * @param mixed $callback - * @param mixed $joinType - * @param mixed $useAlias + * @param string $relationName + * @param \Closure|array|string|null $callback + * @param string $joinType + * @param bool $useAlias * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function joinRelation($relationName, $callback = null, $joinType = 'join', $useAlias = false, $disableExtraConditions = false) + */ public static function joinRelation($relationName, $callback = null, $joinType = 'join', $useAlias = false, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::joinRelation($relationName, $callback, $joinType, $useAlias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::joinRelation($relationName, $callback, $joinType, $useAlias, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::leftJoinRelationship() - * @param mixed $relation - * @param mixed $callback - * @param mixed $useAlias + * @param string $relationName + * @param \Closure|array|string|null $callback + * @param bool $useAlias * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function leftJoinRelationship($relation, $callback = null, $useAlias = false, $disableExtraConditions = false) + */ public static function leftJoinRelationship($relationName, $callback = null, $useAlias = false, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::leftJoinRelationship($relation, $callback, $useAlias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::leftJoinRelationship($relationName, $callback, $useAlias, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::leftJoinRelation() - * @param mixed $relation - * @param mixed $callback - * @param mixed $useAlias + * @param string $relation + * @param \Closure|array|string|null $callback + * @param bool $useAlias * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function leftJoinRelation($relation, $callback = null, $useAlias = false, $disableExtraConditions = false) + */ public static function leftJoinRelation($relation, $callback = null, $useAlias = false, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::leftJoinRelation($relation, $callback, $useAlias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::leftJoinRelation($relation, $callback, $useAlias, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::rightJoinRelationship() - * @param mixed $relation - * @param mixed $callback - * @param mixed $useAlias + * @param string $relation + * @param \Closure|array|string|null $callback + * @param bool $useAlias * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function rightJoinRelationship($relation, $callback = null, $useAlias = false, $disableExtraConditions = false) + */ public static function rightJoinRelationship($relation, $callback = null, $useAlias = false, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::rightJoinRelationship($relation, $callback, $useAlias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::rightJoinRelationship($relation, $callback, $useAlias, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::rightJoinRelation() - * @param mixed $relation - * @param mixed $callback - * @param mixed $useAlias + * @param string $relation + * @param \Closure|array|string|null $callback + * @param bool $useAlias * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function rightJoinRelation($relation, $callback = null, $useAlias = false, $disableExtraConditions = false) + */ public static function rightJoinRelation($relation, $callback = null, $useAlias = false, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::rightJoinRelation($relation, $callback, $useAlias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::rightJoinRelation($relation, $callback, $useAlias, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::joinNestedRelationship() * @param string $relationships - * @param mixed $callback - * @param mixed $joinType - * @param mixed $useAlias + * @param \Closure|array|string|null $callback + * @param string $joinType + * @param bool $useAlias * @param bool $disableExtraConditions + * @param string|null $morphable * @static - */ public static function joinNestedRelationship($relationships, $callback = null, $joinType = 'join', $useAlias = false, $disableExtraConditions = false) + */ public static function joinNestedRelationship($relationships, $callback = null, $joinType = 'join', $useAlias = false, $disableExtraConditions = false, $morphable = null) { - return \Illuminate\Database\Eloquent\Builder::joinNestedRelationship($relationships, $callback, $joinType, $useAlias, $disableExtraConditions); + return \Illuminate\Database\Eloquent\Builder::joinNestedRelationship($relationships, $callback, $joinType, $useAlias, $disableExtraConditions, $morphable); } /** * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByPowerJoins() - * @param mixed $sort - * @param mixed $direction - * @param mixed $aggregation - * @param mixed $joinType + * @param array|string $sort + * @param string $direction + * @param string|null $aggregation + * @param string $joinType * @param mixed $aliases * @static */ public static function orderByPowerJoins($sort, $direction = 'asc', $aggregation = null, $joinType = 'join', $aliases = null) @@ -23145,8 +23459,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByLeftPowerJoins() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByLeftPowerJoins($sort, $direction = 'asc') { @@ -23156,8 +23470,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByPowerJoinsCount() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByPowerJoinsCount($sort, $direction = 'asc') { @@ -23167,8 +23481,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByLeftPowerJoinsCount() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByLeftPowerJoinsCount($sort, $direction = 'asc') { @@ -23178,8 +23492,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByPowerJoinsSum() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByPowerJoinsSum($sort, $direction = 'asc') { @@ -23189,8 +23503,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByLeftPowerJoinsSum() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByLeftPowerJoinsSum($sort, $direction = 'asc') { @@ -23200,8 +23514,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByPowerJoinsAvg() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByPowerJoinsAvg($sort, $direction = 'asc') { @@ -23211,8 +23525,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByLeftPowerJoinsAvg() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByLeftPowerJoinsAvg($sort, $direction = 'asc') { @@ -23222,8 +23536,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByPowerJoinsMin() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByPowerJoinsMin($sort, $direction = 'asc') { @@ -23233,8 +23547,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByLeftPowerJoinsMin() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByLeftPowerJoinsMin($sort, $direction = 'asc') { @@ -23244,8 +23558,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByPowerJoinsMax() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByPowerJoinsMax($sort, $direction = 'asc') { @@ -23255,8 +23569,8 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::orderByLeftPowerJoinsMax() - * @param mixed $sort - * @param mixed $direction + * @param array|string $sort + * @param string $direction * @static */ public static function orderByLeftPowerJoinsMax($sort, $direction = 'asc') { @@ -23266,11 +23580,11 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::powerJoinHas() - * @param mixed $relation - * @param mixed $operator - * @param mixed $count + * @param string $relation + * @param string $operator + * @param int $count * @param mixed $boolean - * @param \Closure|array|null $callback + * @param \Closure|array|string|null $callback * @param string|null $morphable * @return static * @static @@ -23282,11 +23596,11 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * * * @see \Kirschbaum\PowerJoins\Mixins\JoinRelationship::hasNestedUsingJoins() - * @param mixed $relations - * @param mixed $operator - * @param mixed $count - * @param mixed $boolean - * @param \Closure|array|null $callback + * @param string $relations + * @param string $operator + * @param int $count + * @param string $boolean + * @param \Closure|array|string|null $callback * @return static * @static */ public static function hasNestedUsingJoins($relations, $operator = '>=', $count = 1, $boolean = 'and', $callback = null) @@ -23326,6 +23640,15 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { */ public static function getGroupBy() { return \Illuminate\Database\Eloquent\Builder::getGroupBy(); + } + /** + * + * + * @see \Kirschbaum\PowerJoins\Mixins\QueryRelationshipExistence::getScopes() + * @static + */ public static function getScopes() + { + return \Illuminate\Database\Eloquent\Builder::getScopes(); } /** * @@ -23929,7 +24252,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * Add a where between statement to the query. * * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values + * @param iterable $values * @param string $boolean * @param bool $not * @return \Illuminate\Database\Query\Builder @@ -23957,7 +24280,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * Add an or where between statement to the query. * * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values + * @param iterable $values * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereBetween($column, $values) @@ -23981,7 +24304,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * Add a where not between statement to the query. * * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values + * @param iterable $values * @param string $boolean * @return \Illuminate\Database\Query\Builder * @static @@ -24007,7 +24330,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * Add an or where not between statement to the query. * * @param \Illuminate\Contracts\Database\Query\Expression|string $column - * @param \Illuminate\Database\Query\iterable $values + * @param iterable $values * @return \Illuminate\Database\Query\Builder * @static */ public static function orWhereNotBetween($column, $values) @@ -24637,7 +24960,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { * Add a "having between " clause to the query. * * @param string $column - * @param \Illuminate\Database\Query\iterable $values + * @param iterable $values * @param string $boolean * @param bool $not * @return \Illuminate\Database\Query\Builder @@ -25367,7 +25690,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { /** * Die and dump the current SQL and bindings. * - * @return \Illuminate\Database\Query\never + * @return never * @static */ public static function dd() { @@ -25377,7 +25700,7 @@ class Eloquent extends \Illuminate\Database\Eloquent\Model { /** * Die and dump the current SQL with embedded bindings. * - * @return \Illuminate\Database\Query\never + * @return never * @static */ public static function ddRawSql() { @@ -25467,6 +25790,7 @@ class URL extends \Illuminate\Support\Facades\URL {} class Validator extends \Illuminate\Support\Facades\Validator {} class View extends \Illuminate\Support\Facades\View {} class Vite extends \Illuminate\Support\Facades\Vite {} + class FilamentSpatieRolesPermissions extends \Althinect\FilamentSpatieRolesPermissions\FilamentSpatieRolesPermissionsFacade {} class EloquentSerialize extends \AnourValar\EloquentSerialize\Facades\EloquentSerializeFacade {} class RequestLogger extends \Bilfeldt\RequestLogger\RequestLoggerFacade {} class Firebase extends \Kreait\Laravel\Firebase\Facades\Firebase {} diff --git a/app/Http/Controllers/Api/AbonnementController.php b/app/Http/Controllers/Api/AbonnementController.php index fd72630d..b844e6d9 100644 --- a/app/Http/Controllers/Api/AbonnementController.php +++ b/app/Http/Controllers/Api/AbonnementController.php @@ -4,7 +4,8 @@ use App\Models\Abonnement; use Illuminate\Http\Request; -use Validator; +use Illuminate\Support\Facades\Log; +use Illuminate\Support\Facades\Validator; /** * @@ -21,8 +22,18 @@ class AbonnementController extends BaseController */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des abonnements', ['controller' => 'AbonnementController', 'method' => 'index']); + $abonnements = Abonnement::all(); + // Log du nombre d'abonnements récupérés + Log::info('Liste des abonnements récupérée', [ + 'controller' => 'AbonnementController', + 'method' => 'index', + 'count' => count($abonnements) + ]); + $success['abonnements'] = $abonnements; return $this->sendResponse($success, 'Liste des Abonnements'); @@ -40,13 +51,27 @@ public function index() */ public function store(Request $request) { - $validator = Validator::make($request->all(), [ + // Log du début de la création + Log::debug('Tentative de création d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'store', + 'inputs' => $request->all() + ]); + + $validator = Validator::make($request->all(), [ 'nom' => 'required', 'prix' => 'required', 'duree' => 'required', ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -54,14 +79,28 @@ public function store(Request $request) $input['prix'] = $request->prix; $input['duree'] = $request->duree; try { - $abonnement = Abonnement::create($input); - $success['abonnement'] = $abonnement; + // Log du succès de la création + Log::info('Abonnement créé avec succès', [ + 'controller' => 'AbonnementController', + 'method' => 'store', + 'abonnement_id' => $abonnement->id, + 'abonnement_nom' => $abonnement->nom + ]); + $success['abonnement'] = $abonnement; return $this->sendResponse($success, "Création de l'abonnement reussie", 201); } catch (\Exception $ex) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'store', + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } @@ -74,8 +113,31 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'show', + 'abonnement_id' => $id + ]); + $abonnement = Abonnement::find($id); + // Log du résultat de la recherche + if ($abonnement) { + Log::info('Détails de l\'abonnement récupérés', [ + 'controller' => 'AbonnementController', + 'method' => 'show', + 'abonnement_id' => $id, + 'abonnement_nom' => $abonnement->nom + ]); + } else { + Log::warning('Abonnement non trouvé', [ + 'controller' => 'AbonnementController', + 'method' => 'show', + 'abonnement_id' => $id + ]); + } + $success['abonnement'] = $abonnement; return $this->sendResponse($success, "Abonnement"); @@ -95,21 +157,69 @@ public function show($id) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'update', + 'abonnement_id' => $id, + 'inputs' => $request->all() + ]); + try { $abonnement = Abonnement::find($id); + if (!$abonnement) { + Log::warning('Tentative de mise à jour d\'un abonnement inexistant', [ + 'controller' => 'AbonnementController', + 'method' => 'update', + 'abonnement_id' => $id + ]); + return $this->sendError('Abonnement non trouvé', [], 404); + } + + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs de l\'abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'update', + 'abonnement_id' => $id, + 'old_values' => [ + 'nom' => $abonnement->nom, + 'prix' => $abonnement->prix, + 'duree' => $abonnement->duree + ] + ]); + $abonnement->nom = $request->nom ?? $abonnement->nom; $abonnement->prix = $request->prix ?? $abonnement->prix; $abonnement->duree = $request->duree ?? $abonnement->duree; - $abonnement->save(); - $success['abonnement'] = $abonnement; + // Log du succès de la mise à jour + Log::info('Abonnement mis à jour avec succès', [ + 'controller' => 'AbonnementController', + 'method' => 'update', + 'abonnement_id' => $id, + 'new_values' => [ + 'nom' => $abonnement->nom, + 'prix' => $abonnement->prix, + 'duree' => $abonnement->duree + ] + ]); + $success['abonnement'] = $abonnement; return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'update', + 'abonnement_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Echec de mise à jour', ['error' => $th->getMessage()], 400); } } @@ -123,12 +233,46 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'destroy', + 'abonnement_id' => $id + ]); + $abonnement = Abonnement::find($id); + if (!$abonnement) { + Log::warning('Tentative de suppression d\'un abonnement inexistant', [ + 'controller' => 'AbonnementController', + 'method' => 'destroy', + 'abonnement_id' => $id + ]); + return $this->sendError('Abonnement non trouvé', [], 404); + } + try { $abonnement->delete(); + + // Log du succès de la suppression + Log::info('Abonnement supprimé avec succès', [ + 'controller' => 'AbonnementController', + 'method' => 'destroy', + 'abonnement_id' => $id, + 'abonnement_nom' => $abonnement->nom + ]); + return $this->sendResponse("", "Delete Success", 200); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un abonnement', [ + 'controller' => 'AbonnementController', + 'method' => 'destroy', + 'abonnement_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur de suppression.', ['error' => $th->getMessage()], 400); } } diff --git a/app/Http/Controllers/Api/AdminController.php b/app/Http/Controllers/Api/AdminController.php index 7eba0530..d0ff1325 100644 --- a/app/Http/Controllers/Api/AdminController.php +++ b/app/Http/Controllers/Api/AdminController.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @authenticated @@ -25,12 +26,25 @@ class AdminController extends BaseController */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des administrateurs', [ + 'controller' => 'AdminController', + 'method' => 'index' + ]); + $admins = Admin::all(); foreach ($admins as $admin) { $admin->user->roles; } + // Log du nombre d'administrateurs récupérés + Log::info('Liste des administrateurs récupérée', [ + 'controller' => 'AdminController', + 'method' => 'index', + 'count' => count($admins) + ]); + $success['admins'] = $admins; return $this->sendResponse($success, 'Liste des Admins'); @@ -48,10 +62,18 @@ public function index() */ public function store(Request $request) { + // Log du début de la création + Log::debug('Tentative de création d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'store', + 'inputs' => array_diff_key($request->all(), ['password' => '']) // On exclut le mot de passe des logs + ]); + $user = Auth::user(); $admin = Admin::where('user_id', $user->id)->first(); + if ($admin->isSuperAdmin == 1) { - $validator = Validator::make($request->all(), [ + $validator = Validator::make($request->all(), [ 'name' => 'required', 'email' => 'required|unique:users,email', 'phone' => 'regex:/^[\+0-9]+$/', @@ -60,6 +82,13 @@ public function store(Request $request) ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -72,13 +101,25 @@ public function store(Request $request) $fileName = time() . '_' . $request->image_profil->getClientOriginalName(); $filePath = $request->file('image_profil')->storeAs('uploads/admins/profils', $fileName, 'public'); $input['image_profil'] = '/storage/' . $filePath; - } - + // Log de l'upload de fichier + Log::debug('Image de profil uploadée pour nouvel administrateur', [ + 'controller' => 'AdminController', + 'method' => 'store', + 'filename' => $fileName, + 'path' => $filePath + ]); + } try { - DB::beginTransaction(); + + // Log du début de la transaction + Log::debug('Début de transaction pour création d\'administrateur', [ + 'controller' => 'AdminController', + 'method' => 'store' + ]); + $user = User::create($input); $user->assignRole('admin'); $user->sendEmailVerificationNotification(); @@ -91,14 +132,40 @@ public function store(Request $request) DB::commit(); + // Log du succès de la création + Log::info('Administrateur créé avec succès', [ + 'controller' => 'AdminController', + 'method' => 'store', + 'admin_id' => $admin->id, + 'user_id' => $user->id, + 'user_email' => $user->email + ]); + $success['admin'] = $admin; return $this->sendResponse($success, "Création de l'admin reussie", 201); } catch (\Exception $ex) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la création d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'store', + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } else { + // Log de l'accès non autorisé + Log::warning('Tentative non autorisée de création d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'store', + 'user_id' => $user->id, + 'is_super_admin' => $admin ? $admin->isSuperAdmin : 'null' + ]); + return $this->sendError("Pas autorisé.", ['error' => 'Unauthorised']); } } @@ -112,9 +179,34 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'show', + 'admin_id' => $id + ]); + $admin = Admin::find($id); + + if (!$admin) { + Log::warning('Administrateur non trouvé', [ + 'controller' => 'AdminController', + 'method' => 'show', + 'admin_id' => $id + ]); + return $this->sendError('Administrateur non trouvé', [], 404); + } + $admin->user->roles; + // Log du succès de la récupération + Log::info('Détails de l\'administrateur récupérés', [ + 'controller' => 'AdminController', + 'method' => 'show', + 'admin_id' => $id, + 'user_id' => $admin->user_id + ]); + $success['admin'] = $admin; return $this->sendResponse($success, "Admin"); @@ -134,16 +226,43 @@ public function show($id) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id, + 'inputs' => $request->except('image_profil') + ]); + $user = Auth::user(); $admin = Admin::where('user_id', $user->id)->first(); + if ($admin->isSuperAdmin == 1 || $user->id == $id) { $admin = Admin::find($id); + + if (!$admin) { + Log::warning('Tentative de mise à jour d\'un administrateur inexistant', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id + ]); + return $this->sendError('Administrateur non trouvé', [], 404); + } + $request->validate([ 'image_profil' => 'mimes:png,jpg,jpeg|max:20000' ]); try { DB::beginTransaction(); + + // Log du début de la transaction + Log::debug('Début de transaction pour mise à jour d\'administrateur', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id + ]); + $userUpdate = User::find($admin->user_id); $userUpdate->name = $request->name ?? $userUpdate->name; $userUpdate->phone = $request->phone ?? $userUpdate->phone; @@ -152,25 +271,60 @@ public function update(Request $request, $id) $fileName = time() . '_' . $request->image_profil->getClientOriginalName(); $filePath = $request->file('image_profil')->storeAs('uploads/admins/profils', $fileName, 'public'); $userUpdate->image_profil = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Image de profil mise à jour pour administrateur', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id, + 'filename' => $fileName, + 'path' => $filePath + ]); } $userUpdate->save(); - - $admin->isSuperAdmin = $request->isSuperAdmin ?? $admin->isSuperAdmin; $admin->save(); $admin->user->roles; DB::commit(); + // Log du succès de la mise à jour + Log::info('Administrateur mis à jour avec succès', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id, + 'user_id' => $userUpdate->id, + 'is_super_admin' => $admin->isSuperAdmin + ]); + $success['admin'] = $admin; return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['Echec de mise à jour' => $th->getMessage()], 400); } } else { + // Log de l'accès non autorisé + Log::warning('Tentative non autorisée de mise à jour d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'update', + 'admin_id' => $id, + 'user_id' => $user->id, + 'is_super_admin' => $admin ? $admin->isSuperAdmin : 'null' + ]); + return $this->sendError("Pas autorisé.", ['error' => 'Unauthorised']); } } @@ -184,24 +338,77 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'destroy', + 'admin_id' => $id + ]); + $user = Auth::user(); $admin = Admin::where('user_id', $user->id)->first(); + if ($admin->isSuperAdmin == 1 || $user->id == $id) { $admin = Admin::find($id); + if (!$admin) { + Log::warning('Tentative de suppression d\'un administrateur inexistant', [ + 'controller' => 'AdminController', + 'method' => 'destroy', + 'admin_id' => $id + ]); + return $this->sendError('Administrateur non trouvé', [], 404); + } + try { DB::beginTransaction(); - $admin->user()->delete(); + // Log du début de la transaction + Log::debug('Début de transaction pour suppression d\'administrateur', [ + 'controller' => 'AdminController', + 'method' => 'destroy', + 'admin_id' => $id, + 'user_id' => $admin->user_id + ]); + + $admin->user()->delete(); $admin->delete(); DB::commit(); + // Log du succès de la suppression + Log::info('Administrateur supprimé avec succès', [ + 'controller' => 'AdminController', + 'method' => 'destroy', + 'admin_id' => $id + ]); + return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'destroy', + 'admin_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Echec de suppression.', ['error' => $th->getMessage()], 400); } + } else { + // Log de l'accès non autorisé + Log::warning('Tentative non autorisée de suppression d\'un administrateur', [ + 'controller' => 'AdminController', + 'method' => 'destroy', + 'admin_id' => $id, + 'user_id' => $user->id, + 'is_super_admin' => $admin ? $admin->isSuperAdmin : 'null' + ]); + + return $this->sendError("Pas autorisé.", ['error' => 'Unauthorised']); } } } diff --git a/app/Http/Controllers/Api/BaseController.php b/app/Http/Controllers/Api/BaseController.php index af9c8d6f..ba984d16 100644 --- a/app/Http/Controllers/Api/BaseController.php +++ b/app/Http/Controllers/Api/BaseController.php @@ -9,6 +9,7 @@ use App\Models\UserFavoris; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; class BaseController extends Controller { @@ -19,6 +20,14 @@ class BaseController extends Controller */ public function sendResponse($result, $message, $code = 200) { + // Log de la réponse réussie + Log::debug('Envoi d\'une réponse réussie', [ + 'controller' => 'BaseController', + 'method' => 'sendResponse', + 'code' => $code, + 'message' => $message + ]); + $response = [ 'success' => true, 'data' => $result, @@ -35,6 +44,15 @@ public function sendResponse($result, $message, $code = 200) */ public function sendError($error, $errorMessages = [], $code = 400) { + // Log de la réponse d'erreur + Log::warning('Envoi d\'une réponse d\'erreur', [ + 'controller' => 'BaseController', + 'method' => 'sendError', + 'code' => $code, + 'error' => $error, + 'errorMessages' => $errorMessages + ]); + $response = [ 'success' => false, 'message' => $error, @@ -54,6 +72,13 @@ public function sendError($error, $errorMessages = [], $code = 400) */ public function randomString($length = 8) { + // Log de la génération d'une chaîne aléatoire + Log::debug('Génération d\'une chaîne aléatoire', [ + 'controller' => 'BaseController', + 'method' => 'randomString', + 'length' => $length + ]); + $characters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; $charactersLength = strlen($characters); $randomString = ''; @@ -65,6 +90,13 @@ public function randomString($length = 8) public function sendSms(User $user, $phone, $passworduser) { + // Log de l'envoi d'un SMS + Log::debug('Tentative d\'envoi de SMS', [ + 'controller' => 'BaseController', + 'method' => 'sendSms', + 'user_id' => $user->id, + 'phone' => $phone + ]); $username = env("NEXAH_USERNAME"); $password = env("NEXAH_PASSWORD"); @@ -89,17 +121,36 @@ public function sendSms(User $user, $phone, $passworduser) curl_close($curl); - - + // Log du résultat de l'envoi du SMS if ($err) { + Log::error('Erreur lors de l\'envoi du SMS', [ + 'controller' => 'BaseController', + 'method' => 'sendSms', + 'user_id' => $user->id, + 'phone' => $phone, + 'error' => $err + ]); return $err; } else { + Log::info('SMS envoyé avec succès', [ + 'controller' => 'BaseController', + 'method' => 'sendSms', + 'user_id' => $user->id, + 'phone' => $phone, + 'response' => $response + ]); return $response; } } - public function getMoyenneRatingByEtablissmeent($etablissement_id) + public function getMoyenneRatingByEtablissmeent($etablissement_id) { + // Log du calcul de la moyenne des notes + Log::debug('Calcul de la moyenne des notes d\'un établissement', [ + 'controller' => 'BaseController', + 'method' => 'getMoyenneRatingByEtablissmeent', + 'etablissement_id' => $etablissement_id + ]); $commentaires = Commentaire::where('etablissement_id', $etablissement_id)->get(); $moyenne = 0; @@ -109,39 +160,107 @@ public function getMoyenneRatingByEtablissmeent($etablissement_id) if ($moyenne == 0) { return 0; } - return $moyenne / count($commentaires); + + $resultat = $moyenne / count($commentaires); + + // Log du résultat + Log::debug('Moyenne des notes calculée', [ + 'controller' => 'BaseController', + 'method' => 'getMoyenneRatingByEtablissmeent', + 'etablissement_id' => $etablissement_id, + 'moyenne' => $resultat, + 'nombre_commentaires' => count($commentaires) + ]); + + return $resultat; } public function getCommentNumberByEtablissmeent($etablissement_id) { + // Log du comptage des commentaires + Log::debug('Comptage des commentaires d\'un établissement', [ + 'controller' => 'BaseController', + 'method' => 'getCommentNumberByEtablissmeent', + 'etablissement_id' => $etablissement_id + ]); + $commentaires = Commentaire::where('etablissement_id', $etablissement_id)->get(); - return count($commentaires); + $count = count($commentaires); + + // Log du résultat + Log::debug('Nombre de commentaires compté', [ + 'controller' => 'BaseController', + 'method' => 'getCommentNumberByEtablissmeent', + 'etablissement_id' => $etablissement_id, + 'count' => $count + ]); + + return $count; } public function countOccurenceRatingInCommentTableByEtablissement($etablissement_id) { - return DB::table('commentaires') + // Log du comptage des occurrences de notes + Log::debug('Comptage des occurrences de notes pour un établissement', [ + 'controller' => 'BaseController', + 'method' => 'countOccurenceRatingInCommentTableByEtablissement', + 'etablissement_id' => $etablissement_id + ]); + + $result = DB::table('commentaires') ->select(DB::raw('count(*) as count, rating')) ->where('etablissement_id', $etablissement_id) ->groupBy('rating') ->get(); + + // Log du résultat + Log::debug('Occurrences de notes comptées', [ + 'controller' => 'BaseController', + 'method' => 'countOccurenceRatingInCommentTableByEtablissement', + 'etablissement_id' => $etablissement_id, + 'result_count' => count($result) + ]); + + return $result; } public function checkIfEtablissementInFavoris($id, $user_id) { + // Log de la vérification des favoris + Log::debug('Vérification si un établissement est en favoris pour un utilisateur', [ + 'controller' => 'BaseController', + 'method' => 'checkIfEtablissementInFavoris', + 'etablissement_id' => $id, + 'user_id' => $user_id + ]); + $userFavoris = UserFavoris::where('user_id', $user_id)->where('etablissement_id', $id)->first(); - if ($userFavoris) { - return true; - } else { - return false; - } + $result = ($userFavoris) ? true : false; + + // Log du résultat + Log::debug('Résultat de la vérification des favoris', [ + 'controller' => 'BaseController', + 'method' => 'checkIfEtablissementInFavoris', + 'etablissement_id' => $id, + 'user_id' => $user_id, + 'is_favoris' => $result + ]); + + return $result; } - public function checkIfEtablassimentInDataArray($etablissement, $data) + public function checkIfEtablassimentInDataArray($etablissement, $data) { - foreach ($data as $value) { + // Log de la vérification de l'établissement dans le tableau + Log::debug('Vérification si un établissement est dans un tableau de données', [ + 'controller' => 'BaseController', + 'method' => 'checkIfEtablassimentInDataArray', + 'etablissement_id' => $etablissement->id + ]); + + foreach ($data as $value) { if ($value->id == $etablissement->id) { return true; } @@ -149,9 +268,16 @@ public function checkIfEtablassimentInDataArray($etablissement, $data) return false; } - //Convert day string to int day of week + // Convert day string to int day of week public function convertDayToInt($day) { + // Log de la conversion du jour de la semaine + Log::debug('Conversion d\'un jour en entier', [ + 'controller' => 'BaseController', + 'method' => 'convertDayToInt', + 'day' => $day + ]); + switch ($day) { case 'Lundi': return 1; @@ -177,54 +303,105 @@ public function convertDayToInt($day) } } - //get all Horaires by Etablissement and convert horaire jour to int day of week + // get all Horaires by Etablissement and convert horaire jour to int day of week public function getAllHorairesByEtablissement($idEtablissement) { + // Log de la récupération des horaires + Log::debug('Récupération des horaires d\'un établissement', [ + 'controller' => 'BaseController', + 'method' => 'getAllHorairesByEtablissement', + 'etablissement_id' => $idEtablissement + ]); + $horaires = Horaire::where('etablissement_id', $idEtablissement)->get(); foreach ($horaires as $horaire) { $horaire->jour = $this->convertDayToInt($horaire->jour); } - return $horaires; - } - //Convert plageHoraire example1:07:00-11:00;13:00-17:00 from Horaires to Time and return json response + // Log du résultat + Log::debug('Horaires récupérés et convertis', [ + 'controller' => 'BaseController', + 'method' => 'getAllHorairesByEtablissement', + 'etablissement_id' => $idEtablissement, + 'count' => count($horaires) + ]); + return $horaires; + } + // Convert plageHoraire example1:07:00-11:00;13:00-17:00 from Horaires to Time and return json response public function convertPlageHoraireToTime($plageHoraire) { + // Log de la conversion des plages horaires + Log::debug('Conversion des plages horaires', [ + 'controller' => 'BaseController', + 'method' => 'convertPlageHoraireToTime', + 'plageHoraire' => $plageHoraire + ]); + $plageHoraire1 = explode(";", $plageHoraire); $data = array(); - foreach ($plageHoraire1 as $plage) { + foreach ($plageHoraire1 as $plage) { $plage1 = explode("-", $plage); $data[] = array( 'debut' => $plage1[0], 'fin' => $plage1[1] ); } - return $data; - } - - - + // Log du résultat + Log::debug('Plages horaires converties', [ + 'controller' => 'BaseController', + 'method' => 'convertPlageHoraireToTime', + 'result_count' => count($data) + ]); + return $data; + } - //check if Etablissement is open now + // check if Etablissement is open now public function checkIfEtablissementIsOpen($idEtablissement) { + // Log de la vérification d'ouverture + Log::debug('Vérification si un établissement est ouvert', [ + 'controller' => 'BaseController', + 'method' => 'checkIfEtablissementIsOpen', + 'etablissement_id' => $idEtablissement + ]); + $horaires = $this->getAllHorairesByEtablissement($idEtablissement); $now = Carbon::now(); $nowH = $now->format('H:i'); - foreach ($horaires as $horaire) { + foreach ($horaires as $horaire) { if ($horaire->jour == $now->dayOfWeek) { $plageHoraire = $this->convertPlageHoraireToTime($horaire->plage_horaire); - foreach ($plageHoraire as $plage) { + foreach ($plageHoraire as $plage) { if ($nowH >= $plage['debut'] && $nowH <= $plage['fin']) { + // Log du résultat positif + Log::info('Établissement ouvert', [ + 'controller' => 'BaseController', + 'method' => 'checkIfEtablissementIsOpen', + 'etablissement_id' => $idEtablissement, + 'current_time' => $nowH, + 'day_of_week' => $now->dayOfWeek, + 'plage_debut' => $plage['debut'], + 'plage_fin' => $plage['fin'] + ]); return true; } } } } + + // Log du résultat négatif + Log::info('Établissement fermé', [ + 'controller' => 'BaseController', + 'method' => 'checkIfEtablissementIsOpen', + 'etablissement_id' => $idEtablissement, + 'current_time' => $nowH, + 'day_of_week' => $now->dayOfWeek + ]); + return false; } @@ -244,6 +421,15 @@ public static function vincentyGreatCircleDistance( $latitudeTo, $longitudeTo, ) { + // Log du calcul de distance + Log::debug('Calcul de distance entre deux points', [ + 'method' => 'vincentyGreatCircleDistance', + 'latitudeFrom' => $latitudeFrom, + 'longitudeFrom' => $longitudeFrom, + 'latitudeTo' => $latitudeTo, + 'longitudeTo' => $longitudeTo + ]); + $pi80 = M_PI / 180; $latitudeFrom *= $pi80; $longitudeFrom *= $pi80; @@ -255,6 +441,13 @@ public static function vincentyGreatCircleDistance( $a = sin($dlat / 2) * sin($dlat / 2) + cos($latitudeFrom) * cos($latitudeTo) * sin($dlon / 2) * sin($dlon / 2); $c = 2 * atan2(sqrt($a), sqrt(1 - $a)); $km = $r * $c; + + // Log du résultat + Log::debug('Distance calculée', [ + 'method' => 'vincentyGreatCircleDistance', + 'distance_km' => $km + ]); + return round($km); } } diff --git a/app/Http/Controllers/Api/BatimentController.php b/app/Http/Controllers/Api/BatimentController.php index bd60ea30..60c98e55 100644 --- a/app/Http/Controllers/Api/BatimentController.php +++ b/app/Http/Controllers/Api/BatimentController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @@ -28,11 +29,18 @@ class BatimentController extends BaseController */ public function index(Request $request) { + // Log du début de la requête + Log::debug('Récupération de la liste des bâtiments', [ + 'controller' => 'BatimentController', + 'method' => 'index', + 'user_id' => $request->user_id + ]); + $batiments = Batiment::all(); foreach ($batiments as $batiment) { $batiment->etablissements; - foreach ($batiment->etablissements as $etablissement) { + foreach ($batiment->etablissements as $etablissement) { if ($request->user_id) { $etablissement->isFavoris = $this->checkIfEtablissementInFavoris($etablissement->id, $request->user_id); @@ -57,7 +65,7 @@ public function index(Request $request) // $etablissement['sousCategories'] = $etablissement->sousCategories; $etablissement->commodites; - foreach ($etablissement->sousCategories as $sousCategories) { + foreach ($etablissement->sousCategories as $sousCategories) { $sousCategories->categorie; } @@ -65,12 +73,19 @@ public function index(Request $request) $etablissement->images; // $etablissement->commentaires; - foreach ($etablissement->commentaires as $commentaires) { + foreach ($etablissement->commentaires as $commentaires) { $commentaires->user; } } } + // Log du nombre de bâtiments récupérés + Log::info('Liste des bâtiments récupérée', [ + 'controller' => 'BatimentController', + 'method' => 'index', + 'count' => count($batiments) + ]); + $success['batiments'] = $batiments; return $this->sendResponse($success, 'Liste des Batiments'); @@ -94,8 +109,15 @@ public function index(Request $request) */ public function store(Request $request) { + // Log du début de la création + Log::debug('Tentative de création d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'store', + 'inputs' => $request->except('image') + ]); + $user = Auth::user(); - $validator = Validator::make($request->all(), [ + $validator = Validator::make($request->all(), [ 'nombre_niveau' => 'required', 'code' => 'required', 'longitude' => 'required', @@ -106,6 +128,14 @@ public function store(Request $request) ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -125,16 +155,42 @@ public function store(Request $request) $fileName = time() . '_' . $request->image->getClientOriginalName(); $filePath = $request->file('image')->storeAs('uploads/batiments/images/' . $request->code, $fileName, 'public'); $input['image'] = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Image uploadée pour nouveau bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'store', + 'filename' => $fileName, + 'path' => $filePath, + 'code' => $request->code + ]); } try { $batiment = $user->batiments()->create($input); + // Log du succès de la création + Log::info('Bâtiment créé avec succès', [ + 'controller' => 'BatimentController', + 'method' => 'store', + 'batiment_id' => $batiment->id, + 'batiment_code' => $batiment->code, + 'user_id' => $user->id + ]); $success['batiment'] = $batiment; return $this->sendResponse($success, "Création du batiment reussie", 201); } catch (\Exception $ex) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'store', + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } @@ -148,8 +204,25 @@ public function store(Request $request) */ public function show($id, Request $request) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'show', + 'batiment_id' => $id, + 'user_id' => $request->user_id + ]); + $batiment = Batiment::find($id); + if (!$batiment) { + Log::warning('Bâtiment non trouvé', [ + 'controller' => 'BatimentController', + 'method' => 'show', + 'batiment_id' => $id + ]); + return $this->sendError('Bâtiment non trouvé', [], 404); + } + $batiment->etablissements; @@ -194,6 +267,15 @@ public function show($id, Request $request) } } + // Log du succès de la récupération + Log::info('Détails du bâtiment récupérés', [ + 'controller' => 'BatimentController', + 'method' => 'show', + 'batiment_id' => $id, + 'batiment_code' => $batiment->code, + 'nombre_etablissements' => count($batiment->etablissements) + ]); + $success['batiment'] = $batiment; return $this->sendResponse($success, "Batiment"); @@ -218,10 +300,42 @@ public function show($id, Request $request) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'update', + 'batiment_id' => $id, + 'inputs' => $request->except('image') + ]); + $batiment = Batiment::find($id); + if (!$batiment) { + Log::warning('Tentative de mise à jour d\'un bâtiment inexistant', [ + 'controller' => 'BatimentController', + 'method' => 'update', + 'batiment_id' => $id + ]); + return $this->sendError('Bâtiment non trouvé', [], 404); + } try { + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs du bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'update', + 'batiment_id' => $id, + 'old_values' => [ + 'nom' => $batiment->nom, + 'nombre_niveau' => $batiment->nombre_niveau, + 'longitude' => $batiment->longitude, + 'latitude' => $batiment->latitude, + 'ville' => $batiment->ville, + 'quartier' => $batiment->quartier, + 'commune' => $batiment->commune + ] + ]); + $batiment->nom = $request->nom ?? $batiment->nom; $batiment->nombre_niveau = $request->nombre_niveau ?? $batiment->nombre_niveau; $batiment->longitude = $request->longitude ?? $batiment->longitude; @@ -236,15 +350,50 @@ public function update(Request $request, $id) $fileName = time() . '_' . $request->image->getClientOriginalName(); $filePath = $request->file('image')->storeAs('uploads/batiments/images/' . $batiment->code, $fileName, 'public'); $batiment->image = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Image mise à jour pour bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'update', + 'batiment_id' => $id, + 'filename' => $fileName, + 'path' => $filePath, + 'code' => $batiment->code + ]); } $batiment->save(); + // Log du succès de la mise à jour + Log::info('Bâtiment mis à jour avec succès', [ + 'controller' => 'BatimentController', + 'method' => 'update', + 'batiment_id' => $id, + 'new_values' => [ + 'nom' => $batiment->nom, + 'nombre_niveau' => $batiment->nombre_niveau, + 'longitude' => $batiment->longitude, + 'latitude' => $batiment->latitude, + 'ville' => $batiment->ville, + 'quartier' => $batiment->quartier, + 'commune' => $batiment->commune + ] + ]); + $success['batiment'] = $batiment; return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'update', + 'batiment_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $th->getMessage()], 400); } } @@ -257,41 +406,93 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'destroy', + 'batiment_id' => $id + ]); + $user = Auth::user(); $batiment = Batiment::find($id); + + if (!$batiment) { + Log::warning('Tentative de suppression d\'un bâtiment inexistant', [ + 'controller' => 'BatimentController', + 'method' => 'destroy', + 'batiment_id' => $id + ]); + return $this->sendError('Bâtiment non trouvé', [], 404); + } + $admin = Admin::where('user_id', $user->id)->first(); if ($admin || $user->id == $batiment->user_id) { - try { DB::beginTransaction(); + // Log du début de la transaction + Log::debug('Début de transaction pour suppression de bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'destroy', + 'batiment_id' => $id, + 'nombre_etablissements' => count($batiment->etablissements) + ]); - foreach ($batiment->etablissements as $etablissement) { + foreach ($batiment->etablissements as $etablissement) { $etablissement->images()->delete(); $etablissement->horaires()->delete(); $etablissement->commentaires()->delete(); - foreach ($etablissement->sousCategories as $sousCategorie) { + foreach ($etablissement->sousCategories as $sousCategorie) { $etablissement->sousCategories()->detach($sousCategorie->id); } - foreach ($etablissement->commodites as $commodite) { + foreach ($etablissement->commodites as $commodite) { $etablissement->commodites()->detach($commodite->id); } } $batiment->etablissements()->delete(); - $batiment->delete(); DB::commit(); + // Log du succès de la suppression + Log::info('Bâtiment supprimé avec succès', [ + 'controller' => 'BatimentController', + 'method' => 'destroy', + 'batiment_id' => $id, + 'batiment_code' => $batiment->code, + 'user_id' => $user->id + ]); + return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'destroy', + 'batiment_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } + } else { + // Log de l'accès non autorisé + Log::warning('Tentative non autorisée de suppression d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'destroy', + 'batiment_id' => $id, + 'user_id' => $user->id, + 'batiment_owner_id' => $batiment->user_id + ]); + + return $this->sendError('Non autorisé à supprimer ce bâtiment', [], 403); } } @@ -301,15 +502,29 @@ public function destroy($id) * @header Content-Type application/json * @bodyParam batiment String required. Example : {"nom": "BOUTIQUE DE MICAL","nombre_niveau": "3","code": "BATIMENT_1013434286","longitude": "11.229207","latitude": "4.078288","indication": "derrierre station","rue": "Rue de la Mairie","ville": "Douala","commune": "Douala 3","quartier": "Nyalla","user_id": 1,"etablissement": {"id": 1,"nom": "BOUTIQUE DE MICAL","indication_adresse": "Face station","code_postal": "BP 4326 Douala", "site_internet": "www.site.com","user_id": "1","etage": "1","phone": "699999999","whatsapp1": "699999999","whatsapp2": "699999998","description": "bel etablissement","nom_manager": "Mical","contact_manager": "Mical","commodites": "Wifi","services": "OM;MOMO","ameliorations": "Ajouter des videos","idSousCategorie": "1","horaires": [{"jour": "lundi","plage_horaire": "07:00-12:00;14:00-17:00"}]}} */ - public function addCompletBatiment(Request $request) { + // Log du début de la création complète + Log::debug('Tentative de création complète d\'un bâtiment avec établissement', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'inputs' => $request->except('batiment.etablissement.commodites', 'batiment.etablissement.services') + ]); + $user = Auth::user(); - $validator = Validator::make($request->all(), [ + $validator = Validator::make($request->all(), [ 'batiment' => 'required', ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création complète d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'errors' => $validator->errors()->toArray(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -318,6 +533,14 @@ public function addCompletBatiment(Request $request) try { DB::beginTransaction(); + // Log du début de la transaction + Log::debug('Début de transaction pour création complète de bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'code' => $batiment['code'], + 'user_id' => $user->id + ]); + $bati = Batiment::create([ 'nom' => $batiment['nom'], 'nombre_niveau' => $batiment['nombre_niveau'], @@ -335,33 +558,65 @@ public function addCompletBatiment(Request $request) $etablissement = $batiment['etablissement']; $etablissement['user_id'] = $user->id; - - $etabli = $bati->etablissements()->create($etablissement); if ($etablissement['idSousCategorie'] != null) { $idSousCategories = explode(",", $etablissement['idSousCategorie']); $sousCategories = SousCategorie::find($idSousCategories); $etabli->sousCategories()->attach($sousCategories); - } - + // Log de l'attachement des sous-catégories + Log::debug('Sous-catégories attachées à l\'établissement', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'etablissement_id' => $etabli->id, + 'sous_categories' => $idSousCategories + ]); + } $horaires = $etablissement['horaires']; - foreach ($horaires as $horaire) { + foreach ($horaires as $horaire) { $etabli->horaires()->create($horaire); } + // Log de la création des horaires + Log::debug('Horaires créés pour l\'établissement', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'etablissement_id' => $etabli->id, + 'nombre_horaires' => count($horaires) + ]); + $bati['etablissement'] = $etabli; DB::commit(); + // Log du succès de la création complète + Log::info('Création complète de bâtiment avec établissement réussie', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'batiment_id' => $bati->id, + 'batiment_code' => $bati->code, + 'etablissement_id' => $etabli->id, + 'user_id' => $user->id + ]); + $success['batiment'] = $bati; return $this->sendResponse($success, "Création des batiments reussie", 201); } catch (\Exception $th) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la création complète d\'un bâtiment', [ + 'controller' => 'BatimentController', + 'method' => 'addCompletBatiment', + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur.', ['error' => $th->getMessage()], 400); } } diff --git a/app/Http/Controllers/Api/CategorieController.php b/app/Http/Controllers/Api/CategorieController.php index 568a9321..34ae564b 100644 --- a/app/Http/Controllers/Api/CategorieController.php +++ b/app/Http/Controllers/Api/CategorieController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @@ -22,12 +23,25 @@ class CategorieController extends BaseController */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des catégories', [ + 'controller' => 'CategorieController', + 'method' => 'index' + ]); + $categories = Categorie::orderBy('vues', 'DESC')->get(); - foreach ($categories as $categorie) { + foreach ($categories as $categorie) { $categorie->sousCategories; } + // Log du nombre de catégories récupérées + Log::info('Liste des catégories récupérée', [ + 'controller' => 'CategorieController', + 'method' => 'index', + 'count' => count($categories) + ]); + $success['categories'] = $categories; return $this->sendResponse($success, 'Liste des Categories'); @@ -45,7 +59,14 @@ public function index() */ public function store(Request $request) { - $validator = Validator::make($request->all(), [ + // Log du début de la création + Log::debug('Tentative de création d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'store', + 'inputs' => $request->except(['logourl', 'logourlmap']) + ]); + + $validator = Validator::make($request->all(), [ 'nom' => 'required', 'shortname' => 'required', 'logourl' => 'mimes:png,jpg,jpeg,svg|max:20000', @@ -53,6 +74,13 @@ public function store(Request $request) ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -66,27 +94,59 @@ public function store(Request $request) $input['color'] = $request->color; - if ($request->file()) { + if ($request->file('logourl')) { $fileName = time() . '_' . $request->logourl->getClientOriginalName(); $filePath = $request->file('logourl')->storeAs('uploads/categories/logos/' . $request->nom, $fileName, 'public'); $input['logourl'] = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Logo principal uploadé pour nouvelle catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'store', + 'filename' => $fileName, + 'path' => $filePath, + 'categorie_nom' => $request->nom + ]); } - if ($request->file()) { + if ($request->file('logourlmap')) { $fileName = time() . '_' . $request->logourlmap->getClientOriginalName(); $filePathMap = $request->file('logourlmap')->storeAs('uploads/categories/logos/' . $request->nom, $fileName, 'public'); $input['logourlmap'] = '/storage/' . $filePathMap; + + // Log de l'upload de fichier + Log::debug('Logo map uploadé pour nouvelle catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'store', + 'filename' => $fileName, + 'path' => $filePathMap, + 'categorie_nom' => $request->nom + ]); } try { - $categorie = Categorie::create($input); - $success['categorie'] = $categorie; + // Log du succès de la création + Log::info('Catégorie créée avec succès', [ + 'controller' => 'CategorieController', + 'method' => 'store', + 'categorie_id' => $categorie->id, + 'categorie_nom' => $categorie->nom + ]); + $success['categorie'] = $categorie; return $this->sendResponse($success, "Création de la catégorie reussie", 201); } catch (\Exception $ex) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'store', + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } @@ -99,11 +159,35 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'show', + 'categorie_id' => $id + ]); + $categorie = Categorie::find($id); + if (!$categorie) { + Log::warning('Catégorie non trouvée', [ + 'controller' => 'CategorieController', + 'method' => 'show', + 'categorie_id' => $id + ]); + return $this->sendError('Catégorie non trouvée', [], 404); + } $categorie->sousCategories; + // Log du succès de la récupération + Log::info('Détails de la catégorie récupérés', [ + 'controller' => 'CategorieController', + 'method' => 'show', + 'categorie_id' => $id, + 'categorie_nom' => $categorie->nom, + 'nombre_sous_categories' => count($categorie->sousCategories) + ]); + $success['categorie'] = $categorie; return $this->sendResponse($success, 'Categorie'); @@ -124,45 +208,119 @@ public function show($id) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'inputs' => $request->except(['logourl', 'logourlmap']) + ]); + $categorie = Categorie::find($id); + + if (!$categorie) { + Log::warning('Tentative de mise à jour d\'une catégorie inexistante', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id + ]); + return $this->sendError('Catégorie non trouvée', [], 404); + } + $request->validate([ 'logourl' => 'mimes:png,jpg,jpeg,svg|max:20000', 'logourlmap' => 'mimes:png,jpg,jpeg,svg|max:20000', ]); - if ($request->file()) { + if ($request->file('logourl')) { $fileName = time() . '_' . $request->logourl->getClientOriginalName(); $filePath = $request->file('logourl')->storeAs('uploads/categories/logos/' . $categorie->nom, $fileName, 'public'); $categorie->logourl = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Logo principal mis à jour pour catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'filename' => $fileName, + 'path' => $filePath + ]); } - if ($request->file()) { + if ($request->file('logourlmap')) { $fileName = time() . '_' . $request->logourlmap->getClientOriginalName(); $filePathMap = $request->file('logourlmap')->storeAs('uploads/categories/logos/' . $categorie->nom, $fileName, 'public'); $categorie->logourlmap = '/storage/' . $filePathMap; - } + // Log de l'upload de fichier + Log::debug('Logo map mis à jour pour catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'filename' => $fileName, + 'path' => $filePathMap + ]); + } try { + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs de la catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'old_values' => [ + 'nom' => $categorie->nom, + 'shortname' => $categorie->shortname, + 'color' => $categorie->color, + 'vues' => $categorie->vues + ] + ]); $categorie->nom = $request->nom ?? $categorie->nom; $categorie->shortname = $request->shortname ?? $categorie->shortname; $categorie->color = $request->color ?? $categorie->color; if ($request->vues) { - $categorie->vues = $categorie->vues + 1; + $categorie->vues = $categorie->vues + 1; + + // Log de l'incrémentation des vues + Log::debug('Incrémentation des vues de la catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'old_vues' => $categorie->vues - 1, + 'new_vues' => $categorie->vues + ]); } - - $categorie->save(); + // Log du succès de la mise à jour + Log::info('Catégorie mise à jour avec succès', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'new_values' => [ + 'nom' => $categorie->nom, + 'shortname' => $categorie->shortname, + 'color' => $categorie->color, + 'vues' => $categorie->vues + ] + ]); $success['categorie'] = $categorie; - return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'update', + 'categorie_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $th->getMessage()], 400); } } @@ -176,20 +334,62 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'destroy', + 'categorie_id' => $id + ]); + $categorie = Categorie::find($id); + if (!$categorie) { + Log::warning('Tentative de suppression d\'une catégorie inexistante', [ + 'controller' => 'CategorieController', + 'method' => 'destroy', + 'categorie_id' => $id + ]); + return $this->sendError('Catégorie non trouvée', [], 404); + } + try { DB::beginTransaction(); - $categorie->sousCategories()->delete(); + // Log du début de la transaction + Log::debug('Début de transaction pour suppression de catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'destroy', + 'categorie_id' => $id, + 'categorie_nom' => $categorie->nom, + 'nombre_sous_categories' => count($categorie->sousCategories) + ]); + $categorie->sousCategories()->delete(); $categorie->delete(); DB::commit(); + // Log du succès de la suppression + Log::info('Catégorie supprimée avec succès', [ + 'controller' => 'CategorieController', + 'method' => 'destroy', + 'categorie_id' => $id, + 'categorie_nom' => $categorie->nom + ]); + return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'une catégorie', [ + 'controller' => 'CategorieController', + 'method' => 'destroy', + 'categorie_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } } @@ -203,12 +403,27 @@ public function destroy($id) public function search(Request $request) { $q = $request->input('q'); + + // Log de la recherche + Log::debug('Recherche de catégories', [ + 'controller' => 'CategorieController', + 'method' => 'search', + 'query' => $q + ]); + $categories = Categorie::search($q)->get(); - foreach ($categories as $categorie) { + foreach ($categories as $categorie) { $categorie->sousCategories; } + // Log du résultat de la recherche + Log::info('Résultat de recherche de catégories', [ + 'controller' => 'CategorieController', + 'method' => 'search', + 'query' => $q, + 'count' => count($categories) + ]); $success['categories'] = $categories; diff --git a/app/Http/Controllers/Api/CommentaireController.php b/app/Http/Controllers/Api/CommentaireController.php index e997f892..13b6f608 100644 --- a/app/Http/Controllers/Api/CommentaireController.php +++ b/app/Http/Controllers/Api/CommentaireController.php @@ -9,6 +9,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @@ -26,6 +27,12 @@ class CommentaireController extends BaseController */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des commentaires', [ + 'controller' => 'CommentaireController', + 'method' => 'index' + ]); + $commentaires = Commentaire::all(); foreach ($commentaires as $commentaire) { @@ -33,6 +40,13 @@ public function index() $commentaire->user; } + // Log du nombre de commentaires récupérés + Log::info('Liste des commentaires récupérée', [ + 'controller' => 'CommentaireController', + 'method' => 'index', + 'count' => count($commentaires) + ]); + $success['commentaires'] = $commentaires; return $this->sendResponse($success, 'Liste des Commentaires'); @@ -48,13 +62,28 @@ public function index() */ public function store(Request $request) { + // Log du début de la création + Log::debug('Tentative de création d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'store', + 'inputs' => $request->all() + ]); + $user = Auth::user(); - $validator = Validator::make($request->all(), [ + $validator = Validator::make($request->all(), [ 'etablissement_id' => 'required', ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -64,20 +93,45 @@ public function store(Request $request) $input['rating'] = $request->rating; try { - - - $etablissement = Etablissement::find($request->etablissement_id); + if (!$etablissement) { + Log::warning('Tentative de création d\'un commentaire pour un établissement inexistant', [ + 'controller' => 'CommentaireController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'user_id' => $user->id + ]); + return $this->sendError('Établissement non trouvé', [], 404); + } + $commentaire = $etablissement->commentaires()->create($input); + // Log du succès de la création + Log::info('Commentaire créé avec succès', [ + 'controller' => 'CommentaireController', + 'method' => 'store', + 'commentaire_id' => $commentaire->id, + 'etablissement_id' => $request->etablissement_id, + 'user_id' => $user->id, + 'rating' => $request->rating + ]); + $success['commentaire'] = $commentaire; $success['commentaire']['user'] = $user; - - return $this->sendResponse($success, "Création du commentaire reussie", 201); } catch (\Exception $ex) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'store', + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString(), + 'user_id' => $user->id, + 'etablissement_id' => $request->etablissement_id + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } @@ -90,11 +144,36 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'show', + 'commentaire_id' => $id + ]); + $commentaire = Commentaire::find($id); + if (!$commentaire) { + Log::warning('Commentaire non trouvé', [ + 'controller' => 'CommentaireController', + 'method' => 'show', + 'commentaire_id' => $id + ]); + return $this->sendError('Commentaire non trouvé', [], 404); + } + $commentaire->etablissement; $commentaire->user; + // Log du succès de la récupération + Log::info('Détails du commentaire récupérés', [ + 'controller' => 'CommentaireController', + 'method' => 'show', + 'commentaire_id' => $id, + 'etablissement_id' => $commentaire->etablissement_id, + 'user_id' => $commentaire->user_id + ]); + $success['commentaire'] = $commentaire; return $this->sendResponse($success, "Commentaire"); @@ -111,23 +190,86 @@ public function show($id) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'update', + 'commentaire_id' => $id, + 'inputs' => $request->all() + ]); + $user = Auth::user(); $commentaire = Commentaire::find($id); + + if (!$commentaire) { + Log::warning('Tentative de mise à jour d\'un commentaire inexistant', [ + 'controller' => 'CommentaireController', + 'method' => 'update', + 'commentaire_id' => $id, + 'user_id' => $user->id + ]); + return $this->sendError('Commentaire non trouvé', [], 404); + } + $admin = Admin::where('user_id', $user->id)->first(); + if ($admin || $commentaire->user_id == $user->id) { try { - + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs du commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'update', + 'commentaire_id' => $id, + 'old_values' => [ + 'commentaire' => $commentaire->commentaire, + 'rating' => $commentaire->rating + ] + ]); $commentaire->commentaire = $request->commentaire ?? $commentaire->commentaire; $commentaire->rating = $request->rating ?? $commentaire->rating; $commentaire->save(); + // Log du succès de la mise à jour + Log::info('Commentaire mis à jour avec succès', [ + 'controller' => 'CommentaireController', + 'method' => 'update', + 'commentaire_id' => $id, + 'new_values' => [ + 'commentaire' => $commentaire->commentaire, + 'rating' => $commentaire->rating + ], + 'user_id' => $user->id, + 'is_admin' => $admin ? true : false + ]); + $success['commentaire'] = $commentaire; return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'update', + 'commentaire_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de mise à jour'], 400); } + } else { + // Log de l'accès non autorisé + Log::warning('Tentative non autorisée de mise à jour d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'update', + 'commentaire_id' => $id, + 'user_id' => $user->id, + 'commentaire_user_id' => $commentaire->user_id + ]); + + return $this->sendError('Non autorisé à modifier ce commentaire', [], 403); } } @@ -139,20 +281,70 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'destroy', + 'commentaire_id' => $id + ]); + $user = Auth::user(); $commentaire = Commentaire::find($id); + + if (!$commentaire) { + Log::warning('Tentative de suppression d\'un commentaire inexistant', [ + 'controller' => 'CommentaireController', + 'method' => 'destroy', + 'commentaire_id' => $id, + 'user_id' => $user->id + ]); + return $this->sendError('Commentaire non trouvé', [], 404); + } + $admin = Admin::where('user_id', $user->id)->first(); + if ($admin || $commentaire->user_id == $user->id) { try { - Commentaire::destroy($id); + // Log du succès de la suppression + Log::info('Commentaire supprimé avec succès', [ + 'controller' => 'CommentaireController', + 'method' => 'destroy', + 'commentaire_id' => $id, + 'etablissement_id' => $commentaire->etablissement_id, + 'commentaire_user_id' => $commentaire->user_id, + 'deleted_by_user_id' => $user->id, + 'is_admin' => $admin ? true : false + ]); return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'destroy', + 'commentaire_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString(), + 'user_id' => $user->id + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } + } else { + // Log de l'accès non autorisé + Log::warning('Tentative non autorisée de suppression d\'un commentaire', [ + 'controller' => 'CommentaireController', + 'method' => 'destroy', + 'commentaire_id' => $id, + 'user_id' => $user->id, + 'commentaire_user_id' => $commentaire->user_id + ]); + + return $this->sendError('Non autorisé à supprimer ce commentaire', [], 403); } } } diff --git a/app/Http/Controllers/Api/EtablissementController.php b/app/Http/Controllers/Api/EtablissementController.php index fdce21ea..3ec07478 100644 --- a/app/Http/Controllers/Api/EtablissementController.php +++ b/app/Http/Controllers/Api/EtablissementController.php @@ -22,6 +22,7 @@ use Illuminate\Support\Facades\Builder; use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Redis; +use Illuminate\Support\Facades\Log; /** * @@ -43,6 +44,13 @@ class EtablissementController extends BaseController */ public function index(Request $request) { + Log::debug('Récupération de la liste des établissements', [ + 'controller' => 'EtablissementController', + 'method' => 'index', + 'lat' => $request->lat, + 'lon' => $request->lon, + 'user_id' => $request->user_id + ]); $lat = $request->lat; $lon = $request->lon; @@ -64,6 +72,7 @@ public function index(Request $request) ->paginate(50); + foreach ($etablissements as $etablissement) { @@ -113,6 +122,12 @@ public function index(Request $request) $success['etablissements'] = $etablissements; + Log::info('Liste des établissements récupérée avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'index', + 'nombre_etablissements' => count($etablissements) + ]); + return $this->sendResponse($success, 'Liste des Etablissements'); } @@ -123,10 +138,21 @@ public function index(Request $request) */ public function countEtablissement() { + Log::debug('Récupération du nombre total d\'établissements', [ + 'controller' => 'EtablissementController', + 'method' => 'countEtablissement' + ]); + $nbre_etablissements = Etablissement::count(); $nbre_page = ceil($nbre_etablissements / 100); $success['nbre_etablissements'] = $nbre_etablissements; $success['nbre_page'] = $nbre_page; + Log::info('Nombre total d\'établissements récupéré avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'countEtablissement', + 'nombre_etablissements' => $nbre_etablissements, + 'nombre_pages' => $nbre_page + ]); return $this->sendResponse($success, 'Nombre des Etablissements'); } @@ -140,6 +166,13 @@ public function countEtablissement() */ public function getEtablissementByDistance(Request $request) { + Log::debug('Récupération de la liste des établissements par distance', [ + 'controller' => 'EtablissementController', + 'method' => 'getEtablissementByDistance', + 'lat' => $request->lat, + 'lon' => $request->lon, + 'user_id' => $request->user_id + ]); $lat = $request->lat; $lon = $request->lon; @@ -209,6 +242,12 @@ public function getEtablissementByDistance(Request $request) $success['etablissements'] = $etablissements; + Log::info('Liste des établissements par distance récupérée avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'getEtablissementByDistance', + 'nombre_etablissements' => count($etablissements) + ]); + return $this->sendResponse($success, 'Liste des Etablissements'); } @@ -240,6 +279,11 @@ public function getEtablissementByDistance(Request $request) */ public function store(Request $request) { + Log::debug('Tentative de création d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'store', + 'inputs' => $request->all() + ]); $user = Auth::user(); @@ -297,6 +341,13 @@ public function store(Request $request) try { + // Log du début de la transaction + Log::debug('Début de transaction pour la création d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'store', + 'batiment_id' => $request->batiment_id + ]); + DB::beginTransaction(); @@ -318,8 +369,22 @@ public function store(Request $request) $success['etablissement'] = $etablissement; + Log::info('Etablissement créé avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'store', + 'etablissement_id' => $etablissement->id, + 'etablissement_nom' => $etablissement->nom + ]); + return $this->sendResponse($success, "Création de l'etablissement reussie", 201); } catch (\Exception $ex) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'store', + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString() + ]); DB::rollBack(); return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } @@ -334,6 +399,12 @@ public function store(Request $request) */ public function show($id, Request $request) { + Log::debug('Récupération des détails d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'show', + 'etablissement_id' => $id, + 'user_id' => $request->user_id + ]); $etablissement = Etablissement::find($id); @@ -378,6 +449,13 @@ public function show($id, Request $request) $success['etablissement'] = $etablissement; + Log::info('Détails de l\'établissement récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'show', + 'etablissement_id' => $id, + 'etablissement_nom' => $etablissement->nom + ]); + return $this->sendResponse($success, "Etablissement"); } @@ -409,6 +487,12 @@ public function show($id, Request $request) */ public function update(Request $request, $id) { + Log::debug('Tentative de mise à jour d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'update', + 'etablissement_id' => $id, + 'inputs' => $request->all() + ]); Auth::user(); $etablissement = Etablissement::find($id); @@ -470,8 +554,23 @@ public function update(Request $request, $id) $success['etablissement'] = $etablissement; + Log::info('Etablissement mis à jour avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'update', + 'etablissement_id' => $etablissement->id, + 'etablissement_nom' => $etablissement->nom + ]); + return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'update', + 'etablissement_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); DB::rollBack(); return $this->sendError('Erreur.', ['error' => $th->getMessage()], 400); } @@ -486,6 +585,11 @@ public function update(Request $request, $id) */ public function destroy($id) { + Log::debug('Tentative de suppression d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'destroy', + 'etablissement_id' => $id + ]); $user = Auth::user(); $etablissement = Etablissement::find($id); $admin = Admin::where('user_id', $user->id)->first(); @@ -512,8 +616,23 @@ public function destroy($id) DB::commit(); + // Log de la réussite de la suppression + Log::info('Etablissement supprimé avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'destroy', + 'etablissement_id' => $id + ]); + return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'destroy', + 'etablissement_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); DB::rollBack(); return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } @@ -531,15 +650,28 @@ public function destroy($id) */ public function search(Request $request) { + Log::debug('Tentative de recherche d\'établissements', [ + 'controller' => 'EtablissementController', + 'method' => 'search', + 'query' => $request->q, + 'user_id' => $request->user_id + ]); $q = $request->input('q'); $cacheKey = 'search query:' . $q; // Vérifier si les résultats sont en cache $cachedResults = Redis::get($cacheKey); if ($cachedResults) { + Log::info('Résultats de recherche récupérés à partir du cache', [ + 'controller' => 'EtablissementController', + 'method' => 'search', + 'cache_key' => $cacheKey + ]); return $this->sendResponse(json_decode($cachedResults), 'Résultats de la recherche dans le cache'); } + + // Recherche des lieux dits via Nominatim $nominatimResponse = Http::get(env('NOMINATIM_URL') . '/search', [ 'q' => $q, @@ -599,9 +731,22 @@ public function search(Request $request) $success['etablissements'] = $etablissements; $success['places'] = $places ?? []; + Log::info('Résultats de recherche récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'search', + 'nombre_etablissements' => count($etablissements), + 'query' => $q + ]); + // Mettre les résultats en cache pendant une durée spécifique (par exemple, 1 heure) Redis::setex($cacheKey, 3600, json_encode($success)); + Log::info('Résultats de recherche enregistrés dans le cache', [ + 'controller' => 'EtablissementController', + 'method' => 'search', + 'cache_key' => $cacheKey + ]); + return $this->sendResponse($success, 'Resultats de la recherche'); } @@ -618,6 +763,16 @@ public function search(Request $request) */ public function filterSearch(Request $request) { + Log::debug('Tentative de recherche d\'établissements par filtre', [ + 'controller' => 'EtablissementController', + 'method' => 'filterSearch', + 'id_categorie' => $request->id_categorie, + 'commodites' => $request->commodites, + 'lat' => $request->lat, + 'lon' => $request->lon, + 'ville' => $request->ville, + 'user_id' => $request->user_id + ]); $idcategorie = $request->input('id_categorie'); $commodites = $request->input('commodites'); $lat = $request->input('lat'); @@ -694,6 +849,17 @@ public function filterSearch(Request $request) $success['etablissements'] = $etablissements; + Log::info('Résultats de recherche par filtre récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'filterSearch', + 'nombre_etablissements' => count($etablissements), + 'id_categorie' => $idcategorie, + 'commodites' => $commodites, + 'lat' => $lat, + 'lon' => $lon, + 'ville' => $ville + ]); + return $this->sendResponse($success, 'Liste des Etablissements'); } @@ -706,6 +872,11 @@ public function filterSearch(Request $request) public function addFavorite(Request $request) { + Log::debug('Tentative d\'ajout d\'un établissement aux favoris', [ + 'controller' => 'EtablissementController', + 'method' => 'addFavorite', + 'etablissement_id' => $request->etablissement_id + ]); $user = Auth::user(); $etablissement_id = $request->etablissement_id; @@ -723,6 +894,13 @@ public function addFavorite(Request $request) $success['favorite'] = $favorite; + Log::info('Etablissement ajouté aux favoris avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'addFavorite', + 'etablissement_id' => $etablissement_id, + 'user_id' => $user->id + ]); + return $this->sendResponse($success, 'Etablissement ajouté aux favoris'); } @@ -735,6 +913,11 @@ public function addFavorite(Request $request) public function removeFavorite(Request $request) { + Log::debug('Tentative de suppression d\'un établissement des favoris', [ + 'controller' => 'EtablissementController', + 'method' => 'removeFavorite', + 'etablissement_id' => $request->etablissement_id + ]); $user = Auth::user(); $etablissement_id = $request->etablissement_id; @@ -748,6 +931,13 @@ public function removeFavorite(Request $request) $success['favorite'] = $favorite; + Log::info('Etablissement retiré des favoris avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'removeFavorite', + 'etablissement_id' => $etablissement_id, + 'user_id' => $user->id + ]); + return $this->sendResponse($success, 'Etablissement retiré des favoris'); } @@ -758,6 +948,11 @@ public function removeFavorite(Request $request) */ public function updateVues($etablissement_id) { + Log::debug('Tentative de mise à jour des vues d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'updateVues', + 'etablissement_id' => $etablissement_id + ]); $etablissement = Etablissement::find($etablissement_id); @@ -766,6 +961,13 @@ public function updateVues($etablissement_id) $success['etablissement'] = $etablissement; + Log::info('Vues de l\'établissement mises à jour avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'updateVues', + 'etablissement_id' => $etablissement_id, + 'vues' => $etablissement->vues + ]); + return $this->sendResponse($success, 'Vues du Etablissement incrémentées'); } @@ -780,6 +982,12 @@ public function updateVues($etablissement_id) */ public function updateCover(Request $request, $etablissement_id) { + Log::debug('Tentative de mise à jour de la couverture d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'updateCover', + 'etablissement_id' => $etablissement_id, + 'inputs' => $request->all() + ]); Auth::user(); $etablissement = Etablissement::find($etablissement_id); @@ -801,9 +1009,24 @@ public function updateCover(Request $request, $etablissement_id) $success['etablissement'] = $etablissement; + Log::info('Couverture de l\'établissement mise à jour avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'updateCover', + 'etablissement_id' => $etablissement->id, + 'cover_path' => $etablissement->cover + ]); + return $this->sendResponse($success, "Update success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour de la couverture d\'un établissement', [ + 'controller' => 'EtablissementController', + 'method' => 'updateCover', + 'etablissement_id' => $etablissement_id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); return $this->sendError('Erreur.', ['error' => 'Echec de mise à jour'], 400); } } @@ -817,6 +1040,12 @@ public function updateCover(Request $request, $etablissement_id) */ public function globalsearch(Request $request) { + Log::debug('Tentative de recherche globale', [ + 'controller' => 'EtablissementController', + 'method' => 'globalsearch', + 'query' => $request->q, + 'user_id' => $request->user_id + ]); $q = $request->input('q'); $user_id = $request->user_id; $cacheKey = 'search global:' . $q; @@ -824,6 +1053,11 @@ public function globalsearch(Request $request) // Vérifier si les résultats sont en cache $cachedResults = Redis::get($cacheKey); if ($cachedResults) { + Log::info('Résultats de recherche globale récupérés à partir du cache', [ + 'controller' => 'EtablissementController', + 'method' => 'globalsearch', + 'cache_key' => $cacheKey + ]); return $this->sendResponse(json_decode($cachedResults), 'Résultats de la recherche dans le cache'); } @@ -886,9 +1120,24 @@ public function globalsearch(Request $request) 'places' => array_values($places) // Réindexer les résultats ]; + // Log des résultats de recherche + Log::info('Résultats de recherche globale récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'globalsearch', + 'nombre_etablissements' => count($etablissements), + 'nombre_osmDatas' => count($osmDatas), + 'query' => $q + ]); + // Mettre les résultats en cache pendant une durée spécifique (par exemple, 1 heure) Redis::setex($cacheKey, 3600, json_encode($results)); + Log::info('Résultats de recherche globale enregistrés dans le cache', [ + 'controller' => 'EtablissementController', + 'method' => 'globalsearch', + 'cache_key' => $cacheKey + ]); + return $this->sendResponse($results, 'Résultats de la recherche'); } @@ -900,12 +1149,22 @@ public function globalsearch(Request $request) */ public function nominatimSearch(Request $request) { + Log::debug('Tentative de recherche Nominatim', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimSearch', + 'query' => $request->q + ]); $q = $request->input('q'); $cacheKey = 'searchNominatim:' . $q; // Vérifier si les résultats sont en cache $cachedResults = Redis::get($cacheKey); if ($cachedResults) { + Log::info('Résultats de recherche Nominatim récupérés à partir du cache', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimSearch', + 'cache_key' => $cacheKey + ]); return $this->sendResponse(json_decode($cachedResults), 'Résultats de la recherche dans le cache'); } @@ -919,9 +1178,23 @@ public function nominatimSearch(Request $request) ]); $places = $nominatimResponse->json(); + // Log des résultats de recherche + Log::info('Résultats de recherche Nominatim récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimSearch', + 'nombre_lieux_dits' => count($places), + 'query' => $q + ]); + // Mettre les résultats en cache pendant une durée spécifique (par exemple, 1 heure) Redis::setex($cacheKey, 3600, json_encode($places ?? [])); + Log::info('Résultats de recherche Nominatim enregistrés dans le cache', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimSearch', + 'cache_key' => $cacheKey + ]); + return $this->sendResponse($places, 'Résultats de la recherche'); } @@ -933,6 +1206,12 @@ public function nominatimSearch(Request $request) */ public function nominatimReverseSearch(Request $request) { + Log::debug('Tentative de recherche inversée Nominatim', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimReverseSearch', + 'lat' => $request->lat, + 'lon' => $request->lon + ]); $lat = $request->input('lat'); $lon = $request->input('lon'); $cacheKey = 'reverseSearch:' . $lat . ',' . $lon; @@ -940,6 +1219,11 @@ public function nominatimReverseSearch(Request $request) // Vérifier si les résultats sont en cache $cachedResults = Redis::get($cacheKey); if ($cachedResults) { + Log::info('Résultats de recherche inversée Nominatim récupérés à partir du cache', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimReverseSearch', + 'cache_key' => $cacheKey + ]); return $this->sendResponse(json_decode($cachedResults), 'Résultats de la recherche dans le cache'); } @@ -952,9 +1236,24 @@ public function nominatimReverseSearch(Request $request) ]); $place = $nominatimResponse->json(); + // Log des résultats de recherche + Log::info('Résultats de recherche inversée Nominatim récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimReverseSearch', + 'place_id' => $place['place_id'] ?? null, + 'lat' => $lat, + 'lon' => $lon + ]); + // Mettre les résultats en cache pendant une durée spécifique (par exemple, 1 heure) Redis::setex($cacheKey, 3600, json_encode($place)); + Log::info('Résultats de recherche inversée Nominatim enregistrés dans le cache', [ + 'controller' => 'EtablissementController', + 'method' => 'nominatimReverseSearch', + 'cache_key' => $cacheKey + ]); + return $this->sendResponse($place, 'Résultats de la recherche'); } @@ -967,6 +1266,12 @@ public function nominatimReverseSearch(Request $request) */ public function getNearbyEtablissement(Request $request) { + Log::debug('Tentative de recherche d\'établissements à proximité', [ + 'controller' => 'EtablissementController', + 'method' => 'getNearbyEtablissement', + 'lat' => $request->lat, + 'lon' => $request->lon + ]); $lat = $request->input('lat'); $lon = $request->input('lon'); $radius = 0.1; // Rayon de recherche en kilomètres (100 mètres = 0.1 kilomètres) @@ -999,6 +1304,14 @@ public function getNearbyEtablissement(Request $request) 'quartier' => $etablissement->quartier, ]; + // Log des résultats de recherche + Log::info('Résultats de recherche d\'établissements à proximité récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'getNearbyEtablissement', + 'etablissement_id' => $etablissement->id, + 'distance' => $etablissement->distance + ]); + return $this->sendResponse($result, 'Résultats de la recherche'); } @@ -1028,6 +1341,14 @@ public function getNearbyEtablissement(Request $request) 'quartier' => $place['address']['suburb'] ?? null, ]; + // Log des résultats de recherche + Log::info('Résultats de recherche de lieux dits à proximité récupérés avec succès', [ + 'controller' => 'EtablissementController', + 'method' => 'getNearbyEtablissement', + 'place_id' => $place['place_id'], + 'distance' => $distance + ]); + return $this->sendResponse($result, 'Résultats de la recherche'); } @@ -1037,6 +1358,7 @@ public function getNearbyEtablissement(Request $request) private function calculateDistance($lat1, $lon1, $lat2, $lon2) { + $earthRadius = 6371; // Rayon de la Terre en kilomètres $dLat = deg2rad($lat2 - $lat1); diff --git a/app/Http/Controllers/Api/HoraireController.php b/app/Http/Controllers/Api/HoraireController.php index 1c735c8b..8355e976 100644 --- a/app/Http/Controllers/Api/HoraireController.php +++ b/app/Http/Controllers/Api/HoraireController.php @@ -8,6 +8,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @@ -24,7 +25,11 @@ class HoraireController extends BaseController */ public function index() { - // + // Cette méthode n'est pas implémentée mais on logue quand même + Log::debug('Tentative d\'accès à la méthode index non implémentée', [ + 'controller' => 'HoraireController', + 'method' => 'index' + ]); } /** @@ -37,8 +42,15 @@ public function index() */ public function store(Request $request) { + // Log du début de la création + Log::debug('Tentative de création d\'horaires', [ + 'controller' => 'HoraireController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'nombre_horaires' => is_array($request->horaires) ? count($request->horaires) : 'format non valide' + ]); - $validator = Validator::make($request->all(), [ + $validator = Validator::make($request->all(), [ 'horaires' => 'required', 'etablissement_id' => 'required|exists:etablissements,id', ]); @@ -46,25 +58,65 @@ public function store(Request $request) $horaires = $request->horaires; if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'horaires', [ + 'controller' => 'HoraireController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } try { - - DB::beginTransaction(); + // Log du début de la transaction + Log::debug('Début de transaction pour création d\'horaires', [ + 'controller' => 'HoraireController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id + ]); + $etablissement = Etablissement::find($request->etablissement_id); - foreach ($horaires as $horaire) { - $etablissement->horaires()->create($horaire); + foreach ($horaires as $horaire) { + $nouvelHoraire = $etablissement->horaires()->create($horaire); + + // Log de la création de chaque horaire + Log::debug('Horaire créé', [ + 'controller' => 'HoraireController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'horaire_id' => $nouvelHoraire->id, + 'jour' => $horaire['jour'], + 'plage_horaire' => $horaire['plage_horaire'] + ]); } DB::commit(); + // Log du succès de la création + Log::info('Horaires créés avec succès', [ + 'controller' => 'HoraireController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'nombre_horaires' => count($horaires) + ]); + return $this->sendResponse("", "Création de l'horaire reussie", 201); } catch (\Exception $ex) { DB::rollBack(); + + // Log de l'erreur + Log::error('Erreur lors de la création d\'horaires', [ + 'controller' => 'HoraireController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } @@ -77,7 +129,12 @@ public function store(Request $request) */ public function show(Horaire $horaire) { - // + // Cette méthode n'est pas implémentée mais on logue quand même + Log::debug('Tentative d\'accès à la méthode show non implémentée', [ + 'controller' => 'A\'HoraireController', + 'method' => 'show', + 'horaire_id' => $horaire->id + ]); } @@ -92,20 +149,66 @@ public function show(Horaire $horaire) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'un horaire', [ + 'controller' => 'HoraireController', + 'method' => 'update', + 'horaire_id' => $id, + 'inputs' => $request->all() + ]); + Auth::user(); $horaire = Horaire::find($id); - try { + if (!$horaire) { + Log::warning('Tentative de mise à jour d\'un horaire inexistant', [ + 'controller' => 'HoraireController', + 'method' => 'update', + 'horaire_id' => $id + ]); + return $this->sendError('Horaire non trouvé', [], 404); + } + try { + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs de l\'horaire', [ + 'controller' => 'HoraireController', + 'method' => 'update', + 'horaire_id' => $id, + 'old_values' => [ + 'jour' => $horaire->jour, + 'plage_horaire' => $horaire->plage_horaire + ] + ]); $horaire->plage_horaire = $request->plage_horaire ?? $horaire->plage_horaire; $horaire->save(); - $success['horaire'] = $horaire; + // Log du succès de la mise à jour + Log::info('Horaire mis à jour avec succès', [ + 'controller' => 'HoraireController', + 'method' => 'update', + 'horaire_id' => $id, + 'new_values' => [ + 'jour' => $horaire->jour, + 'plage_horaire' => $horaire->plage_horaire + ], + 'etablissement_id' => $horaire->etablissement_id + ]); + $success['horaire'] = $horaire; return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un horaire', [ + 'controller' => 'HoraireController', + 'method' => 'update', + 'horaire_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de mise à jour'], 400); } } @@ -119,15 +222,53 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'un horaire', [ + 'controller' => 'HoraireController', + 'method' => 'destroy', + 'horaire_id' => $id + ]); + Auth::user(); - try { + $horaire = Horaire::find($id); + + if (!$horaire) { + Log::warning('Tentative de suppression d\'un horaire inexistant', [ + 'controller' => 'HoraireController', + 'method' => 'destroy', + 'horaire_id' => $id + ]); + return $this->sendError('Horaire non trouvé', [], 404); + } + // Stockage temporaire pour le log + $etablissementId = $horaire->etablissement_id; + $jour = $horaire->jour; + + try { Horaire::destroy($id); + // Log du succès de la suppression + Log::info('Horaire supprimé avec succès', [ + 'controller' => 'HoraireController', + 'method' => 'destroy', + 'horaire_id' => $id, + 'etablissement_id' => $etablissementId, + 'jour' => $jour + ]); return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un horaire', [ + 'controller' => 'HoraireController', + 'method' => 'destroy', + 'horaire_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } } diff --git a/app/Http/Controllers/Api/ImageController.php b/app/Http/Controllers/Api/ImageController.php index d9f1d8b2..a335f3d0 100644 --- a/app/Http/Controllers/Api/ImageController.php +++ b/app/Http/Controllers/Api/ImageController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @@ -23,7 +24,11 @@ class ImageController extends BaseController */ public function index() { - // + // Cette méthode n'est pas implémentée mais on logue quand même + Log::debug('Tentative d\'accès à la méthode index non implémentée', [ + 'controller' => 'ImageController', + 'method' => 'index' + ]); } /** @@ -36,36 +41,88 @@ public function index() */ public function store(Request $request) { + // Log du début de la création + Log::debug('Tentative de création d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id + ]); - $validator = Validator::make($request->all(), [ + $validator = Validator::make($request->all(), [ 'etablissement_id' => 'required', 'image_url' => 'mimes:png,jpg,jpeg|max:20000' ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } $etablissement = Etablissement::find($request->etablissement_id); + if (!$etablissement) { + Log::warning('Tentative de création d\'une image pour un établissement inexistant', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id + ]); + return $this->sendError('Établissement non trouvé', [], 404); + } + $batiment = $etablissement->batiment; - if ($request->file()) { + if ($request->file('image_url')) { $fileName = time() . '_' . $request->image_url->getClientOriginalName(); $filePath = $request->file('image_url')->storeAs('uploads/batiments/images/' . $batiment->code . '/' . $etablissement->nom, $fileName, 'public'); $input['image_url'] = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Image uploadée', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'filename' => $fileName, + 'path' => $filePath + ]); + } else { + Log::warning('Tentative de création d\'une image sans fichier', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id + ]); + return $this->sendError('Fichier image requis', [], 400); } try { - $image = $etablissement->images()->create($input); - $success['image'] = $image; - + // Log du succès de la création + Log::info('Image créée avec succès', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'image_id' => $image->id, + 'etablissement_id' => $request->etablissement_id + ]); + $success['image'] = $image; return $this->sendResponse($success, "Création de l'image reussie", 201); } catch (\Exception $ex) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'store', + 'etablissement_id' => $request->etablissement_id, + 'exception' => $ex->getMessage(), + 'trace' => $ex->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); } } @@ -78,7 +135,12 @@ public function store(Request $request) */ public function show(Image $image) { - // + // Cette méthode n'est pas implémentée mais on logue quand même + Log::debug('Tentative d\'accès à la méthode show non implémentée', [ + 'controller' => 'ImageController', + 'method' => 'show', + 'image_id' => $image->id + ]); } /** @@ -93,32 +155,74 @@ public function show(Image $image) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'update', + 'image_id' => $id + ]); + Auth::user(); $image = Image::find($id); + + if (!$image) { + Log::warning('Tentative de mise à jour d\'une image inexistante', [ + 'controller' => 'ImageController', + 'method' => 'update', + 'image_id' => $id + ]); + return $this->sendError('Image non trouvée', [], 404); + } + $etablissement = Etablissement::find($image->etablissement_id); $request->validate([ 'image_url' => 'mimes:png,jpg,jpeg|max:20000', ]); - try { - + try { $batiment = $image->etablissement->batiment; $etablissement = $image->etablissement; - if ($request->file()) { + if ($request->file('image_url')) { $fileName = time() . '_' . $request->image_url->getClientOriginalName(); $filePath = $request->file('image_url')->storeAs('uploads/batiments/images/' . $batiment->code . '/' . $etablissement->nom, $fileName, 'public'); $image->image_url = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Image mise à jour', [ + 'controller' => 'ImageController', + 'method' => 'update', + 'image_id' => $id, + 'etablissement_id' => $etablissement->id, + 'filename' => $fileName, + 'path' => $filePath + ]); } $image->save(); - $success['image'] = $image; + // Log du succès de la mise à jour + Log::info('Image mise à jour avec succès', [ + 'controller' => 'ImageController', + 'method' => 'update', + 'image_id' => $id, + 'etablissement_id' => $etablissement->id + ]); + $success['image'] = $image; return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'update', + 'image_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de mise à jour'], 400); } } @@ -132,15 +236,51 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'destroy', + 'image_id' => $id + ]); + Auth::user(); - try { + $image = Image::find($id); + + if (!$image) { + Log::warning('Tentative de suppression d\'une image inexistante', [ + 'controller' => 'ImageController', + 'method' => 'destroy', + 'image_id' => $id + ]); + return $this->sendError('Image non trouvée', [], 404); + } + + // Stockage temporaire pour le log + $etablissementId = $image->etablissement_id; + try { Image::destroy($id); + // Log du succès de la suppression + Log::info('Image supprimée avec succès', [ + 'controller' => 'ImageController', + 'method' => 'destroy', + 'image_id' => $id, + 'etablissement_id' => $etablissementId + ]); return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'une image', [ + 'controller' => 'ImageController', + 'method' => 'destroy', + 'image_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); + return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } } diff --git a/app/Http/Controllers/Api/OsmDataController.php b/app/Http/Controllers/Api/OsmDataController.php index dc7321f1..cd3084d4 100644 --- a/app/Http/Controllers/Api/OsmDataController.php +++ b/app/Http/Controllers/Api/OsmDataController.php @@ -5,6 +5,7 @@ use App\Models\OsmData; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; /** * @@ -26,12 +27,28 @@ class OsmDataController extends BaseController */ public function index(Request $request) { + // Log du début de la requête + Log::debug('Récupération des données OSM', [ + 'controller' => 'OsmDataController', + 'method' => 'index', + 'lat' => $request->input('lat'), + 'lon' => $request->input('lon'), + 'categorie_id' => $request->input('categorie_id'), + 'page' => $request->input('page', 1) + ]); + $latitude = $request->input('lat'); $longitude = $request->input('lon'); $page = $request->input('page', 1); $categorieId = $request->input('categorie_id'); if (is_null($latitude) || is_null($longitude)) { + // Log du paramètre manquant + Log::warning('Paramètres de géolocalisation manquants pour les données OSM', [ + 'controller' => 'OsmDataController', + 'method' => 'index' + ]); + return $this->sendError('Error', 'Longitude et Latitude requis', 400); } @@ -39,6 +56,16 @@ public function index(Request $request) $paginatedData = OsmData::getDataWithDistance($latitude, $longitude, $perPage, $page, $categorieId); + // Log du nombre de données récupérées + Log::info('Données OSM récupérées', [ + 'controller' => 'OsmDataController', + 'method' => 'index', + 'count' => count($paginatedData), + 'page' => $page, + 'per_page' => $perPage, + 'categorie_id' => $categorieId + ]); + $features = $paginatedData->map(function ($item) { return [ 'type' => 'Feature', @@ -76,12 +103,34 @@ public function index(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'une donnée OSM', [ + 'controller' => 'OsmDataController', + 'method' => 'show', + 'osm_data_id' => $id + ]); + $osmData = OsmData::find($id); if (is_null($osmData)) { + // Log de donnée non trouvée + Log::warning('Donnée OSM non trouvée', [ + 'controller' => 'OsmDataController', + 'method' => 'show', + 'osm_data_id' => $id + ]); + return $this->sendError('Data not found'); } + // Log du succès de la récupération + Log::info('Détails de la donnée OSM récupérés', [ + 'controller' => 'OsmDataController', + 'method' => 'show', + 'osm_data_id' => $id, + 'osm_id' => $osmData->osm_id + ]); + return $this->sendResponse($osmData, 'Data retrieved successfully.'); } @@ -94,8 +143,25 @@ public function show($id) public function search(Request $request) { $q = $request->input('q'); + + // Log de la recherche + Log::debug('Recherche de données OSM', [ + 'controller' => 'OsmDataController', + 'method' => 'search', + 'query' => $q + ]); + $osmDatas = OsmData::search($q)->paginate(50); + // Log du résultat de la recherche + Log::info('Résultat de recherche de données OSM', [ + 'controller' => 'OsmDataController', + 'method' => 'search', + 'query' => $q, + 'count' => count($osmDatas), + 'total' => $osmDatas->total() + ]); + return $this->sendResponse($osmDatas, 'Liste des Datas'); } } diff --git a/app/Http/Controllers/Api/PaiementController.php b/app/Http/Controllers/Api/PaiementController.php index 2be62afe..5336db76 100644 --- a/app/Http/Controllers/Api/PaiementController.php +++ b/app/Http/Controllers/Api/PaiementController.php @@ -4,6 +4,7 @@ use App\Models\Paiement; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; class PaiementController extends BaseController { @@ -14,7 +15,12 @@ class PaiementController extends BaseController */ public function index() { - // + // Log de la non-implémentation + Log::debug('Tentative d\'accès à la méthode index non implémentée', [ + 'controller' => 'PaiementController', + 'method' => 'index' + ]); + // Cette méthode n'est pas implémentée } /** @@ -25,7 +31,13 @@ public function index() */ public function store(Request $request) { - // + // Log de la non-implémentation + Log::debug('Tentative d\'accès à la méthode store non implémentée', [ + 'controller' => 'PaiementController', + 'method' => 'store', + 'inputs' => $request->all() + ]); + // Cette méthode n'est pas implémentée } /** @@ -36,7 +48,13 @@ public function store(Request $request) */ public function show(Paiement $paiement) { - // + // Log de la non-implémentation + Log::debug('Tentative d\'accès à la méthode show non implémentée', [ + 'controller' => 'PaiementController', + 'method' => 'show', + 'paiement_id' => $paiement->id + ]); + // Cette méthode n'est pas implémentée } /** @@ -48,7 +66,14 @@ public function show(Paiement $paiement) */ public function update(Request $request, Paiement $paiement) { - // + // Log de la non-implémentation + Log::debug('Tentative d\'accès à la méthode update non implémentée', [ + 'controller' => 'PaiementController', + 'method' => 'update', + 'paiement_id' => $paiement->id, + 'inputs' => $request->all() + ]); + // Cette méthode n'est pas implémentée } /** @@ -59,6 +84,12 @@ public function update(Request $request, Paiement $paiement) */ public function destroy(Paiement $paiement) { - // + // Log de la non-implémentation + Log::debug('Tentative d\'accès à la méthode destroy non implémentée', [ + 'controller' => 'PaiementController', + 'method' => 'destroy', + 'paiement_id' => $paiement->id + ]); + // Cette méthode n'est pas implémentée } } diff --git a/app/Http/Controllers/Api/PermissionController.php b/app/Http/Controllers/Api/PermissionController.php index d57efcb7..080f6d04 100644 --- a/app/Http/Controllers/Api/PermissionController.php +++ b/app/Http/Controllers/Api/PermissionController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Spatie\Permission\Models\Permission; use Validator; +use Illuminate\Support\Facades\Log; class PermissionController extends Controller { @@ -16,10 +17,22 @@ class PermissionController extends Controller */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des permissions', [ + 'controller' => 'PermissionController', + 'method' => 'index' + ]); + $permissions = Permission::all(); - $success['permissions'] = $permissions; + // Log du nombre de permissions récupérées + Log::info('Liste des permissions récupérée', [ + 'controller' => 'PermissionController', + 'method' => 'index', + 'count' => count($permissions) + ]); + $success['permissions'] = $permissions; return $this->sendResponse($success, 'Liste des Permissions'); } @@ -32,19 +45,53 @@ public function index() */ public function store(Request $request) { - $validator = Validator::make($request->all(), [ + // Log du début de la création + Log::debug('Tentative de création d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'store', + 'inputs' => $request->all() + ]); + + $validator = Validator::make($request->all(), [ 'name' => 'required|unique:permissions,name' ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } - $permission = Permission::create(['name' => $request->input('name')]); + try { + $permission = Permission::create(['name' => $request->input('name')]); - $success['permission'] = $permission; + // Log du succès de la création + Log::info('Permission créée avec succès', [ + 'controller' => 'PermissionController', + 'method' => 'store', + 'permission_id' => $permission->id, + 'permission_name' => $permission->name + ]); - return $this->sendResponse($success, 'Création de la Permission reussie'); + $success['permission'] = $permission; + + return $this->sendResponse($success, 'Création de la Permission reussie'); + } catch (\Exception $e) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'store', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + + return $this->sendError('Erreur lors de la création de la permission', ['error' => $e->getMessage()], 400); + } } /** @@ -55,8 +102,32 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'show', + 'permission_id' => $id + ]); + $permission = Permission::find($id); + if (!$permission) { + Log::warning('Permission non trouvée', [ + 'controller' => 'PermissionController', + 'method' => 'show', + 'permission_id' => $id + ]); + return $this->sendError('Permission non trouvée', [], 404); + } + + // Log du succès de la récupération + Log::info('Détails de la permission récupérés', [ + 'controller' => 'PermissionController', + 'method' => 'show', + 'permission_id' => $id, + 'permission_name' => $permission->name + ]); + $success['permission'] = $permission; return $this->sendResponse($success, 'Permission'); @@ -71,23 +142,84 @@ public function show($id) */ public function update(Request $request, $id) { - $validator = Validator::make($request->all(), [ + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'permission_id' => $id, + 'inputs' => $request->all() + ]); + + $validator = Validator::make($request->all(), [ 'name' => 'required' ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la mise à jour d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } - $permission = Permission::find($id); - $permission->name = $request->input('name'); - $savePermission = $permission->save(); + try { + $permission = Permission::find($id); - if ($savePermission) { - $success['permission'] = $permission; - return $this->sendResponse($success, "Update Success", 201); - } else { - return $this->sendError("Erreur de Création.", ['error' => 'Echec de Mise à jour']); + if (!$permission) { + Log::warning('Tentative de mise à jour d\'une permission inexistante', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'permission_id' => $id + ]); + return $this->sendError('Permission non trouvée', [], 404); + } + + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs de la permission', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'permission_id' => $id, + 'old_name' => $permission->name + ]); + + $permission->name = $request->input('name'); + $savePermission = $permission->save(); + + if ($savePermission) { + // Log du succès de la mise à jour + Log::info('Permission mise à jour avec succès', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'permission_id' => $id, + 'new_name' => $permission->name + ]); + + $success['permission'] = $permission; + return $this->sendResponse($success, "Update Success", 201); + } else { + // Log de l'échec de la mise à jour + Log::warning('Échec de la mise à jour d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'permission_id' => $id + ]); + + return $this->sendError("Erreur de Création.", ['error' => 'Echec de Mise à jour']); + } + } catch (\Exception $e) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'update', + 'permission_id' => $id, + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + + return $this->sendError('Erreur lors de la mise à jour de la permission', ['error' => $e->getMessage()], 400); } } @@ -99,13 +231,61 @@ public function update(Request $request, $id) */ public function destroy($id) { - $permissionDestroy = Permission::destroy($id); + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'destroy', + 'permission_id' => $id + ]); + + try { + $permission = Permission::find($id); + + if (!$permission) { + Log::warning('Tentative de suppression d\'une permission inexistante', [ + 'controller' => 'PermissionController', + 'method' => 'destroy', + 'permission_id' => $id + ]); + return $this->sendError('Permission non trouvée', [], 404); + } + + // Stockage temporaire pour le log + $permissionName = $permission->name; + + $permissionDestroy = Permission::destroy($id); + + if ($permissionDestroy) { + // Log du succès de la suppression + Log::info('Permission supprimée avec succès', [ + 'controller' => 'PermissionController', + 'method' => 'destroy', + 'permission_id' => $id, + 'permission_name' => $permissionName + ]); + + return $this->sendResponse("", "Suppression réussie", 201); + } else { + // Log de l'échec de la suppression + Log::warning('Échec de la suppression d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'destroy', + 'permission_id' => $id + ]); + return $this->sendError("Echec de Suppression", ['error' => 'Echec de Suppression'], 400); + } + } catch (\Exception $e) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'une permission', [ + 'controller' => 'PermissionController', + 'method' => 'destroy', + 'permission_id' => $id, + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - if ($permissionDestroy) { - return $this->sendResponse("", "Suppression réussie", 201); - } else { - return $this->sendError("Echec de Suppression", ['error' => 'Echec de Suppression'], 400); + return $this->sendError('Erreur lors de la suppression de la permission', ['error' => $e->getMessage()], 400); } } } diff --git a/app/Http/Controllers/Api/RoleController.php b/app/Http/Controllers/Api/RoleController.php index a2d7af35..f853f9df 100644 --- a/app/Http/Controllers/Api/RoleController.php +++ b/app/Http/Controllers/Api/RoleController.php @@ -6,6 +6,7 @@ use Illuminate\Http\Request; use Spatie\Permission\Models\Role; use Validator; +use Illuminate\Support\Facades\Log; class RoleController extends Controller { @@ -17,12 +18,25 @@ class RoleController extends Controller */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des rôles', [ + 'controller' => 'RoleController', + 'method' => 'index' + ]); + $roles = Role::all(); foreach ($roles as $role) { $role->permissions; } + // Log du nombre de rôles récupérés + Log::info('Liste des rôles récupérée', [ + 'controller' => 'RoleController', + 'method' => 'index', + 'count' => count($roles) + ]); + $success['roles'] = $roles; return $this->sendResponse($roles, 'Liste des Roles'); @@ -36,19 +50,53 @@ public function index() */ public function store(Request $request) { - $validator = Validator::make($request->all(), [ + // Log du début de la création + Log::debug('Tentative de création d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'store', + 'inputs' => $request->all() + ]); + + $validator = Validator::make($request->all(), [ 'name' => 'required|unique:roles,name' ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la création d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'store', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } - $role = Role::create(['name' => $request->input('name')]); + try { + $role = Role::create(['name' => $request->input('name')]); - $success['role'] = $role; + // Log du succès de la création + Log::info('Rôle créé avec succès', [ + 'controller' => 'RoleController', + 'method' => 'store', + 'role_id' => $role->id, + 'role_name' => $role->name + ]); + + $success['role'] = $role; - return $this->sendResponse($role, 'Création du Role reussie'); + return $this->sendResponse($role, 'Création du Role reussie'); + } catch (\Exception $e) { + // Log de l'erreur + Log::error('Erreur lors de la création d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'store', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + + return $this->sendError('Erreur lors de la création du rôle', ['error' => $e->getMessage()], 400); + } } /** @@ -59,9 +107,35 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'show', + 'role_id' => $id + ]); + $role = Role::find($id); + + if (!$role) { + Log::warning('Rôle non trouvé', [ + 'controller' => 'RoleController', + 'method' => 'show', + 'role_id' => $id + ]); + return $this->sendError('Rôle non trouvé', [], 404); + } + $role->permissions; + // Log du succès de la récupération + Log::info('Détails du rôle récupérés', [ + 'controller' => 'RoleController', + 'method' => 'show', + 'role_id' => $id, + 'role_name' => $role->name, + 'nombre_permissions' => count($role->permissions) + ]); + $success['role'] = $role; return $this->sendResponse($success, 'Role'); @@ -77,23 +151,84 @@ public function show($id) */ public function update(Request $request, $id) { - $validator = Validator::make($request->all(), [ + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'role_id' => $id, + 'inputs' => $request->all() + ]); + + $validator = Validator::make($request->all(), [ 'name' => 'required' ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::warning('Validation échouée lors de la mise à jour d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'errors' => $validator->errors()->toArray() + ]); + return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } - $role = Role::find($id); - $role->name = $request->input('name'); - $saveRole = $role->save(); + try { + $role = Role::find($id); - if ($saveRole) { - $success['role'] = $role; - return $this->sendResponse($success, "Update Success", 201); - } else { - return $this->sendError("Erreur de Création.", ['error' => 'Echec de Mise à jour']); + if (!$role) { + Log::warning('Tentative de mise à jour d\'un rôle inexistant', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'role_id' => $id + ]); + return $this->sendError('Rôle non trouvé', [], 404); + } + + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs du rôle', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'role_id' => $id, + 'old_name' => $role->name + ]); + + $role->name = $request->input('name'); + $saveRole = $role->save(); + + if ($saveRole) { + // Log du succès de la mise à jour + Log::info('Rôle mis à jour avec succès', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'role_id' => $id, + 'new_name' => $role->name + ]); + + $success['role'] = $role; + return $this->sendResponse($success, "Update Success", 201); + } else { + // Log de l'échec de la mise à jour + Log::warning('Échec de la mise à jour d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'role_id' => $id + ]); + + return $this->sendError("Erreur de Création.", ['error' => 'Echec de Mise à jour']); + } + } catch (\Exception $e) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'update', + 'role_id' => $id, + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); + + return $this->sendError('Erreur lors de la mise à jour du rôle', ['error' => $e->getMessage()], 400); } } @@ -105,13 +240,61 @@ public function update(Request $request, $id) */ public function destroy($id) { - $roleDestroy = Role::destroy($id); + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'destroy', + 'role_id' => $id + ]); + + try { + $role = Role::find($id); + + if (!$role) { + Log::warning('Tentative de suppression d\'un rôle inexistant', [ + 'controller' => 'RoleController', + 'method' => 'destroy', + 'role_id' => $id + ]); + return $this->sendError('Rôle non trouvé', [], 404); + } + + // Stockage temporaire pour le log + $roleName = $role->name; + + $roleDestroy = Role::destroy($id); + + if ($roleDestroy) { + // Log du succès de la suppression + Log::info('Rôle supprimé avec succès', [ + 'controller' => 'RoleController', + 'method' => 'destroy', + 'role_id' => $id, + 'role_name' => $roleName + ]); + + return $this->sendResponse("", "Suppression réussie", 201); + } else { + // Log de l'échec de la suppression + Log::warning('Échec de la suppression d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'destroy', + 'role_id' => $id + ]); + return $this->sendError("Echec de Suppression", ['error' => 'Echec de Suppression'], 400); + } + } catch (\Exception $e) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'un rôle', [ + 'controller' => 'RoleController', + 'method' => 'destroy', + 'role_id' => $id, + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - if ($roleDestroy) { - return $this->sendResponse("", "Suppression réussie", 201); - } else { - return $this->sendError("Echec de Suppression", ['error' => 'Echec de Suppression'], 400); + return $this->sendError('Erreur lors de la suppression du rôle', ['error' => $e->getMessage()], 400); } } } diff --git a/app/Http/Controllers/Api/SettingController.php b/app/Http/Controllers/Api/SettingController.php index 57c09659..302c8121 100644 --- a/app/Http/Controllers/Api/SettingController.php +++ b/app/Http/Controllers/Api/SettingController.php @@ -4,6 +4,7 @@ use App\Models\Setting; use Illuminate\Http\Request; +use Illuminate\Support\Facades\Log; /** * @@ -20,15 +21,26 @@ class SettingController extends BaseController */ public function index() { + // Log du début de la requête + Log::debug('Récupération des paramètres de l\'application', [ + 'controller' => 'SettingController', + 'method' => 'index' + ]); + $setting = Setting::first(); + // Log du résultat de la récupération + Log::info('Paramètres de l\'application récupérés', [ + 'controller' => 'SettingController', + 'method' => 'index', + 'setting_id' => $setting ? $setting->id : null + ]); + $success['setting'] = $setting; return $this->sendResponse($success, 'Paramètres de l\'application'); } - - /** * Show Setting by id. * @@ -37,19 +49,38 @@ public function index() */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'un paramètre', [ + 'controller' => 'SettingController', + 'method' => 'show', + 'setting_id' => $id + ]); + $setting = Setting::find($id); if (is_null($setting)) { + // Log du paramètre non trouvé + Log::warning('Paramètre non trouvé', [ + 'controller' => 'SettingController', + 'method' => 'show', + 'setting_id' => $id + ]); + return $this->sendError('Paramètre non trouvé.'); } + // Log du succès de la récupération + Log::info('Détails du paramètre récupérés', [ + 'controller' => 'SettingController', + 'method' => 'show', + 'setting_id' => $id + ]); + $success['setting'] = $setting; return $this->sendResponse($success, 'Paramètre trouvé.'); } - - /** * Update the specified resource in storage. * @@ -84,22 +115,74 @@ public function show($id) */ public function update(Request $request, $id) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour des paramètres de l\'application', [ + 'controller' => 'SettingController', + 'method' => 'update', + 'setting_id' => $id, + 'inputs' => $request->except('app_logo', 'app_api_key') + ]); + $setting = Setting::find($id); if (is_null($setting)) { + // Log du paramètre non trouvé + Log::warning('Tentative de mise à jour d\'un paramètre inexistant', [ + 'controller' => 'SettingController', + 'method' => 'update', + 'setting_id' => $id + ]); + return $this->sendError('Paramètre non trouvé.'); } + // Log des anciennes valeurs avant mise à jour + Log::debug('Anciennes valeurs des paramètres', [ + 'controller' => 'SettingController', + 'method' => 'update', + 'setting_id' => $id, + 'old_values' => [ + 'app_name' => $setting->app_name, + 'app_version' => $setting->app_version, + 'maintenance_mode' => $setting->maintenance_mode, + 'android_app_version' => $setting->android_app_version, + 'ios_app_version' => $setting->ios_app_version + ] + ]); + $input = $request->all(); - if ($request->file()) { + if ($request->file('app_logo')) { $fileName = time() . '_' . $request->app_logo->getClientOriginalName(); $filePath = $request->file('app_logo')->storeAs('uploads/settings/logos', $fileName, 'public'); $input['app_logo'] = '/storage/' . $filePath; + + // Log de l'upload de fichier + Log::debug('Logo de l\'application mis à jour', [ + 'controller' => 'SettingController', + 'method' => 'update', + 'setting_id' => $id, + 'filename' => $fileName, + 'path' => $filePath + ]); } $setting->update($input); + // Log du succès de la mise à jour + Log::info('Paramètres de l\'application mis à jour avec succès', [ + 'controller' => 'SettingController', + 'method' => 'update', + 'setting_id' => $id, + 'new_values' => [ + 'app_name' => $setting->app_name, + 'app_version' => $setting->app_version, + 'maintenance_mode' => $setting->maintenance_mode, + 'android_app_version' => $setting->android_app_version, + 'ios_app_version' => $setting->ios_app_version + ] + ]); + $success['setting'] = $setting; return $this->sendResponse($success, 'Paramètre mis à jour.'); diff --git a/app/Http/Controllers/Api/SocialApiAuthAppleController.php b/app/Http/Controllers/Api/SocialApiAuthAppleController.php index a7dae1d0..dd2149eb 100644 --- a/app/Http/Controllers/Api/SocialApiAuthAppleController.php +++ b/app/Http/Controllers/Api/SocialApiAuthAppleController.php @@ -1,13 +1,12 @@ token; - $user = $service->createOrGetUser(Socialite::driver('apple')->userFromToken($token)); + // Log de la tentative de connexion Apple + Log::debug('Tentative de connexion via Apple', [ + 'controller' => 'SocialApiAuthAppleController', + 'method' => 'appleConnect', + 'token_length' => strlen($token) + ]); + + try { + // Récupération de l'utilisateur depuis l'API Apple + $socialiteUser = Socialite::driver('apple')->userFromToken($token); + + // Log des informations de l'utilisateur Apple récupérées + Log::debug('Informations utilisateur Apple récupérées', [ + 'controller' => 'SocialApiAuthAppleController', + 'method' => 'appleConnect', + 'socialite_id' => $socialiteUser->getId(), + 'socialite_email' => $socialiteUser->getEmail(), + 'socialite_name' => $socialiteUser->getName() + ]); + + // Création ou récupération de l'utilisateur dans notre système + $user = $service->createOrGetUser($socialiteUser); + + // Authentification de l'utilisateur + Auth::login($user); + $token = $user->createToken('Position')->accessToken; + + // Log du succès de la connexion Apple + Log::info('Connexion Apple réussie', [ + 'controller' => 'SocialApiAuthAppleController', + 'method' => 'appleConnect', + 'user_id' => $user->id, + 'email' => $user->email + ]); + + $success['token'] = $token; + $success['user'] = $user; + $roles = $user->getRoleNames(); + $success['roles'] = $roles; + + return $this->sendResponse($success, 'Connexion réussie.'); + } catch (\Exception $e) { + // Log de l'erreur de connexion Apple + Log::error('Erreur lors de la connexion Apple', [ + 'controller' => 'SocialApiAuthAppleController', + 'method' => 'appleConnect', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - Auth::login($user); - $token = $user->createToken('Position')->accessToken; - $success['token'] = $token; - $success['user'] = $user; - $roles = $user->getRoleNames(); - $succes['roles'] = $roles; - return $this->sendResponse($success, 'Connexion réussie.'); + return $this->sendError('Erreur de connexion Apple', ['error' => $e->getMessage()], 400); + } } } diff --git a/app/Http/Controllers/Api/SocialApiAuthFacebookController.php b/app/Http/Controllers/Api/SocialApiAuthFacebookController.php index caad33a0..8636dc92 100644 --- a/app/Http/Controllers/Api/SocialApiAuthFacebookController.php +++ b/app/Http/Controllers/Api/SocialApiAuthFacebookController.php @@ -1,13 +1,12 @@ token; - $user = $service->createOrGetUser(Socialite::driver('facebook')->userFromToken($token)); + // Log de la tentative de connexion Facebook + Log::debug('Tentative de connexion via Facebook', [ + 'controller' => 'SocialApiAuthFacebookController', + 'method' => 'facebookConnect', + 'token_length' => strlen($token) + ]); + + try { + // Récupération de l'utilisateur depuis l'API Facebook + $socialiteUser = Socialite::driver('facebook')->userFromToken($token); + + // Log des informations de l'utilisateur Facebook récupérées + Log::debug('Informations utilisateur Facebook récupérées', [ + 'controller' => 'SocialApiAuthFacebookController', + 'method' => 'facebookConnect', + 'socialite_id' => $socialiteUser->getId(), + 'socialite_email' => $socialiteUser->getEmail(), + 'socialite_name' => $socialiteUser->getName() + ]); + + // Création ou récupération de l'utilisateur dans notre système + $user = $service->createOrGetUser($socialiteUser); + + // Authentification de l'utilisateur + Auth::login($user); + $token = $user->createToken('Position')->accessToken; + + // Log du succès de la connexion Facebook + Log::info('Connexion Facebook réussie', [ + 'controller' => 'SocialApiAuthFacebookController', + 'method' => 'facebookConnect', + 'user_id' => $user->id, + 'email' => $user->email + ]); + + $success['token'] = $token; + $success['user'] = $user; + $roles = $user->getRoleNames(); + $success['roles'] = $roles; + + return $this->sendResponse($success, 'Connexion réussie.'); + } catch (\Exception $e) { + // Log de l'erreur de connexion Facebook + Log::error('Erreur lors de la connexion Facebook', [ + 'controller' => 'SocialApiAuthFacebookController', + 'method' => 'facebookConnect', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - Auth::login($user); - $token = $user->createToken('Position')->accessToken; - $success['token'] = $token; - $success['user'] = $user; - $roles = $user->getRoleNames(); - $succes['roles'] = $roles; - return $this->sendResponse($success, 'Connexion réussie.'); + return $this->sendError('Erreur de connexion Facebook', ['error' => $e->getMessage()], 400); + } } } diff --git a/app/Http/Controllers/Api/SocialApiAuthGoogleController.php b/app/Http/Controllers/Api/SocialApiAuthGoogleController.php index 30a09d24..fc381998 100644 --- a/app/Http/Controllers/Api/SocialApiAuthGoogleController.php +++ b/app/Http/Controllers/Api/SocialApiAuthGoogleController.php @@ -1,12 +1,12 @@ token; - $user = $service->createOrGetUser(Socialite::driver('google')->userFromToken($token)); + // Log de la tentative de connexion Google + Log::debug('Tentative de connexion via Google', [ + 'controller' => 'SocialApiAuthGoogleController', + 'method' => 'googleConnect', + 'token_length' => strlen($token) + ]); + + try { + // Récupération de l'utilisateur depuis l'API Google + $socialiteUser = Socialite::driver('google')->userFromToken($token); + + // Log des informations de l'utilisateur Google récupérées + Log::debug('Informations utilisateur Google récupérées', [ + 'controller' => 'SocialApiAuthGoogleController', + 'method' => 'googleConnect', + 'socialite_id' => $socialiteUser->getId(), + 'socialite_email' => $socialiteUser->getEmail(), + 'socialite_name' => $socialiteUser->getName() + ]); + + // Création ou récupération de l'utilisateur dans notre système + $user = $service->createOrGetUser($socialiteUser); + + // Authentification de l'utilisateur + Auth::login($user); + $token = $user->createToken('Position')->accessToken; + + // Log du succès de la connexion Google + Log::info('Connexion Google réussie', [ + 'controller' => 'SocialApiAuthGoogleController', + 'method' => 'googleConnect', + 'user_id' => $user->id, + 'email' => $user->email + ]); + + $success['token'] = $token; + $success['user'] = $user; + $roles = $user->getRoleNames(); + $success['roles'] = $roles; + + return $this->sendResponse($success, 'Connexion réussie.'); + } catch (\Exception $e) { + // Log de l'erreur de connexion Google + Log::error('Erreur lors de la connexion Google', [ + 'controller' => 'SocialApiAuthGoogleController', + 'method' => 'googleConnect', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - Auth::login($user); - $token = $user->createToken('Position')->accessToken; - $success['token'] = $token; - $success['user'] = $user; - $roles = $user->getRoleNames(); - $succes['roles'] = $roles; - return $this->sendResponse($success, 'Connexion réussie.'); + return $this->sendError('Erreur de connexion Google', ['error' => $e->getMessage()], 400); + } } } diff --git a/app/Http/Controllers/Api/SocialApiAuthOsmController.php b/app/Http/Controllers/Api/SocialApiAuthOsmController.php index 9bbf3b1e..77c1d260 100644 --- a/app/Http/Controllers/Api/SocialApiAuthOsmController.php +++ b/app/Http/Controllers/Api/SocialApiAuthOsmController.php @@ -1,13 +1,12 @@ token; - $user = $service->createOrGetUser(Socialite::driver('openstreetmap')->userFromToken($token)); + // Log de la tentative de connexion OSM + Log::debug('Tentative de connexion via OpenStreetMap', [ + 'controller' => 'SocialApiAuthOsmController', + 'method' => 'osmConnect', + 'token_length' => strlen($token) + ]); + + try { + // Récupération de l'utilisateur depuis l'API OSM + $socialiteUser = Socialite::driver('openstreetmap')->userFromToken($token); + + // Log des informations de l'utilisateur OSM récupérées + Log::debug('Informations utilisateur OpenStreetMap récupérées', [ + 'controller' => 'SocialApiAuthOsmController', + 'method' => 'osmConnect', + 'socialite_id' => $socialiteUser->getId(), + 'socialite_email' => $socialiteUser->getEmail(), + 'socialite_name' => $socialiteUser->getName() + ]); + + // Création ou récupération de l'utilisateur dans notre système + $user = $service->createOrGetUser($socialiteUser); + + // Authentification de l'utilisateur + Auth::login($user); + $token = $user->createToken('Position')->accessToken; + + // Log du succès de la connexion OSM + Log::info('Connexion OpenStreetMap réussie', [ + 'controller' => 'SocialApiAuthOsmController', + 'method' => 'osmConnect', + 'user_id' => $user->id, + 'email' => $user->email + ]); + + $success['token'] = $token; + $success['user'] = $user; + $roles = $user->getRoleNames(); + $success['roles'] = $roles; + + return $this->sendResponse($success, 'Connexion réussie.'); + } catch (\Exception $e) { + // Log de l'erreur de connexion OSM + Log::error('Erreur lors de la connexion OpenStreetMap', [ + 'controller' => 'SocialApiAuthOsmController', + 'method' => 'osmConnect', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - Auth::login($user); - $token = $user->createToken('Position')->accessToken; - $success['token'] = $token; - $success['user'] = $user; - $roles = $user->getRoleNames(); - $succes['roles'] = $roles; - return $this->sendResponse($success, 'Connexion réussie.'); + return $this->sendError('Erreur de connexion OpenStreetMap', ['error' => $e->getMessage()], 400); + } } } diff --git a/app/Http/Controllers/Api/SocialApiAuthTwitterController.php b/app/Http/Controllers/Api/SocialApiAuthTwitterController.php index d0d57c80..857e3c21 100644 --- a/app/Http/Controllers/Api/SocialApiAuthTwitterController.php +++ b/app/Http/Controllers/Api/SocialApiAuthTwitterController.php @@ -1,12 +1,12 @@ token; $secret = $request->secret; - $user = $service->createOrGetUser($user = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret)); + // Log de la tentative de connexion Twitter + Log::debug('Tentative de connexion via Twitter', [ + 'controller' => 'SocialApiAuthTwitterController', + 'method' => 'twitterConnect', + 'token_length' => strlen($token), + 'secret_length' => strlen($secret) + ]); + + try { + // Récupération de l'utilisateur depuis l'API Twitter + $socialiteUser = Socialite::driver('twitter')->userFromTokenAndSecret($token, $secret); + + // Log des informations de l'utilisateur Twitter récupérées + Log::debug('Informations utilisateur Twitter récupérées', [ + 'controller' => 'SocialApiAuthTwitterController', + 'method' => 'twitterConnect', + 'socialite_id' => $socialiteUser->getId(), + 'socialite_nickname' => $socialiteUser->getNickname(), + 'socialite_name' => $socialiteUser->getName() + ]); + + // Création ou récupération de l'utilisateur dans notre système + $user = $service->createOrGetUser($socialiteUser); + + // Authentification de l'utilisateur + Auth::login($user); + $token = $user->createToken('Position')->accessToken; + + // Log du succès de la connexion Twitter + Log::info('Connexion Twitter réussie', [ + 'controller' => 'SocialApiAuthTwitterController', + 'method' => 'twitterConnect', + 'user_id' => $user->id, + 'email' => $user->email + ]); + + $success['token'] = $token; + $success['user'] = $user; + $roles = $user->getRoleNames(); + $success['roles'] = $roles; + + return $this->sendResponse($success, 'Connexion réussie.'); + } catch (\Exception $e) { + // Log de l'erreur de connexion Twitter + Log::error('Erreur lors de la connexion Twitter', [ + 'controller' => 'SocialApiAuthTwitterController', + 'method' => 'twitterConnect', + 'exception' => $e->getMessage(), + 'trace' => $e->getTraceAsString() + ]); - Auth::login($user); - $token = $user->createToken('Position')->accessToken; - $success['token'] = $token; - $success['user'] = $user; - $roles = $user->getRoleNames(); - $succes['roles'] = $roles; - return $this->sendResponse($success, 'Connexion réussie.'); + return $this->sendError('Erreur de connexion Twitter', ['error' => $e->getMessage()], 400); + } } } diff --git a/app/Http/Controllers/Api/SousCategorieController.php b/app/Http/Controllers/Api/SousCategorieController.php index de376d04..2fca4700 100644 --- a/app/Http/Controllers/Api/SousCategorieController.php +++ b/app/Http/Controllers/Api/SousCategorieController.php @@ -7,6 +7,7 @@ use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Validator; +use Illuminate\Support\Facades\Log; /** * @@ -23,6 +24,8 @@ class SousCategorieController extends BaseController */ public function index() { + // Log du début de la requête + Log::debug('Récupération de la liste des sous-catégories', ['controller' => 'SousCategorieController', 'method' => 'index']); $souscategories = SousCategorie::all(); foreach ($souscategories as $souscategorie) { @@ -31,6 +34,13 @@ public function index() $success['sous_categories'] = $souscategories; + // Log du nombre de sous-catégories récupérées + Log::info('Liste des sous-catégories récupérée', [ + 'controller' => 'SousCategorieController', + 'method' => 'index', + 'count' => count($souscategories) + ]); + return $this->sendResponse($success, 'Liste des Sous-Categories'); } @@ -47,6 +57,12 @@ public function index() */ public function store(Request $request) { + // Log du début de la création + Log::debug('Tentative de création d\'une sous-catégorie', [ + 'controller' => 'SousCategorieController', + 'method' => 'store', + 'inputs' => $request->all() + ]); $validator = Validator::make($request->all(), [ 'nom' => 'required', 'categorie_id' => 'required', @@ -87,6 +103,14 @@ public function store(Request $request) $success['sous_categorie'] = $souscategorie; + // Log du succès de la création + Log::info('Sous-catégorie créée avec succès', [ + 'controller' => 'SousCategorieController', + 'method' => 'store', + 'sous_categorie_id' => $souscategorie->id, + 'sous_categorie_nom' => $souscategorie->nom + ]); + return $this->sendResponse($success, "Création de la Sous catégorie reussie", 201); } catch (\Exception $ex) { @@ -102,6 +126,12 @@ public function store(Request $request) */ public function show($id) { + // Log de la demande de détails + Log::debug('Récupération des détails d\'une sous-catégorie', [ + 'controller' => 'SousCategorieController', + 'method' => 'show', + 'sous_categorie_id' => $id + ]); $souscategorie = SousCategorie::find($id); $souscategorie->categorie; @@ -109,6 +139,14 @@ public function show($id) $success['sous_categorie'] = $souscategorie; + // Log du succès de la récupération + Log::info('Détails de la sous-catégorie récupérés', [ + 'controller' => 'SousCategorieController', + 'method' => 'show', + 'sous_categorie_id' => $id, + 'sous_categorie_nom' => $souscategorie->nom + ]); + return $this->sendResponse($success, 'SousCategorie'); } @@ -127,6 +165,13 @@ public function show($id) */ public function update(Request $request, $id) { + // Log du début de la mise à jour + Log::debug('Tentative de mise à jour d\'une sous-catégorie', [ + 'controller' => 'SousCategorieController', + 'method' => 'update', + 'sous_categorie_id' => $id, + 'inputs' => $request->all() + ]); $souscategorie = SousCategorie::find($id); $categorie = $souscategorie->categorie; $request->validate([ @@ -159,9 +204,25 @@ public function update(Request $request, $id) $success['sous_categorie'] = $souscategorie; + // Log du succès de la mise à jour + Log::info('Sous-catégorie mise à jour avec succès', [ + 'controller' => 'SousCategorieController', + 'method' => 'update', + 'sous_categorie_id' => $souscategorie->id, + 'sous_categorie_nom' => $souscategorie->nom + ]); + return $this->sendResponse($success, "Update Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la mise à jour d\'une sous-catégorie', [ + 'controller' => 'SousCategorieController', + 'method' => 'update', + 'sous_categorie_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); return $this->sendError('Erreur.', ['error' => 'Echec de mise à jour'], 400); } } @@ -175,15 +236,34 @@ public function update(Request $request, $id) */ public function destroy($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression d\'une sous-catégorie', [ + 'controller' => 'SousCategorieController', + 'method' => 'destroy', + 'sous_categorie_id' => $id + ]); $souscategorie = SousCategorie::find($id); try { $souscategorie->delete(); + Log::info('Sous-catégorie supprimée avec succès', [ + 'controller' => 'SousCategorieController', + 'method' => 'destroy', + 'sous_categorie_id' => $id + ]); return $this->sendResponse("", "Delete Success", 201); } catch (\Throwable $th) { + // Log de l'erreur + Log::error('Erreur lors de la suppression d\'une sous-catégorie', [ + 'controller' => 'SousCategorieController', + 'method' => 'destroy', + 'sous_categorie_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } } @@ -196,6 +276,12 @@ public function destroy($id) */ public function search(Request $request) { + // Log de la recherche + Log::debug('Recherche de sous-catégories', [ + 'controller' => 'SousCategorieController', + 'method' => 'search', + 'query' => $request->input('q') + ]); $q = $request->input('q'); $souscategories = SousCategorie::search($q)->get(); @@ -205,6 +291,13 @@ public function search(Request $request) $success['sous_categories'] = $souscategories; + // Log du nombre de sous-catégories trouvées + Log::info('Sous-catégories trouvées', [ + 'controller' => 'SousCategorieController', + 'method' => 'search', + 'count' => count($souscategories) + ]); + return $this->sendResponse($success, 'Liste des Sous-Categories'); } } diff --git a/app/Http/Controllers/Api/TrackingController.php b/app/Http/Controllers/Api/TrackingController.php index 6c02f189..2c4ee3d0 100644 --- a/app/Http/Controllers/Api/TrackingController.php +++ b/app/Http/Controllers/Api/TrackingController.php @@ -5,6 +5,7 @@ use App\Models\Tracking; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; /** * @@ -37,8 +38,12 @@ public function index() public function store(Request $request) { try { - - + // Log du début de la création + Log::debug('Tentative de création d\'une position', [ + 'controller' => 'TrackingController', + 'method' => 'store', + 'inputs' => $request->all() + ]); $user = Auth::user(); @@ -49,6 +54,13 @@ public function store(Request $request) $success['tracking'] = $tracking; + // Log de la création réussie + Log::info('Position créée avec succès', [ + 'controller' => 'TrackingController', + 'method' => 'store', + 'tracking_id' => $tracking->id + ]); + return $this->sendResponse($success, "Ajout de la position reussie", 201); } catch (\Exception $ex) { return $this->sendError('Erreur.', ['error' => $ex->getMessage()], 400); diff --git a/app/Http/Controllers/Api/UserController.php b/app/Http/Controllers/Api/UserController.php index 4ba59e7a..649f7d3d 100644 --- a/app/Http/Controllers/Api/UserController.php +++ b/app/Http/Controllers/Api/UserController.php @@ -10,6 +10,7 @@ use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Validator; use Password; +use Illuminate\Support\Facades\Log; class UserController extends BaseController { @@ -27,6 +28,12 @@ class UserController extends BaseController */ public function register(Request $request) { + // Log de la tentative d'inscription + Log::debug('Tentative d\'inscription', [ + 'controller' => 'UserController', + 'method' => 'register', + 'inputs' => $request->all() + ]); $validator = Validator::make($request->all(), [ 'name' => 'string|max:191', 'email' => 'email|unique:users,email', @@ -56,8 +63,21 @@ public function register(Request $request) $success['user'] = $user; if ($user) { + // Log de l'inscription réussie + Log::info('Inscription réussie', [ + 'controller' => 'UserController', + 'method' => 'register', + 'user_id' => $user->id, + 'email' => $user->email + ]); return $this->sendResponse($success, 'Création réussie verifiez vos mails.'); } else { + // Log de l'échec de l'inscription + Log::error('Échec de l\'inscription', [ + 'controller' => 'UserController', + 'method' => 'register', + 'input' => $input + ]); return $this->sendError("Pas autorisé.", ['error' => 'Unauthorised']); } } @@ -73,6 +93,12 @@ public function register(Request $request) */ public function login(Request $request) { + // Log de la tentative de connexion + Log::debug('Tentative de connexion', [ + 'controller' => 'UserController', + 'method' => 'login', + 'inputs' => $request->all() + ]); $credentials = $request->only(['email', 'phone', 'password']); if (Auth::attempt($credentials)) { @@ -82,11 +108,32 @@ public function login(Request $request) $success['token'] = $user->createToken('Position')->accessToken; $success['user'] = $user; + // Log de la connexion réussie + Log::info('Connexion réussie', [ + 'controller' => 'UserController', + 'method' => 'login', + 'user_id' => $user->id, + 'email' => $user->email + ]); + return $this->sendResponse($success, 'Connexion réussie.'); } else { + // Log de l'échec de la connexion en raison d'un email non vérifié + Log::warning('Connexion échouée - Email non vérifié', [ + 'controller' => 'UserController', + 'method' => 'login', + 'user_id' => $user->id, + 'email' => $user->email + ]); return $this->sendError("Email not verified.", ['error' => 'Unauthorised'], 400); } } else { + // Log de l'échec de la connexion + Log::error('Échec de la connexion', [ + 'controller' => 'UserController', + 'method' => 'login', + 'credentials' => $credentials + ]); return $this->sendError('Pas autorisé.', ['error' => 'Login Error']); } } @@ -100,19 +147,42 @@ public function login(Request $request) */ public function logout() { + // Log de la tentative de déconnexion + Log::debug('Tentative de déconnexion', [ + 'controller' => 'UserController', + 'method' => 'logout', + 'user_id' => Auth::id() + ]); $user = Auth::user(); - if($user) { + if ($user) { $token = $user->token(); $revoque = $token->revoke(); if ($revoque) { + // Log de la déconnexion réussie + Log::info('Déconnexion réussie', [ + 'controller' => 'UserController', + 'method' => 'logout', + 'user_id' => $user->id + ]); return $this->sendResponse("", 'Deconnexion réussie.'); } else { + // Log de l'échec de la déconnexion + Log::error('Échec de la déconnexion', [ + 'controller' => 'UserController', + 'method' => 'logout', + 'user_id' => $user->id + ]); return $this->sendError('Pas autorisé.', ['error' => 'Echec de deconnexion'], 400); } } else { - return $this->sendResponse("", 'Deconnexion réussie.'); + // Log de l'échec de la déconnexion en raison d'un utilisateur non authentifié + Log::warning('Tentative de déconnexion sans utilisateur authentifié', [ + 'controller' => 'UserController', + 'method' => 'logout' + ]); + return $this->sendResponse("", 'Deconnexion réussie.'); } } @@ -125,6 +195,12 @@ public function logout() */ public function getUser() { + // Log de la récupération des informations utilisateur + Log::debug('Récupération des informations utilisateur', [ + 'controller' => 'UserController', + 'method' => 'getUser', + 'user_id' => Auth::id() + ]); $user = Auth::user(); if ($user) { @@ -133,8 +209,20 @@ public function getUser() $success["user"] = $user; $succes['roles'] = $roles; + // Log du succès de la récupération + Log::info('Informations utilisateur récupérées', [ + 'controller' => 'UserController', + 'method' => 'getUser', + 'user_id' => $user->id + ]); + return $this->sendResponse($success, 'Utilisateur'); } else { + // Log de l'échec de la récupération en raison d'un utilisateur non authentifié + Log::warning('Echec Unauthorised', [ + 'controller' => 'UserController', + 'method' => 'getUser' + ]); return $this->sendError('Pas autorisé.', ['error' => 'Unauthorised']); } } @@ -153,6 +241,13 @@ public function getUser() */ public function updateuser($id, Request $request) { + // Log de la tentative de mise à jour + Log::debug('Tentative de mise à jour de l\'utilisateur', [ + 'controller' => 'UserController', + 'method' => 'updateuser', + 'user_id' => $id, + 'inputs' => $request->all() + ]); $user = Auth::user(); $admin = Admin::where('user_id', $user->id)->first(); if ($admin || $user->id == $id) { @@ -178,12 +273,30 @@ public function updateuser($id, Request $request) $save = $user->save(); if ($save) { + // Log de la mise à jour réussie + Log::info('Mise à jour réussie', [ + 'controller' => 'UserController', + 'method' => 'updateuser', + 'user_id' => $user->id + ]); $success["user"] = $user; return $this->sendResponse($success, "Utilisateur", 201); } else { + // Log de l'échec de la mise à jour + Log::error('Échec de la mise à jour', [ + 'controller' => 'UserController', + 'method' => 'updateuser', + 'user_id' => $user->id + ]); return $this->sendError('Erreur.', ['error' => 'Echec de mise à jour'], 400); } } else { + // Log de l'échec de la mise à jour en raison d'un utilisateur non autorisé + Log::warning('Tentative de mise à jour d\'un utilisateur non autorisé', [ + 'controller' => 'UserController', + 'method' => 'updateuser', + 'user_id' => $id + ]); return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } } @@ -199,6 +312,12 @@ public function updateuser($id, Request $request) */ public function deleteuser($id) { + // Log de la tentative de suppression + Log::debug('Tentative de suppression de l\'utilisateur', [ + 'controller' => 'UserController', + 'method' => 'deleteuser', + 'user_id' => $id + ]); $user = Auth::user(); $admin = Admin::where('user_id', $user->id)->first(); if ($admin || $user->id == $id) { @@ -206,8 +325,23 @@ public function deleteuser($id) try { User::destroy($id); + // Log de la suppression réussie + Log::info('Suppression réussie', [ + 'controller' => 'UserController', + 'method' => 'deleteuser', + 'user_id' => $id + ]); + return $this->sendResponse("", "Delete Success", 200); } catch (\Throwable $th) { + // Log de l'échec de la suppression + Log::error('Échec de la suppression', [ + 'controller' => 'UserController', + 'method' => 'deleteuser', + 'user_id' => $id, + 'exception' => $th->getMessage(), + 'trace' => $th->getTraceAsString() + ]); return $this->sendError('Erreur.', ['error' => 'Echec de suppression'], 400); } } @@ -223,10 +357,23 @@ public function deleteuser($id) */ public function forgot() { + // Log de la tentative de réinitialisation du mot de passe + Log::debug('Tentative de réinitialisation du mot de passe', [ + 'controller' => 'UserController', + 'method' => 'forgot', + 'inputs' => request()->all() + ]); $credentials = request()->validate(['email' => 'required|email']); Password::sendResetLink($credentials); + // Log de l'envoi du lien de réinitialisation + Log::info('Lien de réinitialisation envoyé', [ + 'controller' => 'UserController', + 'method' => 'forgot', + 'email' => $credentials['email'] + ]); + return $this->sendResponse("", "Un lien de reinitialisation vous a été envoyé par mail.", 200); } @@ -242,6 +389,12 @@ public function forgot() */ public function reset(Request $request) { + // Log de la tentative de réinitialisation du mot de passe + Log::debug('Tentative de réinitialisation du mot de passe', [ + 'controller' => 'UserController', + 'method' => 'reset', + 'inputs' => $request->all() + ]); $validator = Validator::make($request->all(), [ @@ -251,6 +404,12 @@ public function reset(Request $request) ]); if ($validator->fails()) { + // Log des erreurs de validation + Log::error('Erreur de validation', [ + 'controller' => 'UserController', + 'method' => 'reset', + 'errors' => $validator->errors() + ]); return $this->sendError('Erreur de paramètres.', $validator->errors(), 400); } @@ -261,9 +420,37 @@ public function reset(Request $request) $user->save(); }); + // Log de la réinitialisation du mot de passe + Log::info('Réinitialisation du mot de passe', [ + 'controller' => 'UserController', + 'method' => 'reset', + 'email' => $credentials['email'], + 'status' => $reset_password_status + ]); + if ($reset_password_status == Password::INVALID_TOKEN) { + // Log de l'échec de la réinitialisation en raison d'un token invalide + Log::error('Échec de la réinitialisation du mot de passe - Token invalide', [ + 'controller' => 'UserController', + 'method' => 'reset', + 'email' => $credentials['email'] + ]); return $this->sendError("Invalid token provided", ['error' => 'Unauthorised']); } + if ($reset_password_status == Password::INVALID_USER) { + // Log de l'échec de la réinitialisation en raison d'un utilisateur invalide + Log::error('Échec de la réinitialisation du mot de passe - Utilisateur invalide', [ + 'controller' => 'UserController', + 'method' => 'reset', + 'email' => $credentials['email'] + ]); + return $this->sendError("Invalid user provided", ['error' => 'Unauthorised']); + } + Log::info('Réinitialisation du mot de passe réussie', [ + 'controller' => 'UserController', + 'method' => 'reset', + 'email' => $credentials['email'] + ]); return $this->sendResponse("", "Password has been successfully changed", 201); } @@ -277,6 +464,12 @@ public function reset(Request $request) public function favorites() { + // Log de la récupération des favoris + Log::debug('Récupération des favoris', [ + 'controller' => 'UserController', + 'method' => 'favorites', + 'user_id' => Auth::id() + ]); $user = Auth::user(); $favorites = UserFavoris::where('user_id', $user->id)->get(); @@ -320,6 +513,14 @@ public function favorites() } } + // Log du succès de la récupération + Log::info('Favoris récupérés avec succès', [ + 'controller' => 'UserController', + 'method' => 'favorites', + 'user_id' => $user->id, + 'nombre_favoris' => count($etablissements) + ]); + return $this->sendResponse($etablissements, 'Favorites'); } } diff --git a/app/Http/Controllers/Api/VerificationController.php b/app/Http/Controllers/Api/VerificationController.php index 69b8e0a8..d9b08c2e 100644 --- a/app/Http/Controllers/Api/VerificationController.php +++ b/app/Http/Controllers/Api/VerificationController.php @@ -5,6 +5,7 @@ use App\Models\User; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; +use Illuminate\Support\Facades\Log; class VerificationController extends BaseController { @@ -15,6 +16,13 @@ class VerificationController extends BaseController */ public function verify($id, Request $request) { + // Log de la vérification de l'email + Log::debug('Tentative de vérification de l\'email', [ + 'controller' => 'VerificationController', + 'method' => 'verify', + 'user_id' => $id, + 'request' => $request->all() + ]); /* if (!$request->hasValidSignature()) { return $this->sendError("Invalid/Expired url provided.", ['error' => 'Unauthorised']); }*/ @@ -24,6 +32,12 @@ public function verify($id, Request $request) if (!$user->hasVerifiedEmail()) { $user->markEmailAsVerified(); } + // Log de la vérification réussie + Log::info('Vérification de l\'email réussie', [ + 'controller' => 'VerificationController', + 'method' => 'verify', + 'user_id' => $id + ]); $success['user'] = $user; return $this->sendResponse($success, 'Vérification Reussie'); } @@ -35,10 +49,24 @@ public function verify($id, Request $request) */ public function resend() { + + // Log de la demande de renvoi de l'email de vérification + Log::debug('Tentative de renvoi de l\'email de vérification', [ + 'controller' => 'VerificationController', + 'method' => 'resend', + 'user_id' => Auth::id() + ]); if (Auth::user()->hasVerifiedEmail()) { return $this->sendError("Email already verified.", ['error' => ''], 400); } + // Log de l'envoi de l'email de vérification + Log::info('Envoi de l\'email de vérification', [ + 'controller' => 'VerificationController', + 'method' => 'resend', + 'user_id' => Auth::id() + ]); + Auth::user()->sendEmailVerificationNotification(); $success['user'] = auth()->user(); return $this->sendResponse($success, 'Email verification link sent on your email id'); @@ -51,11 +79,23 @@ public function resend() */ public function verifyByPhone($id) { + // Log de la vérification du téléphone + Log::debug('Tentative de vérification du téléphone', [ + 'controller' => 'VerificationController', + 'method' => 'verifyByPhone', + 'user_id' => $id + ]); $user = User::findOrFail($id); if (!$user->hasVerifiedEmail()) { $user->markEmailAsVerified(); } + // Log de la vérification réussie + Log::info('Vérification du téléphone réussie', [ + 'controller' => 'VerificationController', + 'method' => 'verifyByPhone', + 'user_id' => $id + ]); $success['user'] = $user; return $this->sendResponse($success, 'Vérification Reussie'); } diff --git a/composer.json b/composer.json index 2debf087..15c776e4 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "ejarnutowski/laravel-api-key": "^1.0", "filament/filament": "3.3.4", "guzzlehttp/guzzle": "^7.4", + "hedii/laravel-gelf-logger": "^8.1", "http-interop/http-factory-guzzle": "^1.2", "kreait/laravel-firebase": "^5.8.0", "laravel/framework": "^10.38.2", diff --git a/config/logging.php b/config/logging.php index 9e81c1f4..1d673674 100644 --- a/config/logging.php +++ b/config/logging.php @@ -50,10 +50,116 @@ 'channels' => [ 'stack' => [ 'driver' => 'stack', - 'channels' => ['single', 'daily'], + 'channels' => ['single', 'daily', 'gelf'], 'ignore_exceptions' => false, ], + 'gelf' => [ + 'driver' => 'custom', + + 'via' => \Hedii\LaravelGelfLogger\GelfLoggerFactory::class, + + // This optional option determines the processors that should be + // pushed to the handler. This option is useful to modify a field + // in the log context (see NullStringProcessor), or to add extra + // data. Each processor must be a callable or an object with an + // __invoke method: see monolog documentation about processors. + // Default is an empty array. + 'processors' => [ + \Hedii\LaravelGelfLogger\Processors\NullStringProcessor::class, + \Hedii\LaravelGelfLogger\Processors\RenameIdFieldProcessor::class, + // another processor... + ], + + // This optional option determines the minimum "level" a message + // must be in order to be logged by the channel. Default is 'debug' + 'level' => 'debug', + + // This optional option determines the channel name sent with the + // message in the 'facility' field. Default is equal to app.env + // configuration value + 'name' => 'position-services-app', + + // This optional option determines the system name sent with the + // message in the 'source' field. When forgotten or set to null, + // the current hostname is used. + 'system_name' => 'position-services-app', + + // This optional option determines if you want the UDP, TCP or HTTP + // transport for the gelf log messages. Default is UDP + 'transport' => 'udp', + + // This optional option determines the host that will receive the + // gelf log messages. Default is 127.0.0.1 + 'host' => 'enterprise-graylog-1', + + // This optional option determines the port on which the gelf + // receiver host is listening. Default is 12201 + 'port' => 12201, + + // This optional option determines the chunk size used when + // transferring message via UDP transport. Default is 1420. + 'chunk_size' => 1420, + + // This optional option determines the path used for the HTTP + // transport. When forgotten or set to null, default path '/gelf' + // is used. + 'path' => null, + + // This optional option enable or disable ssl on TCP or HTTP + // transports. Default is false. + 'ssl' => false, + + // If ssl is enabled, the following configuration is used. + 'ssl_options' => [ + // Enable or disable the peer certificate check. Default is + // true. + 'verify_peer' => true, + + // Path to a custom CA file (eg: "/path/to/ca.pem"). Default + // is null. + 'ca_file' => null, + + // List of ciphers the SSL layer may use, formatted as + // specified in ciphers(1). Default is null. + 'ciphers' => null, + + // Whether self-signed certificates are allowed. Default is + // false. + 'allow_self_signed' => false, + ], + + // If you want to send messages to the gelf server using http basic + // authentication, the following configuration is used. Only useful + // if transport is set to http. + 'http_basic_auth' => [ + // The http basic authentication username. + 'username' => null, + + // The http basic authentication password. + 'password' => null, + ], + + // This optional option determines the maximum length per message + // field. When forgotten or set to null, the default value of + // \Monolog\Formatter\GelfMessageFormatter::DEFAULT_MAX_LENGTH is + // used (currently this value is 32766) + 'max_length' => null, + + // This optional option determines the prefix for 'context' fields + // from the Monolog record. Default is null (no context prefix) + 'context_prefix' => null, + + // This optional option determines the prefix for 'extra' fields + // from the Monolog record. Default is null (no extra prefix) + 'extra_prefix' => null, + + // This optional option determines whether errors thrown during + // logging should be ignored or not. Default is true. + 'ignore_error' => true, + + ], + 'single' => [ 'driver' => 'single', 'path' => storage_path('logs/laravel.log'),