Files
Verde-Web/app/Http/Controllers/Api/V1/SuperAdmin/SuperAdminUserController.php
2026-07-02 13:55:34 +08:00

174 lines
6.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1\SuperAdmin;
use App\Http\Controllers\Api\V1\ApiController;
use App\Http\Requests\SuperAdmin\StoreSuperAdminUserRequest;
use App\Http\Resources\SuperAdmin\SuperAdminUserResource;
use App\Models\NotificationPreference;
use App\Models\PartnerStore;
use App\Models\StoreInventory;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
class SuperAdminUserController extends ApiController
{
public function index(Request $request): JsonResponse
{
$request->validate([
'role' => ['nullable', 'string'],
'status' => ['nullable', 'string'],
'tenant_id' => ['nullable', 'integer'],
'q' => ['nullable', 'string', 'max:100'],
'per_page' => ['nullable', 'integer', 'min:1', 'max:100'],
]);
$perPage = (int) $request->input('per_page', 25);
$users = User::query()
->with(['tenant'])
->when($request->filled('role'), fn ($q) => $q->where('role', $request->string('role')))
->when($request->filled('status'), fn ($q) => $q->where('status', $request->string('status')))
->when($request->filled('tenant_id'), fn ($q) => $q->where('tenant_id', $request->integer('tenant_id')))
->when($request->filled('q'), function ($q) use ($request) {
$term = '%'.$request->string('q').'%';
$q->where(function ($qq) use ($term) {
$qq->where('email', 'like', $term)
->orWhere('phone', 'like', $term)
->orWhere('first_name', 'like', $term)
->orWhere('last_name', 'like', $term);
});
})
->orderByDesc('id')
->paginate($perPage);
return $this->ok(
SuperAdminUserResource::collection($users),
null,
[
'page' => $users->currentPage(),
'per_page' => $users->perPage(),
'total' => $users->total(),
'last_page' => $users->lastPage(),
],
);
}
public function store(StoreSuperAdminUserRequest $request): JsonResponse
{
$data = $request->validated();
$user = DB::transaction(function () use ($data) {
$user = User::create([
'tenant_id' => $data['tenant_id'] ?? null,
'first_name' => $data['first_name'],
'middle_name' => $data['middle_name'] ?? null,
'last_name' => $data['last_name'],
'email' => $data['email'],
'phone' => $data['phone'],
'password' => Hash::make($data['password']),
'role' => $data['role'],
'status' => User::STATUS_PENDING,
'preferred_language' => $data['preferred_language'] ?? 'en',
]);
$user->assignRole($data['role']);
$profileClass = User::profileModelForRole($data['role']);
if ($profileClass) {
$profileClass::create(['user_id' => $user->id]);
}
NotificationPreference::create([
'user_id' => $user->id,
'language' => $data['preferred_language'] ?? 'en',
]);
// If store_partner, auto-create a shell store so they can access the dashboard
if ($data['role'] === User::ROLE_STORE_PARTNER) {
$store = PartnerStore::create([
'tenant_id' => $user->tenant_id,
'owner_user_id' => $user->id,
'business_name' => $user->first_name."'s Store",
'status' => PartnerStore::STATUS_ACTIVE,
'commission_rate_percent' => 10, // Default 10%
]);
StoreInventory::create([
'store_id' => $store->id,
'current_code_balance' => 0,
]);
}
return $user;
});
return $this->created(
new SuperAdminUserResource($user->load(['tenant'])),
'User account created successfully in pending status'
);
}
public function show(User $user): JsonResponse
{
$user->load(['tenant']);
return $this->ok(new SuperAdminUserResource($user));
}
public function update(StoreSuperAdminUserRequest $request, User $user): JsonResponse
{
$data = $request->validated();
DB::transaction(function () use ($user, $data) {
$updateData = [
'first_name' => $data['first_name'],
'middle_name' => $data['middle_name'] ?? null,
'last_name' => $data['last_name'],
'email' => $data['email'],
'phone' => $data['phone'],
'role' => $data['role'],
'tenant_id' => $data['tenant_id'] ?? null,
];
if (! empty($data['password'])) {
$updateData['password'] = Hash::make($data['password']);
}
$oldRole = $user->role;
$user->update($updateData);
if ($oldRole !== $data['role']) {
$user->syncRoles([$data['role']]);
// Delete old profile, create new profile if role changed
$oldProfileClass = User::profileModelForRole($oldRole);
if ($oldProfileClass) {
$oldProfileClass::where('user_id', $user->id)->delete();
}
$newProfileClass = User::profileModelForRole($data['role']);
if ($newProfileClass) {
$newProfileClass::create(['user_id' => $user->id]);
}
}
});
return $this->ok(new SuperAdminUserResource($user->fresh()->load(['tenant'])), 'User updated successfully');
}
public function destroy(User $user): JsonResponse
{
if ($user->id === auth()->id()) {
return $this->fail('You cannot delete your own account.', null, 422);
}
$user->delete();
return $this->ok(null, 'User deleted successfully');
}
}