Skip to content

feat(events): GET /api/events 응답에 event_type/reason 노출 + status 값 정규화 - #23

Merged
CHOSOOGEUN merged 1 commit into
masterfrom
feature/조수근-event-type-reason
May 11, 2026

Hidden character warning

The head ref may contain hidden characters: "feature/\uc870\uc218\uadfc-event-type-reason"
Merged

feat(events): GET /api/events 응답에 event_type/reason 노출 + status 값 정규화#23
CHOSOOGEUN merged 1 commit into
masterfrom
feature/조수근-event-type-reason

Conversation

@CHOSOOGEUN

Copy link
Copy Markdown
Owner

요약

팀원 요청 — `GET /api/events/` 응답에 `event_type` (항상 포함) 과 `reason` (status='false_alarm' 일 때만) 두 필드 받고 싶음.

확인 중 추가 발견:

  • `event_type` 은 모델에는 있는데 `EventResponse` 스키마에서 빠져있어서 직렬화에 안 실림
  • `reason` 은 컬럼 자체가 없음. POST /false-alarm 이 `body.reason` 받지만 DB 저장 없이 WebSocket broadcast 만 했음
  • frontend(이지현 PR Feature/이지현 clean frontend #15) 는 `status='false_alarm'` 을 기대 — 그런데 backend 는 false-alarm 시 `status='dismissed'` 로 박고 있어 frontend 표시 자체가 깨짐

세 가지 한 PR로 정리.

변경

파일 변경
`models/models.py` `Event.reason String NULL` 컬럼 추가, status/event_type 주석 정정
`schemas/schemas.py` `EventResponse.event_type: str`, `EventResponse.reason: Optional[str]` 추가
`schemas/schemas.py` `EventCreate.event_type: Optional[str]` 추가 (AI 분류 결과 동행)
`schemas/schemas.py` `EventStatusUpdate.status: Literal['confirmed','false_alarm']`
`api/events.py` `report_false_alarm`: `status='false_alarm'` + `event.reason=body.reason` 저장
`api/events.py` `create_event`: `model_dump(exclude_none=True)` — 미전송 시 모델 default(`'unknown'`) 적용
`api/events.py` `get_event_stats`: false_alarm_count 쿼리 `status='false_alarm'`
`alembic c1a2b3d4e5f6` `events.reason` 컬럼 추가 + 기존 `status='dismissed'` 행을 `'false_alarm'` 백필

머지 후 응답 예

```json
{
"id": 42,
"camera_id": 7,
"timestamp": "2026-05-11T08:00:00",
"status": "false_alarm",
"event_type": "tailgating",
"reason": "그림자 오감지",
"clip_url": "...",
"..."
}
```

  • 일반 케이스: `event_type` 채워짐, `reason` = null
  • false_alarm 케이스: `event_type` 채워짐, `reason` = 오탐 사유 문자열

마이그레이션

  • master push → deploy.yml 의 `alembic upgrade head` 가 EC2 에서 자동 실행
  • 백필 쿼리가 함께 도므로 운영 DB 의 기존 `dismissed` 행은 `false_alarm` 으로 자동 정정
  • downgrade 도 안전하게 역백필 + 컬럼 drop

변경사항

  • 신규 기능 추가
  • 버그 수정 (status 미스매치 + reason DB 미저장)
  • DB 마이그레이션 포함

요청: GET /api/events/ 응답에 event_type(항상 포함), reason(false_alarm 일 때만)
받고 싶음. 확인 결과 event_type 은 모델에는 있는데 EventResponse 에 빠져
있었고, reason 은 컬럼 자체가 없었음(POST /false-alarm 받아만 두고 DB 미저장,
broadcast 만 함). 또 frontend(이지현 PR #15) 가 status='false_alarm' 을
기대하는데 backend 는 'dismissed' 로 박고 있어 표시도 깨지는 상태였음.

변경:
- models.Event: reason String NULL 컬럼 추가, status/event_type 주석 정정
- schemas.EventResponse: event_type(str), reason(Optional[str]) 필드 추가
- schemas.EventCreate: event_type Optional 추가 (AI 분류 결과 동행)
- schemas.EventStatusUpdate: Literal['confirmed','false_alarm'] (dismissed 제거)
- api.report_false_alarm: status='false_alarm', event.reason=body.reason 저장
- api.create_event: model_dump(exclude_none=True) — 모델 default 적용 보장
- api.get_event_stats: false_alarm_count 쿼리 status='false_alarm'
- alembic c1a2b3d4e5f6: events.reason 추가 + 기존 status='dismissed' 행을
  'false_alarm' 으로 백필 (운영 DB 손상 없이 표준화)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@CHOSOOGEUN
CHOSOOGEUN merged commit 6fe67d9 into master May 11, 2026
3 checks passed
@CHOSOOGEUN
CHOSOOGEUN deleted the feature/조수근-event-type-reason branch May 11, 2026 05:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant