174 lines
6.1 KiB
PHP
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');
|
|
}
|
|
}
|