<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\Admin\CreateRequest;
use App\Http\Requests\Admin\Admin\GetListRequest;
use App\Http\Requests\Admin\Admin\SyncPermissionsRequest;
use App\Http\Requests\Admin\Admin\UpdateRequest;
use App\Http\Requests\Admin\Admin\UpdateSelfRequest;
use App\Http\Response\ApiCode;
use App\Models\Admin;
use App\Models\Permission;
use App\Notifications\PermissionChange;
use Exception;
use Illuminate\Http\Request;
use MarcinOrlowski\ResponseBuilder\ResponseBuilder;
use Symfony\Component\HttpFoundation\Response;
class AdminController extends Controller
{
public function admins(GetListRequest $request): Response
{
$validated = $request->validated();
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withData(Admin::getList($validated))
->withMessage(__('message.common.search.success'))
->build();
}
public function admin(Request $request): Response
{
$id = $request->post('id', 0);
$admin = Admin::find($id);
if ($admin) {
$admin->roles;
$roleIds = $admin->roles->mapWithKeys(function ($role, $key) {
return [$key => $role->id];
});
$admin->permissions;
$permissionIds = $admin->permissions->mapWithKeys(function ($permission, $key) {
return [$key => $permission->id];
});
$admin['roleIds'] = $roleIds;
$admin['permissionIds'] = $permissionIds;
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withData($admin)
->withMessage(__('message.common.search.success'))
->build();
}
return ResponseBuilder::asError(ApiCode::HTTP_BAD_REQUEST)
->withHttpCode(ApiCode::HTTP_BAD_REQUEST)
->withMessage(__('message.common.search.fail'))
->build();
}
public function create(CreateRequest $request): Response
{
$validated = $request->validated();
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withData(Admin::create($validated))
->withMessage(__('message.common.create.success'))
->build();
}
public function update(UpdateRequest $request): Response
{
$validated = $request->validated();
$resultData = Admin::updateSave($validated);
if ($resultData['result']) {
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withData($resultData['admin'])
->withMessage(__('message.common.update.success'))
->build();
}
return ResponseBuilder::asError(ApiCode::HTTP_BAD_REQUEST)
->withHttpCode(ApiCode::HTTP_BAD_REQUEST)
->withMessage(__('message.common.update.fail'))
->build();
}
public function delete(Request $request): Response
{
$id = $request->post('id', 0);
$admin = Admin::find($id);
if ($admin) {
$admin->delete();
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withMessage(__('message.common.delete.success'))
->build();
}
return ResponseBuilder::asError(ApiCode::HTTP_BAD_REQUEST)
->withHttpCode(ApiCode::HTTP_BAD_REQUEST)
->withMessage(__('message.common.delete.fail'))
->build();
}
public function updateSelf(UpdateSelfRequest $request): Response
{
$validated = $request->validated();
$validated['id'] = $request->user('admin')->id;
if ($validated['id'] === 8) {
return ResponseBuilder::asError(ApiCode::HTTP_BAD_REQUEST)
->withHttpCode(ApiCode::HTTP_BAD_REQUEST)
->withMessage('测试账号不能修改信息')
->build();
}
$resultData = Admin::updateSave($validated);
if ($resultData['result']) {
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withData($resultData['admin'])
->withMessage(__('message.common.update.success'))
->build();
}
return ResponseBuilder::asError(ApiCode::HTTP_BAD_REQUEST)
->withHttpCode(ApiCode::HTTP_BAD_REQUEST)
->withMessage(__('message.common.update.fail'))
->build();
}
public function syncPermissions(SyncPermissionsRequest $request): Response
{
$validated = $request->validated();
$admin = Admin::find($validated['id']);
$permissions = isset($validated['permissions']) ?
Permission::whereIn('id', $validated['permissions'])->get() :
[];
$admin->syncPermissions($permissions);
activity()
->useLog('admin')
->performedOn($admin)
->causedBy($request->user())
->withProperties($validated)
->log('update permissions');
$admin->notify(new PermissionChange($permissions));
return ResponseBuilder::asSuccess(ApiCode::HTTP_OK)
->withHttpCode(ApiCode::HTTP_OK)
->withData($admin)
->withMessage(__('message.common.update.success'))
->build();
}
}