본문으로 건너뛰기
버전: 개발 버전 (최신)

환자 리포트 조회 API

참고: 이 문서에 설명된 모든 API는 dta-wir-medi-api 애플리케이션에 구현되어 있습니다. (Go)

개요

환자 리포트 조회 API는 환자의 치료 진행 상황, 수면 기록, 설문 결과 등을 종합적으로 조회하는 기능을 제공합니다.

주요 기능

  • 환자 리포트 조회: 인증된 사용자의 환자 리포트 조회
  • 외부 토큰으로 환자 리포트 조회: 외부 액세스 토큰을 사용한 환자 리포트 조회
[GET] v1/users/{userId}/reports - 환자 리포트 조회

환자 리포트 조회

[클라이언트 수정 필요]
asis: /v1/patients/user-cycles/{userCycleId}/reports
tobe: /v1/users/{userId}/reports

특정 환자의 종합 리포트를 조회합니다.

  • HTTP Method: GET
  • 인증: 액세스 토큰 (accessToken) 필요

Headers

HeaderTypeDescriptionRequired
AuthorizationBearer {accessToken}사용자 인증을 통해 발급받은 액세스 토큰 입니다.

Path Parameters

필드타입설명Required
userIdnumber사용자 ID

Request 예시

GET /v1/users/123/reports

Responses

Http Status Code설명Error Code(s)
200 OK조회 성공-
400 Bad Request잘못된 요청BAD_REQUEST (40000)
401 Unauthorized인증 실패UNAUTHORIZED (40100)
404 Not Found환자 미발견NOT_FOUND (40400)
500 Internal Server Error서버 내부 오류INTERNAL_SERVER_ERROR (50000)
200 OK - 성공
{
"period": {
"startDate": "2024-01-01",
"endDate": "2024-03-31"
},
"patient": {
"name": "홍길동",
"email": "patient@example.com",
"phoneNumber": "01012345678",
"birthdate": "1990-01-01",
"accesscode": "ABC123",
"accesscodeCreatedAt": "2024-01-01T09:00:00Z",
"siteId": 1,
"accountId": 10,
"accountName": "김의사",
"day": 15,
"status": 1,
"lastLogin": "2024-01-20T10:00:00Z",
"startedAt": "2024-01-10T09:00:00Z",
"endAt": "2024-04-10T09:00:00Z",
"memo": "특이사항 없음",
"medicalRegistrationNumber": "MRN-001"
},
"sleeps": {
"2024-01-15": {
"diary": {
"dns": false,
"lot": 1380,
"ast": 1410,
"aet": 450,
"waso": 30,
"pill": false,
"nap": 0,
"sleepQuality": 4,
"tst": 420,
"se": 93.3,
"dse": 1,
"sol": 30,
"timezoneId": "Asia/Seoul",
"timezoneOffset": 540
},
"goal": {
"targetDate": "2024-01-15",
"durationInMinutes": 450,
"lot": 1380,
"aet": 450,
"timezoneId": "Asia/Seoul",
"timezoneOffset": 540,
"typeId": 1
}
}
},
"questionnaires": {
"ISI": [
{
"completed": true,
"score": 12,
"maxScore": 28,
"round": 1
}
],
"WIQ": [],
"PHQ9": [
{
"completed": true,
"score": 5,
"maxScore": 27,
"round": 1
}
],
"GAD7": [
{
"completed": true,
"score": 3,
"maxScore": 21,
"round": 1
}
],
"ESS": [],
"DBAS": [
{
"completed": true,
"score": 5.5,
"maxScore": 10,
"round": 1
}
]
},
"summary": {
"treatmentProgress": {
"currentDay": 15,
"totalUsageDays": 15
},
"sleepRecord": {
"count": 14,
"appUsageDays": 15,
"percentage": 93.3
},
"lotSuccess": {
"count": 12,
"appUsageDays": 15,
"percentage": 80.0
},
"aetSuccess": {
"count": 13,
"appUsageDays": 15,
"percentage": 86.7
}
}
}

Response 구조

period (조회 기간)

필드타입설명
startDatestring시작 날짜
endDatestring종료 날짜

patient (환자 정보)

필드타입설명
namestring환자 이름
emailstring이메일
phoneNumberstring전화번호
birthdatestring생년월일
accesscodestring액세스 코드
accesscodeCreatedAtstring액세스 코드 생성일
siteIdnumber사이트 ID
accountIdnumber담당 의료진 계정 ID
accountNamestring담당 의료진 이름
daynumber치료 일차
statusnumber환자 상태
lastLoginstring마지막 로그인
startedAtstring치료 시작일
endAtstring치료 종료일
memostring메모
medicalRegistrationNumberstring의무 등록 번호

sleeps (수면 기록)

날짜를 키로 하는 맵 형태로 제공됩니다. 각 날짜별로 수면 일지(diary)와 수면 목표(goal) 정보를 포함합니다.

diary (수면 일지):

필드타입설명
dnsbooleanDid Not Sleep (수면하지 않음)
lotnumberLights Out Time (소등 시각, 분 단위)
astnumberActual Sleep Time (실제 수면 시각)
aetnumberActual End Time (실제 기상 시각)
wasonumberWake After Sleep Onset (중간 각성)
pillboolean수면제 복용 여부
napnumber낮잠 시간 (분)
sleepQualitynumber수면 질 평가 (1-5)
tstnumberTotal Sleep Time (총 수면 시간, 분)
senumberSleep Efficiency (수면 효율, %)
dsenumberDaily Sleep Efficiency
solnumberSleep Onset Latency (입면 잠복기)
timezoneIdstring타임존 ID
timezoneOffsetnumber타임존 오프셋 (분)

goal (수면 목표):

필드타입설명
targetDatestring목표 날짜
durationInMinutesnumber목표 수면 시간 (분)
lotnumber목표 소등 시각
aetnumber목표 기상 시각
timezoneIdstring타임존 ID
timezoneOffsetnumber타임존 오프셋 (분)
typeIdnumber수면 목표 타입 ID

questionnaires (설문 결과)

각 설문 타입별로 배열 형태로 제공됩니다.

설문 타입:

  • ISI: Insomnia Severity Index (불면증 심각도 지수)
  • WIQ: Work and Health Interview Questionnaire
  • PHQ9: Patient Health Questionnaire-9 (우울증)
  • GAD7: Generalized Anxiety Disorder-7 (불안장애)
  • ESS: Epworth Sleepiness Scale
  • DBAS: Dysfunctional Beliefs and Attitudes about Sleep

일반 설문 항목 (ISI, WIQ, PHQ9, GAD7, ESS):

필드타입설명
completedboolean완료 여부
scorenumber점수 (optional)
maxScorenumber최대 점수
roundnumber회차

DBAS 설문 항목:

필드타입설명
completedboolean완료 여부
scorenumber점수 (소수점, optional)
maxScorenumber최대 점수
roundnumber회차

summary (요약 정보)

treatmentProgress (치료 진행):

필드타입설명
currentDaynumber현재 치료 일차
totalUsageDaysnumber총 앱 사용 일수

sleepRecord (수면 기록 통계):

필드타입설명
countnumber수면 기록 횟수
appUsageDaysnumber앱 사용 일수
percentagenumber수면 기록 비율 (%)

lotSuccess (소등 시각 준수 통계):

필드타입설명
countnumber소등 시각 준수 횟수
appUsageDaysnumber앱 사용 일수
percentagenumber소등 시각 준수 비율 (%)

aetSuccess (기상 시각 준수 통계):

필드타입설명
countnumber기상 시각 준수 횟수
appUsageDaysnumber앱 사용 일수
percentagenumber기상 시각 준수 비율 (%)
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "잘못된 요청입니다."
}
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
404 Not Found - 환자 미발견
{
"status": 404,
"code": 40400,
"message": "환자 정보를 찾을 수 없습니다."
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[GET] /v1/users/{userId}/reports/external - 외부 토큰으로 환자 리포트 조회

외부 토큰으로 환자 리포트 조회

[클라이언트 수정 필요]
asis: /v1/patients/user-cycles/{userCycleId}/reports/external
tobe: /v1/users/{userId}/reports/external

외부 액세스 토큰을 사용하여 환자 리포트를 조회합니다. 일반 인증 토큰이 아닌 별도의 외부 액세스 토큰으로 인증합니다.

  • HTTP Method: GET
  • 인증: 외부 액세스 토큰 (token) 필요

Query Parameters

필드타입설명Required
tokenstring외부 액세스 토큰

Path Parameters

필드타입설명Required
userIdnumber사용자 ID

Request 예시

GET /v1/users/123/reports/external?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Responses

Http Status Code설명Error Code(s)
200 OK조회 성공-
400 Bad Request잘못된 요청BAD_REQUEST (40000)
401 Unauthorized인증 실패UNAUTHORIZED (40100)
404 Not Found환자 미발견NOT_FOUND (40400)
500 Internal Server Error서버 내부 오류INTERNAL_SERVER_ERROR (50000)
200 OK - 성공

응답 형식은 일반 환자 리포트 조회와 동일합니다.

토큰 검증 로직:

  1. 외부 액세스 토큰의 유효성 검증
  2. 토큰의 타입이 MD_ACCESS 타입인지 확인
  3. 토큰의 sub (subject) 클레임이 요청한 userCycleId와 일치하는지 확인
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "잘못된 요청입니다."
}

발생 가능한 에러 메시지:

  • "잘못된 요청입니다." - 토큰이 제공되지 않음
  • "유효하지 않은 토큰 정보 입니다." - 토큰의 sub 클레임이 없거나 userCycleId와 불일치
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}

토큰이 만료되었거나 유효하지 않은 경우 발생합니다.

404 Not Found - 환자 미발견
{
"status": 404,
"code": 40400,
"message": "환자 정보를 찾을 수 없습니다."
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}

토큰 타입

타입설명사용처
MD_ACCESS의료진 대시보드 외부 액세스 토큰외부 시스템 연동