add notification service

This commit is contained in:
2025-04-29 14:44:31 +03:30
parent 89fb72b3ce
commit 61d5b684a4
8 changed files with 181 additions and 18 deletions

View File

@@ -5,16 +5,14 @@ namespace App\Http\Controllers\Admin;
use App\Facades\DataTable\DataTableFacade; use App\Facades\DataTable\DataTableFacade;
use App\Facades\File\FileFacade; use App\Facades\File\FileFacade;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Auth\LoginRequest;
use App\Http\Requests\Admin\StoreRequest; use App\Http\Requests\Admin\StoreRequest;
use App\Http\Requests\Admin\UpdateRequest; use App\Http\Requests\Admin\UpdateRequest;
use App\Http\Resource\Admin\UserResource; use App\Http\Resources\Admin\UserResource;
use App\Http\Traits\ApiResponse; use App\Http\Traits\ApiResponse;
use App\Models\Province; use App\Models\Province;
use App\Models\User; use App\Models\User;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
@@ -87,11 +85,9 @@ class UserManagementController extends Controller
$province = Province::query()->find($request->province_id); $province = Province::query()->find($request->province_id);
$avatar = $request->avatar ? $avatar = $request->avatar ?
FileFacade::save($request->file('avatar'), 'users/avatars/' . $request->username) $user->storeFile($request->file('avatar'), $request->username)
: null; : null;
$email = $request->email ?? null;
$user->update([ $user->update([
'full_name' => $request->full_name, 'full_name' => $request->full_name,
'username' => $request->username, 'username' => $request->username,
@@ -102,7 +98,7 @@ class UserManagementController extends Controller
'province_id' => $province->id, 'province_id' => $province->id,
'province_fa' => $province->name, 'province_fa' => $province->name,
'avatar' => $avatar, 'avatar' => $avatar,
'email' => $email, 'email' => $request->email,
'telephone_id' => $request->telephone_id 'telephone_id' => $request->telephone_id
]); ]);
@@ -120,14 +116,9 @@ class UserManagementController extends Controller
} }
$user->syncRoles([]); $user->syncRoles([]);
$user->delete(); $user->delete();
}); });
return $this->successResponse(); return $this->successResponse();
} }
} }

View File

@@ -3,7 +3,7 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Http\Requests\ChangePasswordRequest; use App\Http\Requests\ChangePasswordRequest;
use App\Http\Resource\Admin\UserResource; use App\Http\Resources\Admin\UserResource;
use App\Http\Traits\ApiResponse; use App\Http\Traits\ApiResponse;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Hash;
@@ -20,7 +20,7 @@ class ProfileController extends Controller
public function changePassword(ChangePasswordRequest $request): JsonResponse public function changePassword(ChangePasswordRequest $request): JsonResponse
{ {
$user = auth()->user(); $user = auth()->user();
if (! Hash::check($request->curent_pasword, $user->passwored)){ if (! Hash::check($request->current_password, $user->passwored)){
return $this->errorResponse(__('messages.wrong_current_password')); return $this->errorResponse(__('messages.wrong_current_password'));
} }
$user->update([ $user->update([
@@ -29,5 +29,4 @@ class ProfileController extends Controller
return $this->successResponse(); return $this->successResponse();
} }
} }

View File

@@ -1,6 +1,6 @@
<?php <?php
namespace App\Http\Resource\Admin; namespace App\Http\Resources\Admin;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
@@ -9,7 +9,6 @@ class UserResource extends JsonResource
{ {
/** /**
* @param User $user
* @return array<string, mixed> * @return array<string, mixed>
*/ */
public function toArray(Request $request): array public function toArray(Request $request): array

View File

@@ -3,6 +3,7 @@
namespace App\Models; namespace App\Models;
// use Illuminate\Contracts\Auth\MustVerifyEmail; // use Illuminate\Contracts\Auth\MustVerifyEmail;
use App\Facades\File\FileFacade;
use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable; use Illuminate\Notifications\Notifiable;
@@ -14,5 +15,14 @@ class User extends Authenticatable
protected $guarded = []; protected $guarded = [];
protected $hidden = ['password',]; protected $hidden = ['password'];
public function storeFile($file, $name)
{
if ($this->avatar) {
FileFacade::delete($this->avatar, true);
}
return FileFacade::save($file, 'users/avatars/' . $name);
}
} }

View File

@@ -0,0 +1,37 @@
<?php
namespace App\Services\Notification\Exceptions;
use App\Exceptions\Throwable;
use Exception;
use Illuminate\Http\JsonResponse;
class NotificationServerNotRespondingException extends Exception
{
public $message;
public function __construct(string $message = "", int $code = 500, ?Throwable $previous = null)
{
$this->message = $message;
parent::__construct($message, $code, $previous);
}
/**
* Report the exception.
*/
public function report(): void
{
// ...
}
/**
* Render the exception into an HTTP response.
*/
public function render(): JsonResponse
{
return response()->json([
'message' => $this->message
], $this->code);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Services\Notification\Exceptions;
use App\Exceptions\Throwable;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
class OperatorNotConnectedException extends Exception
{
public $message;
public function __construct(string $message = "", int $code = 500, ?Throwable $previous = null)
{
$this->message = $message;
parent::__construct($message, $code, $previous);
}
/**
* Report the exception.
*/
public function report(): void
{
Log::channel('notification_service')
->error(OperatorNotConnectedException::class,[__('messages.operator_could_not_connect')]
);
}
/**
* Render the exception into an HTTP response.
*/
public function render(): JsonResponse
{
return response()->json([
'message' => $this->message
], $this->code);
}
}

View File

@@ -0,0 +1,40 @@
<?php
namespace App\Services\Notification\Exceptions;
use App\Exceptions\Throwable;
use Exception;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log;
class OperatorOfflineException extends Exception
{
public $message;
public function __construct(string $message = "", int $code = 500, ?Throwable $previous = null)
{
$this->message = $message;
parent::__construct($message, $code, $previous);
}
/**
* Report the exception.
*/
public function report(): void
{
Log::channel('notification_service')
->error(OperatorOfflineException::class, [__('messages.the_operator_is_offline')]
);
}
/**
* Render the exception into an HTTP response.
*/
public function render(): JsonResponse
{
return response()->json([
'message' => $this->message
], $this->code);
}
}

View File

@@ -0,0 +1,47 @@
<?php
namespace App\Services\Notification;
use App\Services\Notification\Exceptions\NotificationServerNotRespondingException;
use App\Services\Notification\Exceptions\OperatorNotConnectedException;
use App\Services\Notification\Exceptions\OperatorOfflineException;
use Illuminate\Http\Client\ConnectionException;
use Illuminate\Http\Client\RequestException;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Log;
class NotificationService
{
public function deliverDataToNotificationServer(array $data): void
{
try
{
$response = Http::retry(3)
->post(config('global_variables.NOTIFICATION_SERVER_URL'), $data)
->throwIfServerError();
$response_status = json_decode($response->body())->status;
throw_if($response_status == 1,
new OperatorOfflineException(__('messages.the_operator_is_offline'))
);
throw_if($response_status == 2,
new OperatorNotConnectedException(__('messages.operator_could_not_connect'))
);
}
catch (RequestException $exception)
{
Log::channel('notification_service')
->error(RequestException::class, [
$exception->getMessage(),
NotificationServerNotRespondingException::class,
__('messages.notification_server_is_down')
]);
throw_if($exception->response->serverError(),
new NotificationServerNotRespondingException(__('messages.notification_server_is_down'))
);
}
}
}