# Superport API Schema Documentation > **최종 업데이트**: 2025-08-13 > **API 버전**: v1 > **Base URL**: `http://43.201.34.104:8080/api/v1` ## 📋 목차 - [인증 시스템](#인증-시스템) - [API 엔드포인트 목록](#api-엔드포인트-목록) - [Request/Response 형식](#requestresponse-형식) - [페이지네이션](#페이지네이션) - [에러 처리](#에러-처리) - [상태 코드](#상태-코드) --- ## 🔐 인증 시스템 ### JWT Token 기반 인증 - **토큰 타입**: Bearer Token - **만료 시간**: 24시간 - **권한 레벨**: Admin, Manager, Staff ```http Authorization: Bearer ``` ### 권한 매트릭스 | 역할 | 생성 | 조회 | 수정 | 삭제 | |------|------|------|------|------| | **Admin** | ✅ | ✅ | ✅ | ✅ | | **Manager** | ✅ | ✅ | ✅ | ✅ | | **Staff** | ⚠️ | ✅ | ⚠️ | ❌ | > ⚠️ = 제한적 권한 (일부 엔드포인트만) --- ## 📡 API 엔드포인트 목록 ### 🔑 Authentication (`/auth`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `POST` | `/auth/login` | 공개 | 사용자 로그인 | | `POST` | `/auth/logout` | 공개 | 사용자 로그아웃 | | `POST` | `/auth/refresh` | 공개 | 토큰 갱신 | | `GET` | `/me` | 인증필요 | 현재 사용자 정보 | ### 🏢 Companies (`/companies`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/companies` | 인증필요 | 회사 목록 조회 (페이지네이션) | | `POST` | `/companies` | Admin/Manager | 회사 생성 | | `GET` | `/companies/search` | 인증필요 | 회사 검색 | | `GET` | `/companies/names` | 인증필요 | 회사명 목록 | | `GET` | `/companies/branches` | 인증필요 | 지점 정보 목록 | | `GET` | `/companies/{id}` | 인증필요 | 특정 회사 조회 | | `PUT` | `/companies/{id}` | Admin/Manager | 회사 정보 수정 | | `DELETE` | `/companies/{id}` | Admin/Manager | 회사 삭제 (소프트 딜리트) | | `PATCH` | `/companies/{id}/status` | Admin/Manager | 회사 활성화 상태 변경 | | `DELETE` | `/companies/{id}/branches/{branch_id}` | Admin/Manager | 지점 삭제 | ### 👥 Users (`/users`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/users` | Admin/Manager | 사용자 목록 조회 | | `POST` | `/users` | Admin | 사용자 생성 | | `GET` | `/users/{id}` | Admin/Manager | 특정 사용자 조회 | | `PUT` | `/users/{id}` | Admin | 사용자 정보 수정 | | `DELETE` | `/users/{id}` | Admin | 사용자 삭제 | ### 🔧 Equipment (`/equipment`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/equipment` | 인증필요 | 장비 목록 조회 (페이지네이션) | | `POST` | `/equipment` | Admin/Manager | 장비 생성 | | `GET` | `/equipment/{id}` | 인증필요 | 특정 장비 조회 | | `PUT` | `/equipment/{id}` | Admin/Manager | 장비 정보 수정 | | `DELETE` | `/equipment/{id}` | Admin/Manager | 장비 삭제 (소프트 딜리트) | | `PATCH` | `/equipment/{id}/status` | 인증필요 | 장비 상태 변경 | | `POST` | `/equipment/{id}/history` | 인증필요 | 장비 이력 추가 | | `GET` | `/equipment/{id}/history` | 인증필요 | 장비 이력 조회 | ### 📄 Licenses (`/licenses`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/licenses` | 인증필요 | 라이선스 목록 조회 | | `POST` | `/licenses` | Admin/Manager | 라이선스 생성 | | `GET` | `/licenses/{id}` | 인증필요 | 특정 라이선스 조회 | | `PUT` | `/licenses/{id}` | Admin/Manager | 라이선스 수정 | | `DELETE` | `/licenses/{id}` | Admin/Manager | 라이선스 삭제 | ### 🏪 Warehouse Locations (`/warehouse-locations`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/warehouse-locations` | 인증필요 | 창고 위치 목록 조회 | | `POST` | `/warehouse-locations` | Admin/Manager | 창고 위치 생성 | | `GET` | `/warehouse-locations/{id}` | 인증필요 | 특정 창고 위치 조회 | | `PUT` | `/warehouse-locations/{id}` | Admin/Manager | 창고 위치 수정 | | `DELETE` | `/warehouse-locations/{id}` | Admin/Manager | 창고 위치 삭제 | ### 📍 Addresses (`/addresses`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/addresses` | 인증필요 | 주소 목록 조회 | | `POST` | `/addresses` | Admin/Manager | 주소 생성 | | `GET` | `/addresses/{id}` | 인증필요 | 특정 주소 조회 | | `PUT` | `/addresses/{id}` | Admin/Manager | 주소 수정 | | `DELETE` | `/addresses/{id}` | Admin/Manager | 주소 삭제 | ### 📊 Overview (`/overview`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/overview/stats` | 인증필요 | 대시보드 통계 | | `GET` | `/overview/recent-activities` | 인증필요 | 최근 활동 내역 | | `GET` | `/overview/equipment-status` | Staff 이상 | 장비 상태 분포 | | `GET` | `/overview/license-expiry` | Manager 이상 | 라이선스 만료 요약 | ### 🔍 Lookups (`/lookups`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/lookups` | 인증필요 | 전체 조회 데이터 | | `GET` | `/lookups/type` | 인증필요 | 타입별 조회 데이터 | ### ❤️ Health (`/health`) | Method | Endpoint | 권한 | 설명 | |--------|----------|------|------| | `GET` | `/health` | 공개 | 서버 상태 체크 | --- ## 📄 Request/Response 형식 ### 표준 응답 형식 ```json { "status": "success", "message": "Operation completed successfully", "data": { /* 실제 데이터 */ }, "meta": { /* 메타데이터 (페이지네이션 등) */ } } ``` ### 주요 DTO 구조 #### 🏢 Company DTO **CreateCompanyRequest**: ```json { "name": "회사명 (필수)", "address": "주소 (선택)", "contact_name": "담당자명 (선택)", "contact_position": "담당자 직책 (선택)", "contact_phone": "연락처 (선택)", "contact_email": "이메일 (선택)", "company_types": ["타입1", "타입2"], "remark": "비고 (선택)", "is_partner": false, "is_customer": true } ``` **CompanyResponse**: ```json { "id": 1, "name": "주식회사 테스트", "address": "서울시 강남구", "contact_name": "홍길동", "contact_position": "팀장", "contact_phone": "010-1234-5678", "contact_email": "test@company.com", "company_types": ["고객사", "파트너사"], "remark": "중요 거래처", "is_active": true, "is_partner": false, "is_customer": true, "created_at": "2025-08-13T10:00:00Z", "updated_at": "2025-08-13T10:00:00Z" } ``` #### 🔧 Equipment DTO **CreateEquipmentRequest**: ```json { "equipment_number": "EQ-001 (필수)", "category1": "카테고리1 (선택)", "category2": "카테고리2 (선택)", "category3": "카테고리3 (선택)", "manufacturer": "제조사 (필수)", "model_name": "모델명 (선택)", "serial_number": "시리얼번호 (선택)", "purchase_date": "2025-08-13", "purchase_price": "1000000.00", "remark": "비고 (선택)" } ``` **EquipmentResponse**: ```json { "id": 1, "equipment_number": "EQ-001", "category1": "IT장비", "category2": "서버", "category3": "웹서버", "manufacturer": "삼성전자", "model_name": "Galaxy Server Pro", "serial_number": "SN123456789", "barcode": "BC123456789", "purchase_date": "2025-08-13", "purchase_price": "1000000.00", "status": "available", "current_company_id": 1, "current_branch_id": null, "warehouse_location_id": 1, "last_inspection_date": "2025-08-01", "next_inspection_date": "2026-08-01", "remark": "정상 작동 중", "created_at": "2025-08-13T10:00:00Z", "updated_at": "2025-08-13T10:00:00Z" } ``` #### 🔑 Authentication DTO **LoginRequest**: ```json { "username": "admin", "password": "password123" } ``` **LoginResponse**: ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "token_type": "Bearer", "expires_in": 86400, "user": { "id": 1, "username": "admin", "name": "관리자", "email": "admin@superport.kr", "role": "admin" } } ``` --- ## 📄 페이지네이션 ### 요청 파라미터 ```http GET /api/v1/companies?page=1&per_page=20&is_active=true ``` ### 응답 형식 ```json { "status": "success", "data": [ /* 데이터 배열 */ ], "meta": { "pagination": { "current_page": 1, "per_page": 20, "total": 150, "total_pages": 8, "has_next": true, "has_prev": false } } } ``` ### 소프트 딜리트 필터링 - `is_active=true`: 활성 데이터만 - `is_active=false`: 삭제된 데이터만 - `is_active` 미지정: 모든 데이터 --- ## ⚠️ 에러 처리 ### 에러 응답 형식 ```json { "status": "error", "message": "에러 메시지", "error": { "code": "VALIDATION_ERROR", "details": [ { "field": "name", "message": "Company name is required" } ] } } ``` ### 에러 코드 목록 | 코드 | 설명 | |------|------| | `VALIDATION_ERROR` | 입력 값 검증 실패 | | `UNAUTHORIZED` | 인증 실패 | | `FORBIDDEN` | 권한 부족 | | `NOT_FOUND` | 리소스 없음 | | `INTERNAL_ERROR` | 서버 내부 오류 | | `DATABASE_ERROR` | 데이터베이스 오류 | --- ## 📊 상태 코드 | HTTP 코드 | 상태 | 설명 | |-----------|------|------| | `200` | OK | 성공 | | `201` | Created | 생성 성공 | | `400` | Bad Request | 잘못된 요청 | | `401` | Unauthorized | 인증 실패 | | `403` | Forbidden | 권한 부족 | | `404` | Not Found | 리소스 없음 | | `422` | Unprocessable Entity | 입력 값 검증 실패 | | `500` | Internal Server Error | 서버 오류 | --- ## 🔍 Enum 값 정의 ### EquipmentStatus - `available`: 사용 가능 - `inuse`: 사용 중 - `maintenance`: 점검 중 - `disposed`: 폐기 ### UserRole - `admin`: 관리자 - `manager`: 매니저 - `staff`: 일반 직원 --- ## 🚀 특별 기능 ### 1. 소프트 딜리트 시스템 모든 주요 엔티티에서 `is_active` 필드를 통한 논리적 삭제 지원 ### 2. 권한 기반 접근 제어 JWT 토큰의 `role` 클레임을 통한 세밀한 권한 제어 ### 3. 페이지네이션 최적화 대량 데이터 처리를 위한 효율적인 페이지네이션 ### 4. 실시간 통계 대시보드용 실시간 통계 API 제공 --- **문서 버전**: 1.0 **최종 검토**: 2025-08-13 **담당자**: Backend Development Team