Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

DKU-Albamate/backend

Repository files navigation

ALBAMATE Backend Server

알바메이트 백엔드 서버 - Clova OCR + Gemini 2.5 Flash Lite 연동

📋 주요 기능

  • 사용자 인증 및 관리 (Supabase Auth)
  • 그룹 생성 및 관리
  • 할일 관리
  • Clova OCR + Gemini 2.5 Flash Lite를 통한 스케줄 자동 인식
  • 일정 관리 및 저장

AI OCR 연동

환경 변수 설정

Render에 아래와 같이 설정

# Clova OCR 설정
CLOVA_URL=https://your-clova-ocr-endpoint
CLOVA_SECRET=your_clova_secret_key
# Gemini 2.5 Flash Lite 설정
GEMINI_API_KEY=your_gemini_api_key
# Supabase 설정
SUPABASE_URL=your_supabase_url
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key

OCR API 엔드포인트

1. 스케줄 이미지 업로드 (기본 - Gemini 자동 선택)

POST /ocr/schedule
Content-Type: multipart/form-data
파라미터:
- photo: 이미지 파일 (jpg, png)
- user_uid: 사용자 UID
- display_name: 찾을 이름 (선택사항)
- use_gemini: Gemini 사용 여부 (선택, 기본값: true)
응답:
{
 "message": "일정이 성공적으로 저장되었습니다",
 "inserted": 3,
 "schedules": [
 {
 "name": "김지성",
 "position": "포지션1",
 "date": "2025-07-15",
 "start": "09:00",
 "end": "17:00"
 }
 ],
 "analysis_method": "gemini"
}

2. Gemini 전용 OCR 처리

POST /ocr/schedule/gemini
Content-Type: multipart/form-data
파라미터:
- photo: 이미지 파일
- user_uid: 사용자 UID
- display_name: 찾을 이름 (선택사항)

3. 기존 방식 OCR 처리

POST /ocr/schedule/traditional
Content-Type: multipart/form-data
파라미터:
- photo: 이미지 파일
- user_uid: 사용자 UID
- display_name: 찾을 이름 (선택사항)

4. OCR 서비스 상태 확인

GET /ocr/health
응답:
{
 "status": "healthy",
 "clova": "connected",
 "gemini": "configured",
 "timestamp": "2025-01-20T10:30:00.000Z"
}

AI 분석 방식 비교

🤖 Gemini 2.5 Flash Lite (권장)

  • 장점:
    • 더 정확한 텍스트 인식
    • 복잡한 표 구조 이해
    • 다양한 날짜/시간 형식 지원
    • 컨텍스트 기반 분석
  • 사용법: use_gemini=true 또는 /ocr/schedule/gemini

📊 기존 방식

  • 장점:
    • 빠른 처리 속도
    • API 키 불필요
    • 단순한 표 구조에 효과적
  • 사용법: use_gemini=false 또는 /ocr/schedule/traditional

배포

Docker 배포

# 이미지 빌드
docker build -t albamate-backend .
# 컨테이너 실행
docker run -p 3000:3000 \
 -e CLOVA_URL=your_clova_url \
 -e CLOVA_SECRET=your_clova_secret \
 -e GEMINI_API_KEY=your_gemini_key \
 -e SUPABASE_URL=your_supabase_url \
 -e SUPABASE_SERVICE_ROLE_KEY=your_supabase_key \
 albamate-backend

Render 배포

  1. GitHub 저장소 연결
  2. 환경 변수 설정 (Gemini API 키 포함)
  3. 빌드 명령어: npm install
  4. 시작 명령어: npm start

개발

OCR 헬스체크 테스트

curl http://localhost:3000/ocr/health

Gemini OCR 테스트

curl -X POST http://localhost:3000/ocr/schedule/gemini
-F "photo=@schedule.jpg"
-F "user_uid=test_user"
-F "display_name=김지성"


## Substitute (대타) 기능
대타 요청(대타 알바 찾기) 관련 기능은 `substitute` 네임스페이스로 구성되어 있습니다. 인증 미들웨어는 주석 처리되어 있으며, 실제 운영에서는 `authenticate`를 활성화하여 사용자/관리자 권한을 검증하세요.
파일 위치
- 라우트: `routes/substitute.routes.js`
- 컨트롤러: `controllers/substitute.controller.js`
- 서비스: `services/substitute.service.js`
- 유효성 검사: `validators/substitute.validator.js`
주요 엔드포인트
- POST `/api/substitute/requests` : 새 대타 요청 생성
 - 요청 바디 예시 (JSON or form):
 ```json
 {
 "group_id": "group_123",
 "requester_name": "홍길동",
 "shift_date": "2025-07-15",
 "start_time": "09:00:00",
 "end_time": "17:00:00",
 "reason": "개인사정으로 교대 필요"
 }
 ```
 - 서버는 먼저 `checkScheduleOverlap`로 요청자가 해당 날짜에 확정된 근무로 배정되어 있는지 확인합니다. 배정되어 있지 않으면 403을 반환합니다.
- GET `/api/substitute/requests?group_id=<GROUP_ID>` : 특정 그룹의 모든 대타 요청 조회 (상태 필터 없음)
- GET `/api/substitute/requests/:request_id` : 개별 대타 요청 상세 조회
- PUT `/api/substitute/requests/:request_id/accept` : 알바생이 대타 요청을 수락 → `substitute_name` 기록, 상태를 `IN_REVIEW`로 변경
 - 바디 예시: `{ "substitute_name": "김아르바" }`
- PUT `/api/substitute/requests/:request_id/manage` : 사장님이 최종 승인(`APPROVED`) 또는 거절(`REJECTED`) 처리
 - 바디 예시: `{ "final_status": "APPROVED" }`
 - `APPROVED`일 경우 `services/substitute.service.js`의 `updateSchedulePost`가 호출되어 `schedule_posts`의 `assignments`를 갱신합니다 (요청자 제거, 대타 추가).
- DELETE `/api/substitute/requests/:request_id` : 대타 요청 삭제
유효성 규칙 (요약, `validators/substitute.validator.js` 참조)
- `group_id`: 문자열, 필수
- `requester_name`: 문자열, 필수
- `shift_date`: ISO 날짜(예: `YYYY-MM-DD`), 필수
- `start_time`, `end_time`: `HH:MM:SS` 형식(정규식 검증), 필수
- `reason`: 문자열, 최소 5자
서비스 동작 요약
- `createSubstituteRequest`는 `substitute_requests` 테이블에 요청을 저장합니다. (DB 필드: `group_id`, `requester_name`, `shift_date`, `start_time`, `end_time`, `reason`, `status` 등)
- `checkScheduleOverlap`는 `schedule_posts` 테이블에서 해당 월의 `confirmed` 포스트를 조회해 `assignments` JSONB에서 요청자가 실제로 배정되어 있는지 확인합니다.
- `acceptSubstituteRequest`는 대타가 수락하면 요청의 `substitute_name`을 기록하고 `status`를 `IN_REVIEW`로 변경합니다.
- 사장님이 승인(`manageSubstituteRequest` → `APPROVED`)하면 `updateSchedulePost`가 호출되어 실제 `schedule_posts.assignments`를 수정(요청자 제거 → 대타 추가)합니다.
- DB 업데이트(특히 `updateSchedulePost`)는 트랜잭션 고려가 필요합니다. 동시성 이슈가 발생할 수 있으니 테스트 후 운영 적용 권장합니다.

About

DKU-Albamate Backend-server

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 3

AltStyle によって変換されたページ (->オリジナル) /