refactor: encapsulate password update and push subscription logic within dedicated services

This commit is contained in:
Yoga Pangestu 2026-06-22 12:08:20 +07:00
parent 60142c5aa8
commit 5119dd7208
4 changed files with 68 additions and 22 deletions

View File

@ -5,8 +5,8 @@
use App\Http\Controllers\Concerns\FlashesEntityMessage; use App\Http\Controllers\Concerns\FlashesEntityMessage;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Account\UpdatePasswordRequest; use App\Http\Requests\Admin\Account\UpdatePasswordRequest;
use App\Services\Account\ProfileService;
use Illuminate\Http\RedirectResponse; use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Hash;
use Inertia\Inertia; use Inertia\Inertia;
use Inertia\Response; use Inertia\Response;
@ -14,6 +14,10 @@ class PasswordController extends Controller
{ {
use FlashesEntityMessage; use FlashesEntityMessage;
public function __construct(
private readonly ProfileService $profileService,
) {}
public function edit(): Response public function edit(): Response
{ {
return Inertia::render('admin/account/Password'); return Inertia::render('admin/account/Password');
@ -21,9 +25,10 @@ public function edit(): Response
public function update(UpdatePasswordRequest $request): RedirectResponse public function update(UpdatePasswordRequest $request): RedirectResponse
{ {
$user = $request->user(); $this->profileService->updatePassword(
$user->password = Hash::make($request->validated('password')); $request->user(),
$user->save(); $request->validated('password'),
);
$this->flashUpdated('Kata sandi'); $this->flashUpdated('Kata sandi');

View File

@ -3,25 +3,20 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Http\Requests\PushSubscriptionRequest; use App\Http\Requests\PushSubscriptionRequest;
use App\Models\PushSubscription; use App\Services\System\PushSubscriptionService;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Auth;
class PushSubscriptionController extends Controller class PushSubscriptionController extends Controller
{ {
public function __construct(
private readonly PushSubscriptionService $pushSubscriptionService,
) {}
public function store(PushSubscriptionRequest $request): JsonResponse public function store(PushSubscriptionRequest $request): JsonResponse
{ {
$validated = $request->validated(); $this->pushSubscriptionService->updateOrCreateSubscription(
$request->validated(),
PushSubscription::updateOrCreate( $request->user()->id,
[
'user_id' => Auth::id(),
'endpoint' => $validated['endpoint'],
],
[
'public_key' => $validated['publicKey'],
'auth_token' => $validated['authToken'],
]
); );
return response()->json(['message' => 'Subscription berhasil disimpan.']); return response()->json(['message' => 'Subscription berhasil disimpan.']);
@ -29,11 +24,10 @@ public function store(PushSubscriptionRequest $request): JsonResponse
public function destroy(PushSubscriptionRequest $request): JsonResponse public function destroy(PushSubscriptionRequest $request): JsonResponse
{ {
$validated = $request->validated(); $this->pushSubscriptionService->deleteSubscription(
$request->validated('endpoint'),
PushSubscription::where('user_id', Auth::id()) $request->user()->id,
->where('endpoint', $validated['endpoint']) );
->delete();
return response()->json(['message' => 'Subscription berhasil dihapus.']); return response()->json(['message' => 'Subscription berhasil dihapus.']);
} }

View File

@ -4,6 +4,7 @@
use App\Models\User; use App\Models\User;
use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class ProfileService class ProfileService
{ {
@ -29,4 +30,13 @@ public function update(array $validated, User $user): void
); );
}); });
} }
/**
* Update user password.
*/
public function updatePassword(User $user, string $password): void
{
$user->password = Hash::make($password);
$user->save();
}
} }

View File

@ -0,0 +1,37 @@
<?php
namespace App\Services\System;
use App\Models\PushSubscription;
class PushSubscriptionService
{
/**
* Store or update a push subscription.
*
* @param array<string, mixed> $validated
*/
public function updateOrCreateSubscription(array $validated, int $userId): void
{
PushSubscription::updateOrCreate(
[
'user_id' => $userId,
'endpoint' => $validated['endpoint'],
],
[
'public_key' => $validated['publicKey'],
'auth_token' => $validated['authToken'],
]
);
}
/**
* Delete a push subscription.
*/
public function deleteSubscription(string $endpoint, int $userId): void
{
PushSubscription::where('user_id', $userId)
->where('endpoint', $endpoint)
->delete();
}
}