회원 가입/로그인
회원 가입 프로세스
1. 사용자 생성 API
- 엔드포인트:
POST /api/v1/users - 인증 불필요
- 도메인별 독립적인 사용자 관리
2. 요청 데이터
{
domain: string; // 도메인 이름 (필수)
symId: string; // 심버스 ID (필수)
tronAddress: string; // TRON 지갑 주소 (필수)
nickName?: string; // 닉네임 (선택)
referrerCode?: string; // 추천인 코드 (선택)
}
3. 처리 프로세스
-
도메인 확인
- 요청된 도메인이 존재하는지 확인
- 존재하지 않는 경우 'Domain not found' 에러 발생
-
기존 사용자 확인
- 해당 도메인에 동일한 symId를 가진 사용자가 있는지 확인
- 있다면 로그인 처리, 없다면 새 사용자 생성
-
추천 코드 생성
- 5자리 숫자로 구성된 고유한 추천 코드 자동 생성 (10000-99999)
- 시스템 내에서 유일한 값 보장
-
추천인 설정
- 기본적으로 도메인 관리자가 추천인으로 설정
- referrerCode가 제공된 경우, 해당 코드의 사용자를 추천인으로 설정
- 잘못된 추천 코드인 경우 'Invalid referral code' 에러 발생
4. 응답 데이터
{
access_token: string; // JWT 액세스 토큰
refresh_token: string; // JWT 리프레시 토큰
user: {
_id: string;
symId: string;
domain: string;
referralCode: string; // 자동 생성된 5자리 추천 코드
// ... 기타 사용자 정보
}
}
5. 제한 사항
- symId는 도메인 내에서 유일해야 함
- referralCode는 시스템 전체에서 유일해야 함
- 추천인은 같은 도메인에 속한 사용자여야 함
- nickName이 제공된 경우 도메인 내에서 유일해야 함
로그인
API 엔드포인트
POST /v1/users
회원 가입 또는 로그인을 처리합니다.
요청
{
"domain": "example.com",
"symId": "0x123...",
"tronAddress": "TXx2SHKj4NkBpVwN6mMbgXzm8EVeVwpRFz",
"role": "DOMAIN_USER"
}
필드 설명
domain: 사용자가 속한 도메인symId: Symverse 계정의 고유 IDtronAddress: TRON 네트워크의 지갑 주소 (TRC20)role: 사용자 역할 (DOMAIN_USER, DOMAIN_ADMIN, SUPER_ADMIN)
응답
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....",
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9....",
"user": {
"symId": "test123",
"domain": "67b2df1451f57701444132bd",
"role": "DOMAIN_USER",
"referralCode": "19993",
"parentId": {
"_id": "67b2e1576d55b93516e4b23a"
},
"referralCount": 0,
"tronAddress": "TXx2SHKj4NkBpVwN6mMbgXzm8EVeVwpRFz",
"rewardBalance": 0,
"referralPath": [],
"isActive": true,
"level": 0,
"_id": "67b53d2c40add8262dfc0631",
"createdAt": "2025-02-19T02:08:44.285Z",
"updatedAt": "2025-02-19T02:08:44.285Z",
"__v": 0
}
}
오류 응답
{
"statusCode": 400,
"message": "tronAddress is required",
"error": "Bad Request"
}
GET /v1/users
현재 로그인한 사용자의 정보를 조회합니다.
요청 헤더
Authorization: Bearer {access_token}
응답
{
"_id": "507f1f77bcf86cd799439011",
"domain": "example.com",
"symId": "0x123...",
"tronAddress": "TXx...", // Tron 지갑 주소
"createdAt": "2024-03-19T..."
}
PATCH /v1/users
사용자 정보를 수정합니다.
요청 헤더
Authorization: Bearer {access_token}
요청
{
"tronAddress": "TXx..." // Tron 지갑 주소 업데이트
}
응답
{
"_id": "507f1f77bcf86cd799439011",
"domain": "example.com",
"symId": "0x123...",
"tronAddress": "TXx...", // 업데이트된 Tron 지갑 주소
"createdAt": "2024-03-19T..."
}
내 정보 조회
GET /api/v1/users/me
로그인한 사용자의 상세 정보를 조회합니다.
1. 요청
- JWT 인증 필요
- Bearer 토큰 사용
GET /api/v1/users/me
Authorization: Bearer {access_token}
2. 응답 데이터
{
_id: string; // 사용자 고유 ID
symId: string; // Symverse 계정 ID
domain: { // 도메인 정보
_id: string;
name: string;
};
role: Role; // 사용자 권한
referralCode: string; // 나의 추천 코드 (5자리 숫자)
parentId: { // 추천인 정보
_id: string;
};
referralCount: number; // 추천한 사용자 수
tronAddress: string; // TRON 지갑 주소
rewardBalance: number; // 보상 잔액
referralPath: string[]; // 추천 경로
isActive: boolean; // 활성화 상태
level: number; // 사용자 레벨
createdAt: Date; // 생성일
updatedAt: Date; // 수정일
}
3. 응답 예시
{
"_id": "67b53d2c40add8262dfc0631",
"symId": "test123",
"domain": {
"_id": "67b2df1451f57701444132bd",
"name": "example.com"
},
"role": "DOMAIN_USER",
"referralCode": "19993",
"parentId": {
"_id": "67b2e1576d55b93516e4b23a"
},
"referralCount": 0,
"tronAddress": "TXx2SHKj4NkBpVwN6mMbgXzm8EVeVwpRFz",
"rewardBalance": 0,
"referralPath": [],
"isActive": true,
"level": 0,
"createdAt": "2024-02-19T02:08:44.285Z",
"updatedAt": "2024-02-19T02:08:44.285Z"
}
닉네임 변경
PATCH /api/v1/users/me/nickname
로그인한 사용자의 닉네임을 변경합니다.
1. 요청
- JWT 인증 필요
- Bearer 토큰 사용
PATCH /api/v1/users/me/nickname
Authorization: Bearer {access_token}
Content-Type: application/json
{
"nickname": "홍길동"
}
2. 요청 데이터
{
nickname: string; // 변경할 닉네임 (2~30자)
}
3. 제한 사항
- 닉네임은 2~30자 사이여야 합니다.
- 유효한 문자열이어야 합니다.
4. 응답 데이터
{
_id: string; // 사용자 고유 ID
nickName: string; // 변경된 닉네임
symId: string; // Symverse 계정 ID
domain: string; // 도메인 정보
}
5. 응답 예시
{
"_id": "507f1f77bcf86cd799439011",
"nickName": "홍길동",
"symId": "user123",
"domain": "example.com"
}
6. 오류 응답
{
"statusCode": 400,
"message": "닉네임은 2~30자 사이여야 합니다.",
"error": "Bad Request"
}
4. 오류 응답
인증 실패
{
"statusCode": 401,
"message": "Unauthorized",
"error": "Unauthorized"
}
사용자를 찾을 수 없음
{
"statusCode": 404,
"message": "User not found",
"error": "Not Found"
}
5. 주요 필드 설명
referralCode: 다른 사용자를 추천할 때 사용하는 고유 코드parentId: 나를 추천한 상위 사용자의 IDreferralCount: 내가 추천한 하위 사용자의 수rewardBalance: 누적된 추천 보상 금액level: 추천 트리에서의 사용자 레벨referralPath: 추천 관계의 전체 경로
6. 참고 사항
- 응답에는 민감한 정보가 포함되어 있으므로 반드시 인증된 요청만 허용
- 도메인 정보는 populate되어 반환
- 추천인 정보는 ID만 포함하여 반환