- api.php를 13개 도메인별 파일로 분리 (1,479줄 → 61줄) - ApiVersionMiddleware 생성 (헤더/쿼리 기반 버전 선택) - v2 요청 시 v2 없으면 v1으로 자동 폴백 - 지원 헤더: Accept-Version, X-API-Version, api_version 쿼리 분리된 도메인: auth, admin, users, tenants, hr, finance, sales, inventory, production, design, files, boards, common Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
76 lines
5.0 KiB
PHP
76 lines
5.0 KiB
PHP
<?php
|
|
|
|
/**
|
|
* 사용자 API 라우트 (v1)
|
|
*
|
|
* - 사용자 관리
|
|
* - 사용자 초대
|
|
* - 알림 설정
|
|
* - 계정 관리 (탈퇴, 약관동의)
|
|
* - 프로필 관리
|
|
*/
|
|
|
|
use App\Http\Controllers\Api\V1\AccountController;
|
|
use App\Http\Controllers\Api\V1\NotificationSettingController;
|
|
use App\Http\Controllers\Api\V1\TenantUserProfileController;
|
|
use App\Http\Controllers\Api\V1\UserController;
|
|
use App\Http\Controllers\Api\V1\UserInvitationController;
|
|
use App\Http\Controllers\Api\V1\UserRoleController;
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
// Member API
|
|
Route::prefix('users')->group(function () {
|
|
Route::get('index', [UserController::class, 'index'])->name('v1.users.index'); // 회원 목록 조회
|
|
Route::get('show/{user_no}', [UserController::class, 'show'])->name('v1.users.show'); // 회원 상세 조회
|
|
|
|
Route::get('me', [UserController::class, 'me'])->name('v1.users.users.me'); // 내 정보 조회
|
|
Route::put('me', [UserController::class, 'meUpdate'])->name('v1.users.me.update'); // 내 정보 수정
|
|
Route::put('me/password', [UserController::class, 'changePassword'])->name('v1.users.me.password'); // 비밀번호 변겅
|
|
|
|
Route::get('me/tenants', [UserController::class, 'tenants'])->name('v1.users.me.tenants.index'); // 내 테넌트 목록
|
|
Route::patch('me/tenants/switch', [UserController::class, 'switchTenant'])->name('v1.users.me.tenants.switch'); // 활성 테넌트 전환
|
|
|
|
// 사용자 초대 API
|
|
Route::get('invitations', [UserInvitationController::class, 'index'])->name('v1.users.invitations.index'); // 초대 목록
|
|
Route::post('invite', [UserInvitationController::class, 'invite'])->name('v1.users.invite'); // 초대 발송
|
|
Route::post('invitations/{token}/accept', [UserInvitationController::class, 'accept'])->name('v1.users.invitations.accept'); // 초대 수락
|
|
Route::delete('invitations/{id}', [UserInvitationController::class, 'cancel'])->whereNumber('id')->name('v1.users.invitations.cancel'); // 초대 취소
|
|
Route::post('invitations/{id}/resend', [UserInvitationController::class, 'resend'])->whereNumber('id')->name('v1.users.invitations.resend'); // 초대 재발송
|
|
|
|
// 알림 설정 API (auth:sanctum 필수)
|
|
Route::middleware('auth:sanctum')->group(function () {
|
|
Route::get('me/notification-settings', [NotificationSettingController::class, 'index'])->name('v1.users.me.notification-settings.index'); // 알림 설정 조회
|
|
Route::put('me/notification-settings', [NotificationSettingController::class, 'update'])->name('v1.users.me.notification-settings.update'); // 알림 설정 수정
|
|
Route::put('me/notification-settings/bulk', [NotificationSettingController::class, 'bulkUpdate'])->name('v1.users.me.notification-settings.bulk'); // 알림 일괄 설정
|
|
});
|
|
});
|
|
|
|
// User Role API
|
|
Route::prefix('users/{id}/roles')->group(function () {
|
|
Route::get('/', [UserRoleController::class, 'index'])->name('v1.users.roles.index'); // list
|
|
Route::post('/', [UserRoleController::class, 'grant'])->name('v1.users.roles.grant'); // grant
|
|
Route::delete('/', [UserRoleController::class, 'revoke'])->name('v1.users.roles.revoke'); // revoke
|
|
Route::put('/sync', [UserRoleController::class, 'sync'])->name('v1.users.roles.sync'); // sync
|
|
});
|
|
|
|
// Account API (계정 관리 - 탈퇴, 사용중지, 약관동의)
|
|
Route::prefix('account')->middleware('auth:sanctum')->group(function () {
|
|
Route::post('withdraw', [AccountController::class, 'withdraw'])->name('v1.account.withdraw'); // 회원 탈퇴
|
|
Route::post('suspend', [AccountController::class, 'suspend'])->name('v1.account.suspend'); // 사용 중지 (테넌트)
|
|
Route::get('agreements', [AccountController::class, 'getAgreements'])->name('v1.account.agreements.index'); // 약관 동의 조회
|
|
Route::put('agreements', [AccountController::class, 'updateAgreements'])->name('v1.account.agreements.update'); // 약관 동의 수정
|
|
});
|
|
|
|
// 회원 프로필(테넌트 기준)
|
|
Route::prefix('profiles')->group(function () {
|
|
Route::get('', [TenantUserProfileController::class, 'index'])->name('v1.profiles.index'); // 프로필 목록(테넌트 기준)
|
|
// /me 라우트는 /{userId} 와일드카드보다 먼저 정의해야 함
|
|
// auth:sanctum 미들웨어로 Bearer 토큰 인증 필요
|
|
Route::middleware('auth:sanctum')->group(function () {
|
|
Route::get('/me', [TenantUserProfileController::class, 'me'])->name('v1.profiles.me'); // 내 프로필 조회
|
|
Route::patch('/me', [TenantUserProfileController::class, 'updateMe'])->name('v1.profiles.me.update'); // 내 프로필 수정
|
|
});
|
|
Route::get('/{userId}', [TenantUserProfileController::class, 'show'])->name('v1.profiles.show'); // 특정 사용자 프로필 조회
|
|
Route::patch('/{userId}', [TenantUserProfileController::class, 'update'])->name('v1.profiles.update'); // 특정 사용자 프로필 수정(관리자)
|
|
});
|