2025-08-16 03:25:06 +09:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Services\Authz;
|
|
|
|
|
|
|
|
|
|
use Illuminate\Support\Facades\DB;
|
2025-08-16 04:16:34 +09:00
|
|
|
use Illuminate\Support\Facades\Validator;
|
|
|
|
|
use Illuminate\Validation\Rule;
|
2025-08-16 03:25:06 +09:00
|
|
|
use Spatie\Permission\Models\Role;
|
|
|
|
|
use Spatie\Permission\PermissionRegistrar;
|
|
|
|
|
|
|
|
|
|
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 !== '') {
|
2025-08-16 04:16:34 +09:00
|
|
|
$query->where(function ($w) use ($q) {
|
2025-08-16 03:25:06 +09:00
|
|
|
$w->where('name', 'like', "%{$q}%")
|
|
|
|
|
->orWhere('description', 'like', "%{$q}%");
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
2025-08-16 04:16:34 +09:00
|
|
|
$list = $query->orderByDesc('id')
|
2025-08-16 03:25:06 +09:00
|
|
|
->paginate($size, ['*'], 'page', $page);
|
|
|
|
|
|
2025-08-19 12:41:17 +09:00
|
|
|
return $list;
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 생성 */
|
|
|
|
|
public static function store(array $params = [])
|
|
|
|
|
{
|
|
|
|
|
$tenantId = (int) app('tenant_id');
|
|
|
|
|
|
|
|
|
|
$v = Validator::make($params, [
|
2025-08-16 04:16:34 +09:00
|
|
|
'name' => [
|
|
|
|
|
'required', 'string', 'max:100',
|
|
|
|
|
Rule::unique('roles', 'name')->where(fn($q) => $q
|
|
|
|
|
->where('tenant_id', $tenantId)
|
2025-08-16 03:25:06 +09:00
|
|
|
->where('guard_name', self::$guard)),
|
|
|
|
|
],
|
|
|
|
|
'description' => 'nullable|string|max:255',
|
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
if ($v->fails()) {
|
2025-08-19 12:41:17 +09:00
|
|
|
return ['error' => $v->errors()->first(), 'code' => 422];
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
2025-08-16 04:16:34 +09:00
|
|
|
// Spatie 팀(테넌트) 컨텍스트
|
2025-08-16 03:25:06 +09:00
|
|
|
app(PermissionRegistrar::class)->setPermissionsTeamId($tenantId);
|
|
|
|
|
|
|
|
|
|
$role = Role::create([
|
2025-08-16 04:16:34 +09:00
|
|
|
'tenant_id' => $tenantId,
|
|
|
|
|
'guard_name' => self::$guard,
|
|
|
|
|
'name' => $v->validated()['name'],
|
|
|
|
|
'description' => $params['description'] ?? null,
|
2025-08-16 03:25:06 +09:00
|
|
|
]);
|
|
|
|
|
|
2025-08-19 12:41:17 +09:00
|
|
|
return $role;
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 단건 */
|
|
|
|
|
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) {
|
2025-08-19 12:41:17 +09:00
|
|
|
return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
2025-08-19 12:41:17 +09:00
|
|
|
return $role;
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/** 수정 */
|
|
|
|
|
public static function update(int $id, array $params = [])
|
|
|
|
|
{
|
|
|
|
|
$tenantId = (int) app('tenant_id');
|
|
|
|
|
|
2025-08-16 04:16:34 +09:00
|
|
|
$role = Role::where('tenant_id', $tenantId)
|
2025-08-16 03:25:06 +09:00
|
|
|
->where('guard_name', self::$guard)
|
|
|
|
|
->find($id);
|
|
|
|
|
|
|
|
|
|
if (!$role) {
|
2025-08-19 12:41:17 +09:00
|
|
|
return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$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()) {
|
2025-08-19 12:41:17 +09:00
|
|
|
return ['error' => $v->errors()->first(), 'code' => 422];
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
2025-08-16 04:16:34 +09:00
|
|
|
$role->fill($v->validated())->save();
|
2025-08-16 03:25:06 +09:00
|
|
|
|
2025-08-19 12:41:17 +09:00
|
|
|
return $role->fresh();
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
2025-08-16 04:16:34 +09:00
|
|
|
/** 삭제 (하드삭제) */
|
2025-08-16 03:25:06 +09:00
|
|
|
public static function destroy(int $id)
|
|
|
|
|
{
|
|
|
|
|
$tenantId = (int) app('tenant_id');
|
|
|
|
|
|
2025-08-16 04:16:34 +09:00
|
|
|
$role = Role::where('tenant_id', $tenantId)
|
2025-08-16 03:25:06 +09:00
|
|
|
->where('guard_name', self::$guard)
|
|
|
|
|
->find($id);
|
|
|
|
|
|
|
|
|
|
if (!$role) {
|
2025-08-19 12:41:17 +09:00
|
|
|
return ['error' => '역할을 찾을 수 없습니다.', 'code' => 404];
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DB::transaction(function () use ($role) {
|
2025-08-16 04:16:34 +09:00
|
|
|
$role->delete(); // Spatie Role 기본: soft delete 없음
|
2025-08-16 03:25:06 +09:00
|
|
|
});
|
|
|
|
|
|
2025-08-19 12:41:17 +09:00
|
|
|
return 'success';
|
2025-08-16 03:25:06 +09:00
|
|
|
}
|
|
|
|
|
}
|