계정 관리 API
참고: 이 문서에 설명된 모든 API는
dta-wir-medi-api애플리케이션에 구현되어 있습니다. (Go)
개요
계정 관리 API는 MD(의료진) 계정의 생성, 조회, 수정, 삭제 및 초대 관리 기능을 제공합니다.
[클라이언트 수정 필요]
API 경로에 /auth 경로가 추가됩니다.
경로 변경:
- asis:
/v1/accounts/~,/v1/my/~,/v1/invitations/~ - tobe:
/v1/auth/accounts/~,/v1/auth/my/~,/v1/auth/invitations/~
주요기능
- 계정 초대: Site에 새로운 계정 초대
- 초대 재발송: 기존 초대 이메일 재발송
- 초대 정보 조회: UUID로 초대 정보 확인
- 로그인: 이메일/비밀번호로 로그인
- 토큰 갱신: Refresh 토큰으로 Access 토큰 갱신
- 프로필 조회: 내 프로필 정보 조회
- 프로필 수정: 계정 프로필 정보 수정
- 권한 변경: 계정 권한(Position) 변경
- 처방 권한 조회: Site별 처방 권한 있는 계정 목록 조회
- 이메일 찾기: 이름과 전화번호로 이메일 찾기
- 계정 생성: 초대장으로 계정 생성
- 계정 직접 생성: 관리자가 직접 계정 생성
- 계정 삭제: 계정 삭제
- 계정 목록 조회: Site별 계정 목록 조회
- 초대 목록 조회: Site별 초대 목록 조회
[POST] /v1/accounts/sites/{siteId}/invite - 계정 초대
계정 초대
특정 Site에 새로운 계정을 초대합니다. 초대 이메일이 발송됩니다.
[클라이언트 수정 필요]
asis:/v1/accounts/sites/{siteId}/invite
tobe:/v1/auth/accounts/sites/{siteId}/invite
- HTTP Method:
POST - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| siteId | number | path | Site ID | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| string | 초대할 이메일 | ✔ | |
| authorizedToPrescribe | boolean | 처방 권한 부여 여부 | ✔ |
Request Body 예시
{
"email": "doctor@weltcorp.com",
"authorizedToPrescribe": true
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 초대 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "이미 가입한 계정입니다."
}
발생 가능한 에러 메시지:
"이미 가입한 계정입니다."- 해당 이메일이 이미 등록됨"이미 초대한 이메일입니다."- 유효한 초대가 이미 존재함"유효하지 않은 병원 정보입니다."- Site ID가 유효하지 않음
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts/sites/{siteId}/invites/resend - 초대 재발송
초대 재발송
기존 초대 이메일을 재발송합니다.
[클라이언트 수정 필요]
asis:/v1/accounts/sites/{siteId}/invites/resend
tobe:/v1/auth/accounts/sites/{siteId}/invites/resend
- HTTP Method:
POST - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| siteId | number | path | Site ID | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| invitationUUID | string | 초대 UUID | ✔ |
Request Body 예시
{
"invitationUUID": "550e8400-e29b-41d4-a716-446655440000"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 재발송 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "유효하지 않은 초대 정보입니다."
}
발생 가능한 에러 메시지:
"유효하지 않은 초대 정보입니다."- 초대 정보를 찾을 수 없거나 Site ID가 일치하지 않음"만료된 초대 정보입니다."- 초대가 만료됨
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[GET] /v1/invitations/{invitationUUID} - 초대 정보 조회
초대 정보 조회
UUID로 초대 정보를 조회합니다.
[클라이언트 수정 필요]
asis:/v1/invitations/{invitationUUID}
tobe:/v1/auth/invitations/{invitationUUID}
- HTTP Method:
GET - 인증: 액세스 토큰 필요 없음
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| invitationUUID | string | path | 초대 UUID | ✔ |
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 조회 성공 | - |
404 Not Found | 초대를 찾을 수 없음 | NOT_FOUND (40400) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"id": 1,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"site": {
"id": 1,
"name": "서울대병원",
"clinicalResearch": false
},
"email": "doctor@weltcorp.com",
"position": "MEMBER",
"authorizedToPrescribe": true,
"expiresAt": "2024-12-31T23:59:59Z"
}
| 필드 | 타입 | 설명 |
|---|---|---|
| id | number | 초대 ID |
| uuid | string | 초대 UUID |
| site | object | Site 정보 |
| string | 초대된 이메일 | |
| position | string | 권한 (Position) |
| authorizedToPrescribe | boolean | 처방 권한 여부 |
| expiresAt | string | 만료 일시 (ISO 8601) |
404 Not Found - 초대를 찾을 수 없음
{
"status": 404,
"code": 40400,
"message": "유효하지 않은 초대 정보입니다."
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts/invitations/{invitationUUID} - 초대로 계정 생성
초대로 계정 생성
초대 UUID를 사용하여 새로운 계정을 생성합니다.
[클라이언트 수정 필요]
asis:/v1/accounts/invitations/{invitationUUID}
tobe:/v1/auth/accounts/invitations/{invitationUUID}
- HTTP Method:
POST - 인증: 액세스 토큰 필요 없음
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| invitationUUID | string | path | 초대 UUID | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| string | 이메일 | ✔ | |
| password | string | 비밀번호 | ✔ |
| name | string | 이름 | ✔ |
| phoneNumber | string | 전화번호 | ✔ |
Request Body 예시
{
"email": "doctor@weltcorp.com",
"password": "password123!",
"name": "홍길동",
"phoneNumber": "01012345678"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 계정 생성 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "비밀번호는 10~20자리여야 합니다."
}
발생 가능한 에러 메시지:
"유효하지 않은 초대 정보입니다."- 초대를 찾을 수 없음"만료된 초대 정보입니다."- 초대가 만료되었거나 이미 사용됨"유효하지 않은 전화번호 형식입니다."- 전화번호 형식이 잘못됨"비밀번호는 10~20자리여야 합니다."- 비밀번호 길이 규칙 위반"비밀번호는 숫자/문자/특수문자 중 2가지 이상을 포함해야 합니다."- 비밀번호 복잡도 규칙 위반
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts/login - 로그인
로그인
이메일과 비밀번호로 로그인합니다.
[클라이언트 수정 필요]
asis:/v1/accounts/login
tobe:/v1/auth/accounts/login
- HTTP Method:
POST - 인증: 액세스 토큰 필요 없음
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| string | 이메일 | ✔ | |
| password | string | 비밀번호 | ✔ |
Request Body 예시
{
"email": "doctor@weltcorp.com",
"password": "password123!"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 로그인 성공 | - |
400 Bad Request | 잘못된 이메일 또는 비밀번호 | INVALID_EMAIL_OR_PASSWORD (40001), ACCOUNT_LOCKED (40002) |
401 Unauthorized | 계정 잠김 | INVALID_EMAIL_OR_PASSWORD_ACCOUNT_LOCKED (40103) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"account": {
"id": 1,
"email": "doctor@weltcorp.com",
"name": "홍길동",
"phoneNumber": "010-1234-5678",
"site": {
"id": 1,
"name": "서울대병원",
"clinicalResearch": false
},
"roles": [1, 2],
"position": "MEMBER",
"authorizedToPrescribe": true,
"createdAt": "2024-01-01T00:00:00Z"
},
"tokens": {
"access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"enabledTabs": [
{
"id": 1,
"title": "진료용",
"value": "medical"
}
]
}
| 필드 | 타입 | 설명 |
|---|---|---|
| account | object | 계정 정보 |
| tokens | object | 인증 토큰 (access, refresh) |
| enabledTabs | array | 활성화된 탭 목록 (진료용/연구용) |
400 Bad Request - 잘못된 이메일 또는 비밀번호
{
"status": 400,
"code": 40001,
"message": "login-failed"
}
이메일 또는 비밀번호가 일치하지 않을 때 발생합니다.
401 Unauthorized - 계정 잠김
{
"status": 401,
"code": 40103,
"message": "login-failed"
}
5회 이상 로그인 실패로 계정이 1분간 잠긴 경우 발생합니다.
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts/tokens/refresh - 토큰 갱신
토큰 갱신
Refresh 토큰을 사용하여 새로운 Access 토큰과 Refresh 토큰을 발급받습니다.
[클라이언트 수정 필요]
asis:/v1/accounts/tokens/refresh
tobe:/v1/auth/accounts/tokens/refresh
- HTTP Method:
POST - 인증: Refresh 토큰 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| token | string | Refresh 토큰 | ✔ |
Request Body 예시
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 토큰 갱신 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 유효하지 않은 토큰 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
| 필드 | 타입 | 설명 |
|---|---|---|
| access | string | 새로운 Access 토큰 |
| refresh | string | 새로운 Refresh 토큰 |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "invalid-account-id"
}
토큰의 계정 정보가 유효하지 않을 때 발생합니다.
401 Unauthorized - 유효하지 않은 토큰
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[GET] /v1/my/profile - 내 프로필 조회
내 프로필 조회
현재 로그인한 사용자의 프로필 정보를 조회합니다.
[클라이언트 수정 필요]
asis:/v1/my/profile
tobe:/v1/auth/my/profile
- HTTP Method:
GET - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 조회 성공 | - |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"id": 1,
"email": "doctor@weltcorp.com",
"name": "홍길동",
"phoneNumber": "010-1234-5678",
"site": {
"id": 1,
"name": "서울대병원",
"clinicalResearch": false
},
"roles": [1, 2],
"position": "MEMBER",
"authorizedToPrescribe": true,
"createdAt": "2024-01-01T00:00:00Z",
"enabledTabs": [
{
"id": 1,
"title": "진료용",
"value": "medical"
}
]
}
| 필드 | 타입 | 설명 |
|---|---|---|
| id | number | 계정 ID |
| string | 이메일 | |
| name | string | 이름 |
| phoneNumber | string | 전화번호 |
| site | object | Site 정보 |
| roles | array | 역할 ID 목록 |
| position | string | 권한 (Position) |
| authorizedToPrescribe | boolean | 처방 권한 여부 |
| createdAt | string | 계정 생성일 (ISO 8601) |
| enabledTabs | array | 활성화된 탭 목록 (진료용/연구용) |
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[PATCH] /v1/accounts/{accountId}/profile - 프로필 수정
프로필 수정
계정의 프로필 정보를 수정합니다. 비밀번호도 변경할 수 있습니다.
[클라이언트 수정 필요]
asis:/v1/accounts/{accountId}/profile
tobe:/v1/auth/accounts/{accountId}/profile
- HTTP Method:
PATCH - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| accountId | number | path | 계정 ID | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| name | string | 이름 | ✗ |
| phoneNumber | string | 전화번호 | ✗ |
| authorizedToPrescribe | boolean | 처방 권한 여부 | ✗ |
| password | string | 현재 비밀번호 (변경 시 필수) | ✗ |
| newPassword | string | 새 비밀번호 | ✗ |
Request Body 예시
{
"name": "홍길동",
"phoneNumber": "01012345678",
"authorizedToPrescribe": true
}
비밀번호 변경 시:
{
"name": "홍길동",
"phoneNumber": "01012345678",
"password": "oldPassword123!",
"newPassword": "newPassword456!"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 수정 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
409 Conflict | 비밀번호 중복 | CONFLICT (40900) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "비밀번호가 일치하지 않습니다."
}
발생 가능한 에러 메시지:
"비밀번호가 일치하지 않습니다."- 현재 비밀번호가 일치하지 않음"유효하지 않은 전화번호 형식입니다."- 전화번호 형식이 잘못됨"비밀번호는 10~20자리여야 합니다."- 비밀번호 길이 규칙 위반"비밀번호는 숫자/문자/특수문자 중 2가지 이상을 포함해야 합니다."- 비밀번호 복잡도 규칙 위반
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
409 Conflict - 비밀번호 중복
{
"status": 409,
"code": 40900,
"message": "같은 비밀번호를 사용할 수 없습니다."
}
새 비밀번호가 현재 비밀번호와 동일할 때 발생합니다.
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[PATCH] /v1/accounts/{accountId}/position - 권한 변경
권한 변경
계정의 권한(Position)을 변경합니다. Site Admin만 실행할 수 있습니다.
[클라이언트 수정 필요]
asis:/v1/accounts/{accountId}/position
tobe:/v1/auth/accounts/{accountId}/position
- HTTP Method:
PATCH - 인증: 액세스 토큰 (
accessToken) 필요 (Site Admin 권한 필요)
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| accountId | number | path | 계정 ID | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| positionId | number | Position ID (1: STUDY_ADMIN, 2: ADMIN, 3: MEMBER, 4: SITE_ADMIN, 5: SITE_MEMBER) | ✔ |
Request Body 예시
{
"positionId": 3
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 변경 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
403 Forbidden | 권한 없음 | FORBIDDEN (40300) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "잘못된 계정 정보입니다."
}
accountId 또는 positionId가 유효하지 않을 때 발생합니다.
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
403 Forbidden - 권한 없음
{
"status": 403,
"code": 40300,
"message": "변경 권한이 없습니다."
}
발생 가능한 에러 메시지:
"변경 권한이 없습니다."- Site Admin 권한이 없음"변경 할 수 없는 권한입니다."- Admin 권한은 상호 변경 불가"변경 할 수 없는 Site 계정입니다."- 다른 Site의 계정은 변경 불가
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[GET] /v1/accounts/authorized/sites/{siteId} - 처방 권한 계정 조회
처방 권한 계정 조회
특정 Site의 처방 권한이 있는 계정 목록을 조회합니다.
[클라이언트 수정 필요]
asis:/v1/accounts/authorized/sites/{siteId}
tobe:/v1/auth/accounts/authorized/sites/{siteId}
- HTTP Method:
GET - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| siteId | number | path | Site ID | ✔ |
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 조회 성공 | - |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"accounts": [
{
"id": 1,
"name": "홍길동"
},
{
"id": 2,
"name": "김철수"
}
],
"saved": {
"id": 1,
"name": "홍길동"
}
}
| 필드 | 타입 | 설명 |
|---|---|---|
| accounts | array | 처방 권한이 있는 계정 목록 |
| saved | object | 현재 사용자가 저장한 계정 (없으면 null) |
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts/find-emails - 이메일 찾기
이메일 찾기
이름과 전화번호로 등록된 이메일 주소를 찾습니다. 이메일은 마스킹되어 반환됩니다.
[클라이언트 수정 필요]
asis:/v1/accounts/find-emails
tobe:/v1/auth/accounts/find-emails
- HTTP Method:
POST - 인증: 액세스 토큰 필요 없음
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| name | string | 이름 | ✔ |
| phoneNumber | string | 전화번호 | ✔ |
Request Body 예시
{
"name": "홍길동",
"phoneNumber": "01012345678"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 조회 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"emails": ["h****@weltcorp.com", "hong****@example.com"]
}
| 필드 | 타입 | 설명 |
|---|---|---|
| emails | array | 마스킹된 이메일 주소 목록 |
이메일 마스킹 규칙:
- 1글자:
* - 2-5글자: 첫 글자 +
*(나머지) - 6글자 이상: 앞부분 +
****(4글자) + 뒷부분
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "유효하지 않은 전화번호 형식입니다."
}
전화번호 형식이 잘못되었을 때 발생합니다.
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts/delete - 계정 삭제
계정 삭제
계정을 삭제합니다. 본인 계정만 삭제할 수 있습니다.
[클라이언트 수정 필요]
asis:/v1/accounts/delete
tobe:/v1/auth/accounts/delete
- HTTP Method:
POST - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| accountId | number | 삭제할 계정 ID | ✔ |
| password | string | 비밀번호 | ✔ |
Request Body 예시
{
"accountId": 1,
"password": "password123!"
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 삭제 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
참고:
- 계정이 속한 Site에 계정이 1개만 있는 경우, Site도 함께 삭제됩니다.
- Admin 권한 계정이 1개만 남았고 다른 계정이 있는 경우 삭제할 수 없습니다.
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "권한이 없습니다."
}
발생 가능한 에러 메시지:
"권한이 없습니다."- 본인 계정이 아닌 다른 계정을 삭제하려 할 때"유효하지 않은 계정 정보입니다."- 계정을 찾을 수 없거나 비밀번호가 일치하지 않음"삭제할 수 없는 계정입니다."- Admin이 1명만 남아있고 다른 계정이 있을 때
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[POST] /v1/accounts - 계정 생성
계정 생성
관리자가 직접 새로운 계정을 생성합니다.
[클라이언트 수정 필요]
asis:/v1/accounts
tobe:/v1/auth/accounts
- HTTP Method:
POST - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
| Content-Type | application/json | 요청 본문 형식 | ✔ |
Request Body
| 필드 | 타입 | 설명 | Required |
|---|---|---|---|
| string | 이메일 | ✔ | |
| password | string | 비밀번호 | ✔ |
| name | string | 이름 | ✔ |
| phoneNumber | string | 전화번호 | ✔ |
| siteId | number | Site ID | ✔ |
| positionId | number | Position ID (1: STUDY_ADMIN, 2: ADMIN, 3: MEMBER, 4: SITE_ADMIN, 5: SITE_MEMBER) | ✔ |
| authorizedToPrescribe | boolean | 처방 권한 부여 여부 | ✔ |
Request Body 예시
{
"email": "doctor@weltcorp.com",
"password": "password123!",
"name": "홍길동",
"phoneNumber": "01012345678",
"siteId": 1,
"positionId": 3,
"authorizedToPrescribe": true
}
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 생성 성공 | - |
400 Bad Request | 잘못된 요청 | BAD_REQUEST (40000) |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"success": true
}
| 필드 | 타입 | 설명 |
|---|---|---|
| success | boolean | 성공 여부 (true) |
400 Bad Request - 잘못된 요청
{
"status": 400,
"code": 40000,
"message": "이미 존재하는 계정입니다."
}
발생 가능한 에러 메시지:
"이미 존재하는 계정입니다."- 해당 이메일이 이미 등록됨"유효하지 않은 전화번호 형식입니다."- 전화번호 형식이 잘못됨"비밀번호는 10~20자리여야 합니다."- 비밀번호 길이 규칙 위반"비밀번호는 숫자/문자/특수문자 중 2가지 이상을 포함해야 합니다."- 비밀번호 복잡도 규칙 위반
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[GET] /v1/accounts/sites/{siteId} - Site별 계정 목록 조회
Site별 계정 목록 조회
특정 Site에 속한 계정 목록을 조회합니다.
[클라이언트 수정 필요]
asis:/v1/accounts/sites/{siteId}
tobe:/v1/auth/accounts/sites/{siteId}
- HTTP Method:
GET - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| siteId | number | path | Site ID | ✔ |
| page | number | query | 페이지 번호 (기본값: 1) | ✗ |
| limit | number | query | 페이지 크기 (기본값: 10) | ✗ |
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 조회 성공 | - |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"totalCount": 25,
"count": 10,
"data": [
{
"id": 1,
"email": "doctor@weltcorp.com",
"name": "홍길동",
"phoneNumber": "010-****-5678",
"site": {
"id": 1,
"name": "서울대병원",
"clinicalResearch": false
},
"roles": [1, 2],
"position": "MEMBER",
"authorizedToPrescribe": true,
"createdAt": "2024-01-01T00:00:00Z"
}
]
}
| 필드 | 타입 | 설명 |
|---|---|---|
| totalCount | number | 전체 계정 수 |
| count | number | 현재 페이지의 계정 수 |
| data | array | 계정 목록 (전화번호 마스킹) |
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}
[GET] /v1/accounts/sites/{siteId}/invite - Site별 초대 목록 조회
Site별 초대 목록 조회
특정 Site의 초대 목록을 조회합니다. 승인되지 않은 초대만 조회됩니다.
[클라이언트 수정 필요]
asis:/v1/accounts/sites/{siteId}/invite
tobe:/v1/auth/accounts/sites/{siteId}/invite
- HTTP Method:
GET - 인증: 액세스 토큰 (
accessToken) 필요
Headers
| Header | Type | Description | Required |
|---|---|---|---|
| Authorization | Bearer {accessToken} | 사용자 인증을 통해 발급받은 액세스 토큰 입니다. | ✔ |
Request Parameters
| 필드 | 타입 | 위치 | 설명 | Required |
|---|---|---|---|---|
| siteId | number | path | Site ID | ✔ |
| page | number | query | 페이지 번호 (기본값: 1) | ✗ |
| limit | number | query | 페이지 크기 (기본값: 10) | ✗ |
Responses
| Http Status Code | 설명 | Error Code(s) |
|---|---|---|
200 OK | 조회 성공 | - |
401 Unauthorized | 인증 실패 | UNAUTHORIZED (40100) |
500 Internal Server Error | 서버 내부 오류 | INTERNAL_SERVER_ERROR (50000) |
200 OK - 성공
{
"totalCount": 5,
"count": 5,
"data": [
{
"id": 1,
"uuid": "550e8400-e29b-41d4-a716-446655440000",
"site": {
"id": 1,
"name": "서울대병원",
"clinicalResearch": false
},
"email": "doctor@weltcorp.com",
"position": "MEMBER",
"authorizedToPrescribe": true,
"expiresAt": "2024-12-31T23:59:59Z"
}
]
}
| 필드 | 타입 | 설명 |
|---|---|---|
| totalCount | number | 전체 초대 수 |
| count | number | 현재 페이지의 초대 수 |
| data | array | 초대 목록 |
401 Unauthorized - 인증 실패
{
"status": 401,
"code": 40100,
"message": "UNAUTHORIZED"
}
500 Internal Server Error - 서버 내부 오류
{
"status": 500,
"code": 50000,
"message": "INTERNAL_SERVER_ERROR"
}