Files
sam-api/app/Services/Authz/RoleService.php
kent 73d06e03b0 fix : 권한관리 기능 추가 (각 기능 확인 필요)
- 메뉴관리
- 역할관리
- 부서관리
- 메뉴, 부서, 역할, 유저 - 권한 연동
2025-08-16 03:25:50 +09:00

142 lines
4.1 KiB
PHP

<?php
namespace App\Services\Authz;
use Illuminate\Validation\Rule;
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\DB;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;
use App\Helpers\ApiResponse;
class RoleService
{
protected static string $guard = 'api';
/** 목록 */
public static function index(array $params = [])
{
$tenantId = (int) app('tenant_id');
$page = (int)($params['page'] ?? 1);
$size = (int)($params['size'] ?? 10);
$q = trim((string)($params['q'] ?? ''));
$query = Role::query()
->where('tenant_id', $tenantId)
->where('guard_name', self::$guard);
if ($q !== '') {
$query->where(function($w) use ($q) {
$w->where('name', 'like', "%{$q}%")
->orWhere('description', 'like', "%{$q}%");
});
}
$list = $query->orderBy('id','desc')
->paginate($size, ['*'], 'page', $page);
return ApiResponse::response('result', $list);
}
/** 생성 */
public static function store(array $params = [])
{
$tenantId = (int) app('tenant_id');
$v = Validator::make($params, [
'name' => [
'required','string','max:100',
Rule::unique('roles','name')->where(fn($q)=>$q
->where('tenant_id',$tenantId)
->where('guard_name', self::$guard)),
],
'description' => 'nullable|string|max:255',
]);
if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422);
}
app(PermissionRegistrar::class)->setPermissionsTeamId($tenantId);
$role = Role::create([
'tenant_id' => $tenantId,
'guard_name' => self::$guard,
'name' => $v->validated()['name'],
'description'=> $params['description'] ?? null,
]);
return ApiResponse::response('result', $role);
}
/** 단건 */
public static function show(int $id)
{
$tenantId = (int) app('tenant_id');
$role = Role::where('tenant_id',$tenantId)
->where('guard_name', self::$guard)
->find($id);
if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404);
}
return ApiResponse::response('result', $role);
}
/** 수정 */
public static function update(int $id, array $params = [])
{
$tenantId = (int) app('tenant_id');
$role = Role::where('tenant_id',$tenantId)
->where('guard_name', self::$guard)
->find($id);
if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404);
}
$v = Validator::make($params, [
'name' => [
'sometimes','string','max:100',
Rule::unique('roles','name')
->where(fn($q)=>$q->where('tenant_id',$tenantId)->where('guard_name', self::$guard))
->ignore($role->id),
],
'description' => 'sometimes|nullable|string|max:255',
]);
if ($v->fails()) {
return ApiResponse::error($v->errors()->first(), 422);
}
$payload = $v->validated();
$role->fill($payload)->save();
return ApiResponse::response('result', $role);
}
/** 삭제 (현재는 하드삭제) */
public static function destroy(int $id)
{
$tenantId = (int) app('tenant_id');
$role = Role::where('tenant_id',$tenantId)
->where('guard_name', self::$guard)
->find($id);
if (!$role) {
return ApiResponse::error('역할을 찾을 수 없습니다.', 404);
}
DB::transaction(function () use ($role) {
// 연관 피벗은 스파티가 onDelete cascade 하므로 기본 동작으로 OK
$role->delete(); // ※ 기본 Spatie Role은 SoftDeletes 미사용 → 하드 삭제
});
return ApiResponse::response('success');
}
}