Files
dewemoji/app/app/Http/Controllers/Api/V1/AdminUserController.php

131 lines
3.8 KiB
PHP

<?php
namespace App\Http\Controllers\Api\V1;
use App\Http\Controllers\Controller;
use App\Models\User;
use App\Services\Keywords\KeywordQuotaService;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AdminUserController extends Controller
{
public function __construct(
private readonly KeywordQuotaService $keywordQuota
) {
}
private function authorizeAdmin(Request $request): ?JsonResponse
{
$adminToken = (string) config('dewemoji.admin.token', '');
$provided = trim((string) $request->header('X-Admin-Token', ''));
if ($adminToken === '' || $provided === '' || !hash_equals($adminToken, $provided)) {
return response()->json(['ok' => false, 'error' => 'unauthorized'], 401);
}
return null;
}
public function index(Request $request): JsonResponse
{
if ($res = $this->authorizeAdmin($request)) {
return $res;
}
$q = trim((string) $request->query('q', ''));
$limit = max((int) $request->query('limit', 20), 1);
$query = User::query()->orderByDesc('id');
if ($q !== '') {
$query->where(function ($sub) use ($q): void {
$sub->where('email', 'like', '%'.$q.'%')
->orWhere('name', 'like', '%'.$q.'%');
});
}
$items = $query->limit($limit)->get(['id', 'name', 'email', 'tier', 'created_at']);
return response()->json([
'ok' => true,
'items' => $items,
]);
}
public function show(Request $request): JsonResponse
{
if ($res = $this->authorizeAdmin($request)) {
return $res;
}
$email = trim((string) $request->query('email', ''));
$userId = (int) $request->query('user_id', 0);
$query = User::query();
if ($email !== '') {
$query->where('email', $email);
} elseif ($userId > 0) {
$query->where('id', $userId);
} else {
return response()->json(['ok' => false, 'error' => 'missing_target'], 400);
}
/** @var User|null $user */
$user = $query->first();
if (!$user) {
return response()->json(['ok' => false, 'error' => 'not_found'], 404);
}
return response()->json([
'ok' => true,
'user' => [
'id' => $user->id,
'name' => $user->name,
'email' => $user->email,
'tier' => $user->tier,
'created_at' => $user->created_at,
],
]);
}
public function setTier(Request $request): JsonResponse
{
if ($res = $this->authorizeAdmin($request)) {
return $res;
}
$data = $request->validate([
'email' => 'nullable|email|max:255',
'user_id' => 'nullable|integer',
'tier' => 'required|string|in:free,personal',
]);
$query = User::query();
if (!empty($data['email'])) {
$query->where('email', $data['email']);
} elseif (!empty($data['user_id'])) {
$query->where('id', $data['user_id']);
} else {
return response()->json(['ok' => false, 'error' => 'missing_target'], 400);
}
/** @var User|null $user */
$user = $query->first();
if (!$user) {
return response()->json(['ok' => false, 'error' => 'not_found'], 404);
}
$user->tier = $data['tier'];
$user->save();
$this->keywordQuota->enforceForUser((int) $user->id, (string) $user->tier);
return response()->json([
'ok' => true,
'user' => [
'id' => $user->id,
'email' => $user->email,
'tier' => $user->tier,
],
]);
}
}