- MemberService::getUserInfoForLogin(): 사용자 역할 조회 로직 추가
- ApiController::login(): 응답에 roles 포함
- AuthApi (Swagger): roles 응답 스키마 추가
- 로그인 시 해당 회원의 역할 목록 반환 (id, name, description)
fix: 회원가입 시 UserTenant 생성 누락으로 인한 로그인 실패 수정
근본 원인:
- RegisterService는 TenantUserProfile만 생성
- MemberService::getUserInfoForLogin()은 UserTenant 조회
- 회원가입 직후 로그인 시 테넌트 조회 실패 (userTenants->isEmpty() = true)
해결 방안:
- RegisterService에 UserTenant::create() 추가
- TenantUserProfile: 프로필 정보 (부서, 직급 등)
- UserTenant: 접근 권한 관리 (is_active, is_default, joined_at)
영향도:
- 신규 사용자: 로그인 가능하게 수정
- 기존 사용자: 영향 없음 (user_tenants 데이터 이미 존재)
fix: 로그인 시 테넌트 없는 경우 roles 누락 오류 수정
- MemberService::getUserInfoForLogin(): 테넌트가 없는 경우에도 roles 빈 배열 반환
- Undefined array key 'roles' 에러 해결
MemberService.php 권한 조회 로직 수정 - 역할 기반 권한 지원
[문제]
- 회원가입 후 로그인 시 메뉴 리스트가 표시되지 않음
- RegisterService에서 역할에 권한 할당(role_has_permissions)하고
사용자에게 역할 부여(model_has_roles)
- 하지만 MemberService는 model_has_permissions(직접 사용자 권한)만 조회
[원인]
- Spatie Permission 아키텍처 불일치
- 권한이 역할에 저장되었으나 직접 사용자 권한 테이블만 조회
[해결]
- model_has_roles → role_has_permissions → permissions 조인 쿼리로 변경
- UNION으로 직접 권한(model_has_permissions)도 지원하는 하이브리드 방식
- 역할 기반 권한과 직접 권한 모두 조회 가능
[변경 파일]
- app/Services/MemberService.php (getUserInfoForLogin 메서드, 239-259줄)
- AuthService: 토큰 발급/갱신 통합 관리
- RefreshController: POST /api/v1/refresh 엔드포인트 추가
- 액세스 토큰 2시간, 리프레시 토큰 7일 (.env 설정)
- TOKEN_EXPIRED 에러 코드로 프론트엔드 자동 리프레시 지원
- 리프레시 토큰 일회성 사용 (보안 강화)
- Swagger 문서 Auth 태그로 통합
- AuthApi.php 응답 형식 실제 코드와 일치화
- logout: {success, message, data} → {message}
- debug-apikey: description 및 응답 형식 추가
- login API 검증 완료
- 요청/응답 스키마와 실제 코드 일치 확인
- user, tenant, menus 구조 정확성 검증
- signup API 중복 확인
- AuthApi.php와 RegisterApi.php 동일 엔드포인트
- RegisterApi.php가 더 상세 (테넌트 생성 포함)
- SWAGGER_AUDIT.md 업데이트
- Phase 2 완료 상태로 변경
- 발견 이슈 4건 추가 (모두 해결)
- MemberService::getUserInfoForLogin() 메서드 추가
- 사용자 기본 정보 (id, user_id, name, email, phone)
- 활성 테넌트 정보 (is_default 우선 → is_active 차순)
- 테넌트 없는 경우 null 반환
- 추가 테넌트 목록 (other_tenants 배열)
- 권한 기반 메뉴 필터링 (menu:{id}.view)
- 권한 체크 3단계
- 기본 Role 권한 (model_has_permissions)
- Override 권한 (permission_overrides, 시간 제약)
- 우선순위: deny(-1) > allow(1) > base permission
- ApiController::login() 응답 구조 변경
- 기존: {message, user_token}
- 개선: {message, user_token, user, tenant, menus}
- Swagger 문서 업데이트 (AuthApi.php)
- 테넌트 있는 경우 응답 스키마
- 테넌트 없는 경우 응답 스키마 (null)
- 에러 케이스 추가 (400, 401, 404)
- CommonComponents.php: ApiResponse/ErrorResponse 글로벌 스키마 수정
- property="status" → property="success" (boolean)
- property="data" → property="error" (object with code/details)
- AuthApi, AdminApi, UserApi: 개별 응답 스키마 수정
- signup(): allOf 구조로 변경
- index(): Laravel LengthAwarePaginator 구조 적용
- updateMe(): Member schema 참조로 변경
- PermissionApi, MaterialApi, DepartmentApi: 로컬 스키마 재정의 제거
- ClientGroupService: 삭제된 데이터 자동 복원 기능 구현
- store(): withTrashed()로 삭제된 데이터 확인 후 restore()
- update(): 삭제된 코드 존재 시 에러 반환
- ClientApi: client_group_id 필드 추가
- Client, ClientCreateRequest, ClientUpdateRequest 스키마에 추가
- lang/ko/error.php, lang/en/error.php: 에러 메시지 추가
- duplicate_code, has_clients, code_exists_in_deleted
- Swagger 문서 재생성 및 검증 완료