🀝 거래 API ν™œμš©, νŒ€ ν”„λ‘œμ νŠΈ

주어진 APIλ₯Ό 뢄석해 μ–΄λ–€ ν”„λ‘œμ νŠΈλ₯Ό 진행/μ™„μ„±ν•  것인지 νŒ€ λ‹¨μœ„λ‘œ 자유둭게 κ²°μ •ν•˜κ³  λ§Œλ“€μ–΄λ³΄μ„Έμš”.
TypeScriptλ₯Ό ν•„μˆ˜λ‘œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.
과제 μˆ˜ν–‰ 및 리뷰 기간은 별도 곡지λ₯Ό μ°Έκ³ ν•˜μ„Έμš”!

과제 μˆ˜ν–‰ 및 제좜 방법

KDT기수번호_이름

E.g, KDT0_ParkYoungWoong
  1. ν˜„μž¬ μ €μž₯μ†Œλ₯Ό λ‘œμ»¬μ— 클둠(Clone)ν•©λ‹ˆλ‹€.
  2. μžμ‹ μ˜ λ³Έλͺ…μœΌλ‘œ 브랜치λ₯Ό μƒμ„±ν•©λ‹ˆλ‹€.(ꡬ뢄 κ°€λŠ₯ν•˜λ„λ‘ λ³Έλͺ…을 κΌ­ νŒŒμŠ€μΉΌμΌ€μ΄μŠ€λ‘œ ν‘œμ‹œν•˜μ„Έμš”, git branch KDTX_ParkYoungWoong)
  3. μžμ‹ μ˜ λ³Έλͺ… λΈŒλžœμΉ˜μ—μ„œ 과제λ₯Ό μˆ˜ν–‰ν•©λ‹ˆλ‹€.
  4. 과제 μˆ˜ν–‰μ΄ μ™„λ£Œλ˜λ©΄, μžμ‹ μ˜ λ³Έλͺ… 브랜치λ₯Ό 원격 μ €μž₯μ†Œμ— ν‘Έμ‹œ(Push)ν•©λ‹ˆλ‹€.(main λΈŒλžœμΉ˜μ— ν‘Έμ‹œν•˜μ§€ μ•Šλ„λ‘ κΌ­ μ£Όμ˜ν•˜μ„Έμš”, git push origin KDTX_ParkYoungWoong)
  5. μ €μž₯μ†Œμ—μ„œ main 브랜치λ₯Ό λŒ€μƒμœΌλ‘œ Pull Request μƒμ„±ν•˜λ©΄, 과제 제좜이 μ™„λ£Œλ©λ‹ˆλ‹€!(E.g, main <== KDTX_ParkYoungWoong)
  • main ν˜Ήμ€ λ‹€λ₯Έ μ‚¬λžŒμ˜ 브랜치둜 μ ˆλŒ€ λ³‘ν•©ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ„Έμš”!
  • Pull Requestμ—μ„œ λ³΄μ΄λŠ” μ„€λͺ…을 λ‹€λ₯Έ μ‚¬λžŒλ“€μ΄ μ΄ν•΄ν•˜κΈ° 쉽도둝 κΌΌκΌΌν•˜κ²Œ μž‘μ„±ν•˜μ„Έμš”!
  • Pull Requestμ—μ„œ 과제 제좜 ν›„ μ ˆλŒ€ 병합(Merge)ν•˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•˜μ„Έμš”!
  • 과제 μˆ˜ν–‰ 및 제좜 κ³Όμ •μ—μ„œ λ¬Έμ œκ°€ λ°œμƒν•œ 경우, λ°”λ‘œ λ‹΄λ‹Ή λ©˜ν† λ‚˜ κ°•μ‚¬μ—μ„œ μ–˜κΈ°ν•˜μ„Έμš”!

API μ‚¬μš©λ²•

λͺ¨λ“  API μš”μ²­(Request) headers에 μ•„λž˜ 정보가 κΌ­ 포함돼야 ν•©λ‹ˆλ‹€!
username은 KDT5_TeamX와 같이 λ³Έλͺ… ν˜Ήμ€ νŒ€ 이름을 포함해야 ν•©λ‹ˆλ‹€!
확인할 수 μ—†λŠ” μ‚¬μš©μžλ‚˜ νŒ€μ˜ DB μ •λ³΄λŠ” μž„μ˜λ‘œ μ‚­μ œλ  수 μžˆμŠ΅λ‹ˆλ‹€!

{
  "content-type": "application/json",
  "apikey": "KDT5_nREmPe9B",
  "username": "KDT5_TeamX"
}

인증

'인증' κ΄€λ ¨ APIλŠ” λͺ¨λ‘ 일반 μ‚¬μš©μž μ „μš©μž…λ‹ˆλ‹€.

νšŒμ›κ°€μž…

μ‚¬μš©μžκ°€ username에 μ’…μ†λ˜μ–΄ νšŒμ›κ°€μž…ν•©λ‹ˆλ‹€.

  • μ‚¬μš©μž λΉ„λ°€λ²ˆν˜ΈλŠ” μ•”ν˜Έν™”ν•΄ μ €μž₯ν•©λ‹ˆλ‹€.(κ΄€λ¦¬μžλŠ” 확인할 수 μ—†μŠ΅λ‹ˆλ‹€!)
  • ν”„λ‘œν•„ μ΄λ―Έμ§€λŠ” 1MB μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/signup
  \ -X 'POST'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  email: string // μ‚¬μš©μž 아이디 (ν•„μˆ˜!)
  password: string // μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ, 8자 이상 (ν•„μˆ˜!)
  displayName: string // μ‚¬μš©μž 이름, 20자 μ΄ν•˜ (ν•„μˆ˜!)
  profileImgBase64?: string // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(base64) - jpg, jpeg, webp, png, gif, svg
}
{
  "email": "thesecon@gmail.com",
  "password": "********",
  "displayName": "ParkYoungWoong",
  "profileImgBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAf...(μƒλž΅)"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue {
  user: { // νšŒμ›κ°€μž…ν•œ μ‚¬μš©μž 정보
    email: string // μ‚¬μš©μž 아이디
    displayName: string // μ‚¬μš©μž ν‘œμ‹œ 이름
    profileImg: string | null // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(URL)
  }
  accessToken: string // μ‚¬μš©μž μ ‘κ·Ό 토큰
}
{
  "user": {
    "email": "thesecon@gmail.com",
    "displayName": "ParkYoungWoong",
    "profileImg": "https://storage.googleapis.com/heropy-api/vjbtIrh5dGv163442.png"
  },
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IlM3WDhpQ...(μƒλž΅)"
}

둜그인

  • λ°œκΈ‰λœ accessToken은 24μ‹œκ°„ ν›„ λ§Œλ£Œλ©λ‹ˆλ‹€.(만료 ν›„ λ‹€μ‹œ 둜그인 ν•„μš”)
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/login
  \ -X 'POST'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  email: string // μ‚¬μš©μž 아이디 (ν•„μˆ˜!)
  password: string // μ‚¬μš©μž λΉ„λ°€λ²ˆν˜Έ (ν•„μˆ˜!)
}
{
  "email": "thesecon@gmail.com",
  "password": "********"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue {
  user: { // νšŒμ›κ°€μž…ν•œ μ‚¬μš©μž 정보
    email: string // μ‚¬μš©μž 아이디
    displayName: string // μ‚¬μš©μž ν‘œμ‹œ 이름
    profileImg: string | null // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(URL)
  }
  accessToken: string // μ‚¬μš©μž μ ‘κ·Ό 토큰
}
{
  "user": {
    "email": "thesecon@gmail.com",
    "displayName": "ParkYoungWoong",
    "profileImg": "https://storage.googleapis.com/heropy-api/vAKjlJ-Gx5v163442.png"
  },
  "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjlQS3I...(μƒλž΅)"
}

인증 확인

curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/me
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue {
  email: string // μ‚¬μš©μž 아이디
  displayName: string // μ‚¬μš©μž ν‘œμ‹œ 이름
  profileImg: string | null // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(URL)
}
{
  "email": "thesecon@gmail.com",
  "displayName": "ParkYoungWoong",
  "profileImg": "https://storage.googleapis.com/heropy-api/vAKjlJ-Gx5v163442.png"
}

λ‘œκ·Έμ•„μ›ƒ

curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/logout
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true // λ‘œκ·Έμ•„μ›ƒ 처리 μƒνƒœ

μ‚¬μš©μž 정보 μˆ˜μ •

curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/user
  \ -X 'PUT'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  displayName?: string // μƒˆλ‘œμš΄ ν‘œμ‹œ 이름
  profileImgBase64?: string // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(base64) - jpg, jpeg, webp, png, gif, svg
  oldPassword?: string // κΈ°μ‘΄ λΉ„λ°€λ²ˆν˜Έ
  newPassword?: string // μƒˆλ‘œμš΄ λΉ„λ°€λ²ˆν˜Έ
}
{
  "oldPassword": "********",
  "newPassword": "**********"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue {
  email: string // μ‚¬μš©μž 아이디
  displayName: string // μ‚¬μš©μž ν‘œμ‹œ 이름
  profileImg: string | null // μ‚¬μš©μž ν”„λ‘œν•„ 이미지(URL)
}
{
  "email": "thesecon@gmail.com",
  "displayName": "ParkYoungWoong",
  "profileImg": "https://storage.googleapis.com/heropy-api/vAKjlJ-Gx5v163442.png"
}

μ‚¬μš©μž λͺ©λ‘ 쑰회

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/auth/users
  \ -X 'GET'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = User[]

interface User {
  email: string // μ‚¬μš©μž 아이디
  displayName: string // μ‚¬μš©μž ν‘œμ‹œ 이름
  profileImg: string // μ‚¬μš©μž ν”„λ‘œν•„ 이미지 URL
}
[
  {
    "email": "thesecon@gmail.com",
    "displayName": "HEROPY",
    "profileImg": null
  },
  {
    "email": "neo@zillinks.com",
    "displayName": "λ°•μ˜μ›…",
    "profileImg": "https://storage.googleapis.com/heropy-api/Z_una7lyijv074804.png"
  },
  {
    "email": "test@test.com",
    "displayName": "κ΄€λ¦¬μž",
    "profileImg": "https://storage.googleapis.com/heropy-api/ZXcXjwsB7nv121507.png"
  }
]

κ³„μ’Œ

'κ³„μ’Œ' κ΄€λ ¨ APIλŠ” λͺ¨λ‘ 일반 μ‚¬μš©μž μ „μš©μž…λ‹ˆλ‹€.

선택 κ°€λŠ₯ν•œ 은행 λͺ©λ‘ 쑰회

  • 은행 λ‹Ή ν•˜λ‚˜μ˜ κ³„μ’Œλ§Œ ν—ˆμš©λ©λ‹ˆλ‹€.
  • μ‚¬μš©μžκ°€ κ³„μ’Œλ₯Ό μΆ”κ°€ν•˜λ©΄, ν•΄λ‹Ή 은행 정보 disabled 속성이 true둜 λ³€κ²½λ©λ‹ˆλ‹€.
  • 은행 정보 digits μ†μ„±μ˜ 숫자λ₯Ό λͺ¨λ‘ λ”ν•˜λ©΄ 각 μ€ν–‰μ˜ μœ νš¨ν•œ κ³„μ’Œλ²ˆν˜Έ 길이가 λ©λ‹ˆλ‹€.
  • [3, 2, 4, 3] => 123-12-1234-123
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account/banks
  \ -X 'GET'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = Bank[] // 선택 κ°€λŠ₯ν•œ 은행 정보 λͺ©λ‘

interface Bank { // 선택 κ°€λŠ₯ν•œ 은행 정보
  name: string // 은행 이름
  code: string // 은행 μ½”λ“œ
  digits: number[] // 은행 κ³„μ’Œ 자릿수
  disabled: boolean // μ‚¬μš©μžκ°€ μΆ”κ°€ν•œ κ³„μ’Œ μ—¬λΆ€
}
[
  {
    "name": "KBꡭ민은행",
    "code": "004",
    "digits": [3, 2, 4, 3],
    "disabled": false
  },
  {
    "name": "μ‹ ν•œμ€ν–‰",
    "code": "088",
    "digits": [3, 3, 6],
    "disabled": true
  },
  {
    "name": "μš°λ¦¬μ€ν–‰",
    "code": "020",
    "digits": [4, 3, 6],
    "disabled": true
  },
  {
    "name": "ν•˜λ‚˜μ€ν–‰",
    "code": "081",
    "digits": [3, 6, 5],
    "disabled": false
  },
  {
    "name": "케이뱅크",
    "code": "089",
    "digits": [3, 3, 6],
    "disabled": false
  },
  {
    "name": "μΉ΄μΉ΄μ˜€λ±…ν¬",
    "code": "090",
    "digits": [4, 2, 7],
    "disabled": false
  },
  {
    "name": "NHλ†ν˜‘μ€ν–‰",
    "code": "011",
    "digits": [3, 4, 4, 2],
    "disabled": false
  }
]

κ³„μ’Œ λͺ©λ‘ 및 μž”μ•‘ 쑰회

  • κ³„μ’Œλ²ˆν˜ΈλŠ” μΌλΆ€λ§Œ λ…ΈμΆœλ©λ‹ˆλ‹€. E.g. "123-XXXX-XXXX-XX"
  • μž”μ•‘μ˜ λ‹¨μœ„λŠ” '원화(οΏ¦)'μž…λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account
  \ -X 'GET'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue {
  totalBalance: number // μ‚¬μš©μž κ³„μ’Œ μž”μ•‘ 총합
  accounts: Bank[] // μ‚¬μš©μž κ³„μ’Œ 정보 λͺ©λ‘
}

interface Bank { // μ‚¬μš©μž κ³„μ’Œ 정보
  id: string // κ³„μ’Œ ID
  bankName: string // 은행 이름
  bankCode: string // 은행 μ½”λ“œ
  accountNumber: string // κ³„μ’Œ 번호
  balance: number // κ³„μ’Œ μž”μ•‘
}
{
  "totalBalance": 5999900,
  "accounts": [
    {
      "id": "jQMfKla8vOIFELA3mAXv",
      "bankName": "NHλ†ν˜‘μ€ν–‰",
      "bankCode": "011",
      "accountNumber": "356-XXXX-XXXX-XX",
      "balance": 2999900
    },
    {
      "id": "wiPgsXvMAmcLw8AuRHIi",
      "bankName": "KBꡭ민은행",
      "bankCode": "004",
      "accountNumber": "123-XX-XXXX-XXX",
      "balance": 3000000
    }
  ]
}

κ³„μ’Œ μ—°κ²°

  • μ—°κ²°λœ κ³„μ’Œ μž”μ•‘μ—λŠ” μžλ™μœΌλ‘œ κΈ°λ³Έ '3λ°±λ§Œμ›'이 μΆ”κ°€λ©λ‹ˆλ‹€.
  • μš”μ²­ν•˜λŠ” κ³„μ’Œλ²ˆν˜Έμ™€ μ „ν™”λ²ˆν˜Έμ—λŠ” - ꡬ뢄이 μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account 
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  bankCode: string // μ—°κ²°ν•  은행 μ½”λ“œ (ν•„μˆ˜!)
  accountNumber: string // μ—°κ²°ν•  κ³„μ’Œλ²ˆν˜Έ (ν•„μˆ˜!)
  phoneNumber: string // μ‚¬μš©μž μ „ν™”λ²ˆν˜Έ (ν•„μˆ˜!)
  signature: boolean // μ‚¬μš©μž μ„œλͺ… (ν•„μˆ˜!)
}
{
  "bankCode": "088",
  "accountNumber": "123456789012",
  "phoneNumber": "01012345678",
  "signature": true
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue { // μ—°κ²°λœ κ³„μ’Œ 정보
  id: string // κ³„μ’Œ ID
  bankName: string // 은행 이름
  bankCode: string // 은행 μ½”λ“œ
  accountNumber: string // κ³„μ’Œ 번호
  balance: number // κ³„μ’Œ μž”μ•‘
}
{
  "id": "1qRFC6Ey5VkSu6nyj5Ba",
  "bankName": "μ‹ ν•œμ€ν–‰",
  "bankCode": "088",
  "accountNumber": "123-XXX-XXXXXX",
  "balance": 3000000
}

κ³„μ’Œ 해지

  • ν•΄μ§€ν•œ κ³„μ’ŒλŠ” λ‹€μ‹œ 연결해도 μž”μ•‘μ΄ λ°˜μ˜λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.(κΈ°λ³Έ κΈˆμ•‘μœΌλ‘œ μΆ”κ°€λ©λ‹ˆλ‹€)
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/account 
  \ -X 'DELETE'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  accountId: string // κ³„μ’Œ ID (ν•„μˆ˜!)
  signature: boolean // μ‚¬μš©μž μ„œλͺ… (ν•„μˆ˜!)
}
{
  "accountId": "jQMfKla8vOIFELA3mAXv",
  "signature": true
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true  // κ³„μ’Œ 해지 처리 μƒνƒœ

μ œν’ˆ

'μ œν’ˆ' κ΄€λ ¨ APIλŠ” κ΄€λ¦¬μž μ „μš©κ³Ό 일반 μ‚¬μš©μž μ „μš©μœΌλ‘œ κ΅¬λΆ„λ©λ‹ˆλ‹€.
곡용 API도 μžˆμœΌλ‹ˆ μ£Όμ˜ν•˜μ„Έμš”!

λͺ¨λ“  μ œν’ˆ 쑰회

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
  • 상세 정보가 μ•„λ‹Œ κΈ°λ³Έ μ •λ³΄μ˜ μ œν’ˆ μ„€λͺ…은 100μžκΉŒμ§€λ§Œ ν¬ν•¨λ©λ‹ˆλ‹€.
  • 상세 정보가 μ•„λ‹Œ κΈ°λ³Έ μ •λ³΄μ˜ μ œν’ˆ 상세 사진은 ν¬ν•¨λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • μ œν’ˆ ν• μΈμœ¨(discountRate)은 μ œν’ˆ 가격과 직접 관계가 μ—†λŠ” λ‹¨μˆœ λ©”λͺ¨ μ†μ„±μž…λ‹ˆλ‹€.
  • μ œν’ˆ ν• μΈμœ¨μ΄ μ—†λŠ” 경우, 0으둜 ν‘œμ‹œλ©λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products 
  \ -X 'GET'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = Product[] // κ΄€λ¦¬ν•˜λŠ” λͺ¨λ“  μ œν’ˆμ˜ λͺ©λ‘

interface Product { // μ œν’ˆ 정보
  id: string // μ œν’ˆ ID
  title: string // μ œν’ˆ 이름
  price: number // μ œν’ˆ 가격
  description: string // μ œν’ˆ μ„€λͺ…(μ΅œλŒ€ 100자)
  tags: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnail: string | null // μ œν’ˆ 썸넀일 이미지(URL)
  isSoldOut: boolean // μ œν’ˆ 맀진 μ—¬λΆ€
  discountRate: number // μ œν’ˆ ν• μΈμœ¨
}
[
  {
    "id": "cFmeC7aY5KjZbBAdJE9y",
    "title": "μ‚Όμ„±μ „μž 슀마트λͺ¨λ‹ˆν„° M7 S43AM700",
    "price": 639000,
    "description": "107.9cm(43인치) / μ™€μ΄λ“œ(16:9) / 평면 / VA / 3840 x 2160(4K UHD) / ν”½μ…€ν”ΌμΉ˜: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
    "tags": [
      "κ°€μ „",
      "λͺ¨λ‹ˆν„°",
      "컴퓨터"
    ],
    "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
    "isSoldOut": false,
    "discountRate": 20
  },
  {
    "id": "nbqtQvEivYwEXTDet7YM",
    "title": "MacBook Pro 16",
    "price": 3360000,
    "description": "μ—­λŒ€ κ°€μž₯ κ°•λ ₯ν•œ MacBook Proκ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 졜초의 ν”„λ‘œμš© Apple Silicon인 M1 Pro λ˜λŠ” M1 Max 칩을 νƒ‘μž¬ν•΄ μœμ‚΄κ°™μ΄ λΉ λ₯Έ μ†λ„λŠ” λ¬Όλ‘ , 획기적인 μ„±",
    "tags": [
      "κ°€μ „",
      "λ…ΈνŠΈλΆ",
      "컴퓨터"
    ],
    "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
    "isSoldOut": false,
    "discountRate": 0
  }
]

전체 거래(판맀) λ‚΄μ—­

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/all 
  \ -X 'GET'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type RequestValue = TransactionDetail[] // λͺ¨λ“  거래 λ‚΄μ—­μ˜ λͺ©λ‘

interface TransactionDetail { // 거래 λ‚΄μ—­ 정보
  detailId: string // 거래 λ‚΄μ—­ ID
  user: { // κ±°λž˜ν•œ μ‚¬μš©μž 정보
    email: string
    displayName: string
    profileImg: string | null
  }
  account: { // κ±°λž˜ν•œ μ‚¬μš©μžμ˜ κ³„μ’Œ 정보
    bankName: string
    bankCode: string
    accountNumber: string
  }
  product: { // κ±°λž˜ν•œ μ œν’ˆ 정보
    productId: string
    title: string
    price: number
    description: string
    tags: string[]
    thumbnail: string | null
    discountRate: number
  }
  reservation: Reservation | null // κ±°λž˜ν•œ μ œν’ˆμ˜ μ˜ˆμ•½ 정보
  timePaid: string // μ œν’ˆμ„ κ±°λž˜ν•œ μ‹œκ°„
  isCanceled: boolean // 거래 μ·¨μ†Œ μ—¬λΆ€
  done: boolean // 거래 μ™„λ£Œ μ—¬λΆ€
}

interface Reservation {
  start: string // μ˜ˆμ•½ μ‹œμž‘ μ‹œκ°„
  end: string // μ˜ˆμ•½ μ’…λ£Œ μ‹œκ°„
  isCanceled: boolean // μ˜ˆμ•½ μ·¨μ†Œ μ—¬λΆ€
  isExpired: boolean // μ˜ˆμ•½ 만료 μ—¬λΆ€
}
[
  {
    "detailId": "dMhfxyrAupQP18OYmywy",
    "user": {
      "email": "thesecon@gmail.com",
      "displayName": "ParkYoungWoong",
      "profileImg": "https://storage.googleapis.com/heropy-api/vsLRqTlPO5v200111.png"
    },
    "account": {
      "bankName": "KBꡭ민은행",
      "bankCode": "004",
      "accountNumber": "123-XX-XXXX-XXX"
    },
    "product": {
      "productId": "cFmeC7aY5KjZbBAdJE9y",
      "title": "μ‚Όμ„±μ „μž 슀마트λͺ¨λ‹ˆν„° M7 S43AM700",
      "price": 639000,
      "description": "107.9cm(43인치) / μ™€μ΄λ“œ(16:9) / 평면 / VA / 3840 x 2160(4K UHD) / ν”½μ…€ν”ΌμΉ˜: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
      "tags": [
        "κ°€μ „",
        "λͺ¨λ‹ˆν„°",
        "컴퓨터"
      ],
      "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
      "discountRate": 0
    },
    "reservation": null,
    "timePaid": "2021-11-07T20:01:49.100Z",
    "isCanceled": false,
    "done": false
  }
]

μ˜ˆμ•½ 정보(reservation)κ°€ μžˆλŠ” 경우:

[
  {
    "reservation": {
      "start": "2021-11-12T06:00:00.000Z",
      "end": "2021-11-12T07:00:00.000Z",
      "isCanceled": false,
      "isExpired": true
    }
  }
]

거래(판맀) λ‚΄μ—­ μ™„λ£Œ/μ·¨μ†Œ 및 ν•΄μ œ

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
  • 거래 내역을 μ·¨μ†Œν•˜λ©΄, μ˜ˆμ•½λ„ 같이 μ·¨μ†Œλ©λ‹ˆλ‹€.
  • 거래 내역을 μ·¨μ†Œ ν•΄μ œν•˜λ©΄, μ˜ˆμ•½λ„ 같이 μ·¨μ†Œκ°€ ν•΄μ œλ©λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/:detailId 
  \ -X 'PUT'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  isCanceled?: boolean // 거래 μ·¨μ†Œ μ—¬λΆ€ (μ‚¬μš©μžμ˜ 'μ œν’ˆ 거래(ꡬ맀) μ·¨μ†Œ' μƒνƒœμ™€ κ°™μŠ΅λ‹ˆλ‹€)
  done?: boolean // 거래 μ™„λ£Œ μ—¬λΆ€ (μ‚¬μš©μžμ˜ 'μ œν’ˆ 거래(ꡬ맀) ν™•μ •' μƒνƒœμ™€ κ°™μŠ΅λ‹ˆλ‹€)
}
{
  "isCanceled": true
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true // 거래 λ‚΄μ—­ μ™„λ£Œ/μ·¨μ†Œ 및 ν•΄μ œ 처리 μƒνƒœ

μ œν’ˆ μΆ”κ°€

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
  • 파일(사진)은 Base64둜 μš”μ²­ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ œν’ˆ 썸넀일 사진은 1MB μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
  • μ œν’ˆ 상세 사진은 4MB μ΄ν•˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.
  • μ œν’ˆ ν• μΈμœ¨(discountRate)은 μ œν’ˆ 가격과 직접 관계가 μ—†λŠ” λ‹¨μˆœ λ©”λͺ¨ μ†μ„±μž…λ‹ˆλ‹€.
  • μ œν’ˆ ν• μΈμœ¨μ€ 0~99 사이 숫자λ₯Ό μž…λ ₯ν•˜μ„Έμš”. λ§Œμ•½ ν• μΈμœ¨μ΄ '20%'인 경우, 20으둜 μž…λ ₯ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • μ œν’ˆ ν• μΈμœ¨μ„ μž…λ ₯ν•˜μ§€ μ•ŠμœΌλ©΄, 0으둜 μ μš©λ©λ‹ˆλ‹€.
// 할인 μ „ 가격을 계산!
const priceBeforeDiscount = price * 100 / (100 - discountRate)
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products 
  \ -X 'POST'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  title: string // μ œν’ˆ 이름 (ν•„μˆ˜!)
  price: number // μ œν’ˆ 가격 (ν•„μˆ˜!)
  description: string // μ œν’ˆ 상세 μ„€λͺ… (ν•„μˆ˜!)
  tags?: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnailBase64?: string // μ œν’ˆ 썸넀일(λŒ€ν‘œ) 사진(base64) - jpg, jpeg, webp, png, gif, svg
  photoBase64?: string // μ œν’ˆ 상세 사진(base64) - jpg, jpeg, webp, png, gif, svg
  discountRate?: number // μ œν’ˆ ν• μΈμœ¨
}
{
  "title": "MacBook Pro 16",
  "price": 3360000,
  "description": "μ—­λŒ€ κ°€μž₯ κ°•λ ₯ν•œ MacBook Proκ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 졜초의 ν”„λ‘œμš© Apple Silicon인 M1 Pro λ˜λŠ” M1 Max 칩을 νƒ‘μž¬ν•΄ μœμ‚΄κ°™μ΄ λΉ λ₯Έ μ†λ„λŠ” λ¬Όλ‘ , 획기적인 μ„±λŠ₯κ³Ό λ†€λΌμš΄ 배터리 μ‚¬μš© μ‹œκ°„μ„ μžλž‘ν•˜μ£ . 여기에 μ‹œμ„ μ„ μ‚¬λ‘œμž‘λŠ” Liquid Retina XDR λ””μŠ€ν”Œλ ˆμ΄, Mac λ…ΈνŠΈλΆ 사상 졜고의 카메라 및 μ˜€λ””μ˜€ 그리고 더할 λ‚˜μœ„ 없이 λ‹€μ–‘ν•œ ν¬νŠΈκΉŒμ§€. κΈ°μ‘΄ κ·Έ μ–΄λ–€ μΉ΄ν…Œκ³ λ¦¬μ—λ„ μ†ν•˜μ§€ μ•ŠλŠ” λ…ΈνŠΈλΆ. μƒˆλ‘œμš΄ MacBook ProλŠ” κ·Έμ•Όλ§λ‘œ μ•Όμˆ˜μž…λ‹ˆλ‹€.",
  "tags": [
    "κ°€μ „",
    "λ…ΈνŠΈλΆ",
    "컴퓨터"
  ],
  "thumbnailBase64": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUg...(μƒλž΅)"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue { // μΆ”κ°€ν•œ μ œν’ˆμ˜ 상세 λ‚΄μš©
  id: string // μ œν’ˆ ID
  title: string // μ œν’ˆ 이름
  price: number // μ œν’ˆ 가격
  description: string // μ œν’ˆ 상세 μ„€λͺ…
  tags: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnail: string | null // μ œν’ˆ 썸넀일 이미지(URL)
  photo: string | null // μ œν’ˆ 상세 이미지(URL)
  isSoldOut: boolean // μ œν’ˆ 맀진 μ—¬λΆ€
  discountRate: number // μ œν’ˆ ν• μΈμœ¨
}
{
  "id": "nbqtQvEivYwEXTDet7YM",
  "title": "MacBook Pro 16",
  "price": 3360000,
  "description": "μ—­λŒ€ κ°€μž₯ κ°•λ ₯ν•œ MacBook Proκ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 졜초의 ν”„λ‘œμš© Apple Silicon인 M1 Pro λ˜λŠ” M1 Max 칩을 νƒ‘μž¬ν•΄ μœμ‚΄κ°™μ΄ λΉ λ₯Έ μ†λ„λŠ” λ¬Όλ‘ , 획기적인 μ„±λŠ₯κ³Ό λ†€λΌμš΄ 배터리 μ‚¬μš© μ‹œκ°„μ„ μžλž‘ν•˜μ£ . 여기에 μ‹œμ„ μ„ μ‚¬λ‘œμž‘λŠ” Liquid Retina XDR λ””μŠ€ν”Œλ ˆμ΄, Mac λ…ΈνŠΈλΆ 사상 졜고의 카메라 및 μ˜€λ””μ˜€ 그리고 더할 λ‚˜μœ„ 없이 λ‹€μ–‘ν•œ ν¬νŠΈκΉŒμ§€. κΈ°μ‘΄ κ·Έ μ–΄λ–€ μΉ΄ν…Œκ³ λ¦¬μ—λ„ μ†ν•˜μ§€ μ•ŠλŠ” λ…ΈνŠΈλΆ. μƒˆλ‘œμš΄ MacBook ProλŠ” κ·Έμ•Όλ§λ‘œ μ•Όμˆ˜μž…λ‹ˆλ‹€.",
  "tags": [
    "κ°€μ „",
    "λ…ΈνŠΈλΆ",
    "컴퓨터"
  ],
  "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
  "photo": "https://storage.googleapis.com/heropy-api/voihKb3NLGcv195257.png",
  "isSoldOut": false,
  "discountRate": 0
}

μ œν’ˆ μˆ˜μ •

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
  • μ‚¬μš©μžμ˜ ꡬ맀 λ‚΄μ—­ 확인을 μœ„ν•΄, μ œν’ˆμ„ μ‹€μ œλ‘œλŠ” μ‚­μ œν•˜μ§€ μ•Šκ³  맀진(Sold Out) μ²˜λ¦¬ν•΄μ•Ό ν•©λ‹ˆλ‹€.
  • 맀진은 λ‹€μ‹œ ν•΄μ œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/:productId
  \ -X 'PUT'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  title?: string // μ œν’ˆ 이름
  price?: number // μ œν’ˆ 가격
  description?: string // μ œν’ˆ 상세 μ„€λͺ…
  tags?: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnailBase64?: string // μ œν’ˆ 썸넀일(λŒ€ν‘œ) 사진(base64) - jpg, jpeg, webp, png, gif, svg
  photoBase64?: string // μ œν’ˆ 상세 사진(base64) - jpg, jpeg, webp, png, gif, svg
  isSoldOut?: boolean // μ œν’ˆ 맀진 μ—¬λΆ€
  discountRate?: number // μ œν’ˆ ν• μΈμœ¨
}
{
  "price": 1500
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue { // μˆ˜μ •ν•œ μ œν’ˆμ˜ 상세 λ‚΄μš©
  id: string // μ œν’ˆ ID
  title: string // μ œν’ˆ 이름
  price: number // μ œν’ˆ 가격
  description: string // μ œν’ˆ 상세 μ„€λͺ…
  tags: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnail: string | null // μ œν’ˆ 썸넀일 이미지(URL)
  photo: string | null // μ œν’ˆ 상세 이미지(URL)
  isSoldOut: boolean // μ œν’ˆ 맀진 μ—¬λΆ€ 
  discountRate: number // μ œν’ˆ ν• μΈμœ¨
}
{
  "id": "nbqtQvEivYwEXTDet7YM",
  "title": "MacBook Pro 16",
  "price": 1500,
  "description": "μ—­λŒ€ κ°€μž₯ κ°•λ ₯ν•œ MacBook Proκ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 졜초의 ν”„λ‘œμš© Apple Silicon인 M1 Pro λ˜λŠ” M1 Max 칩을 νƒ‘μž¬ν•΄ μœμ‚΄κ°™μ΄ λΉ λ₯Έ μ†λ„λŠ” λ¬Όλ‘ , 획기적인 μ„±λŠ₯κ³Ό λ†€λΌμš΄ 배터리 μ‚¬μš© μ‹œκ°„μ„ μžλž‘ν•˜μ£ . 여기에 μ‹œμ„ μ„ μ‚¬λ‘œμž‘λŠ” Liquid Retina XDR λ””μŠ€ν”Œλ ˆμ΄, Mac λ…ΈνŠΈλΆ 사상 졜고의 카메라 및 μ˜€λ””μ˜€ 그리고 더할 λ‚˜μœ„ 없이 λ‹€μ–‘ν•œ ν¬νŠΈκΉŒμ§€. κΈ°μ‘΄ κ·Έ μ–΄λ–€ μΉ΄ν…Œκ³ λ¦¬μ—λ„ μ†ν•˜μ§€ μ•ŠλŠ” λ…ΈνŠΈλΆ. μƒˆλ‘œμš΄ MacBook ProλŠ” κ·Έμ•Όλ§λ‘œ μ•Όμˆ˜μž…λ‹ˆλ‹€.",
  "tags": [
    "κ°€μ „",
    "λ…ΈνŠΈλΆ",
    "컴퓨터"
  ],
  "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
  "photo": "https://storage.googleapis.com/heropy-api/voihKb3NLGcv195257.png",
  "isSoldOut": false,
  "discountRate": 0
}

μ œν’ˆ μ‚­μ œ

  • κ΄€λ¦¬μž μ „μš© APIμž…λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/:productId
  \ -X 'DELETE'
  \ -H 'masterKey: true'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true // μ œν’ˆ μ‚­μ œ 처리 μƒνƒœ

단일 μ œν’ˆ 상세 쑰회

  • 곡용 APIμž…λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/:productId
  \ -X 'GET'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface ResponseValue { // μ œν’ˆμ˜ 상세 λ‚΄μš©
  id: string // μ œν’ˆ ID
  title: string // μ œν’ˆ 이름
  price: number // μ œν’ˆ 가격
  description: string // μ œν’ˆ 상세 μ„€λͺ…
  tags: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnail: string | null // μ œν’ˆ 썸넀일 이미지(URL)
  photo: string | null // μ œν’ˆ 상세 이미지(URL)
  isSoldOut: boolean // μ œν’ˆ 맀진 μ—¬λΆ€ 
  reservations: Reservation[] // μ œν’ˆμ˜ λͺ¨λ“  μ˜ˆμ•½ 정보 λͺ©λ‘
  discountRate: number // μ œν’ˆ ν• μΈμœ¨
}

interface Reservation {
  start: string // μ˜ˆμ•½ μ‹œμž‘ μ‹œκ°„
  end: string // μ˜ˆμ•½ μ’…λ£Œ μ‹œκ°„
  isCanceled: boolean // μ˜ˆμ•½ μ·¨μ†Œ μ—¬λΆ€
  isExpired: boolean // μ˜ˆμ•½ 만료 μ—¬λΆ€
}
{
  "id": "nbqtQvEivYwEXTDet7YM",
  "title": "MacBook Pro 16",
  "price": 3360000,
  "description": "μ—­λŒ€ κ°€μž₯ κ°•λ ₯ν•œ MacBook Proκ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 졜초의 ν”„λ‘œμš© Apple Silicon인 M1 Pro λ˜λŠ” M1 Max 칩을 νƒ‘μž¬ν•΄ μœμ‚΄κ°™μ΄ λΉ λ₯Έ μ†λ„λŠ” λ¬Όλ‘ , 획기적인 μ„±λŠ₯κ³Ό λ†€λΌμš΄ 배터리 μ‚¬μš© μ‹œκ°„μ„ μžλž‘ν•˜μ£ . 여기에 μ‹œμ„ μ„ μ‚¬λ‘œμž‘λŠ” Liquid Retina XDR λ””μŠ€ν”Œλ ˆμ΄, Mac λ…ΈνŠΈλΆ 사상 졜고의 카메라 및 μ˜€λ””μ˜€ 그리고 더할 λ‚˜μœ„ 없이 λ‹€μ–‘ν•œ ν¬νŠΈκΉŒμ§€. κΈ°μ‘΄ κ·Έ μ–΄λ–€ μΉ΄ν…Œκ³ λ¦¬μ—λ„ μ†ν•˜μ§€ μ•ŠλŠ” λ…ΈνŠΈλΆ. μƒˆλ‘œμš΄ MacBook ProλŠ” κ·Έμ•Όλ§λ‘œ μ•Όμˆ˜μž…λ‹ˆλ‹€.",
  "tags": [
    "κ°€μ „",
    "λ…ΈνŠΈλΆ",
    "컴퓨터"
  ],
  "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
  "photo": "https://storage.googleapis.com/heropy-api/voihKb3NLGcv195257.png",
  "isSoldOut": false,
  "reservations": [],
  "discountRate": 0
}

μ˜ˆμ•½ 정보(reservation)κ°€ μžˆλŠ” 경우:

{
  "reservations": [
    {
      "reservation": {
        "start": "2021-11-12T06:00:00.000Z",
        "end": "2021-11-12T07:00:00.000Z",
        "isCanceled": false,
        "isExpired": true
      }
    }
  ] 
}

μ œν’ˆ 검색

  • μ‚¬μš©μž μ „μš© APIμž…λ‹ˆλ‹€.
  • μ œν’ˆ 이름과 νƒœκ·Έλ₯Ό λ™μ‹œμ— 검색할 수 있고, 'And'(κ²€μƒ‰ν•œ 이름과 νƒœκ·Έ λͺ¨λ‘ ν¬ν•¨λœ μ œν’ˆ) 쑰건으둜 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ œν’ˆ 이름과 νƒœκ·Έ λͺ¨λ‘ ν¬ν•¨ν•˜μ§€ μ•ŠμœΌλ©΄, λͺ¨λ“  μ œν’ˆμ˜ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • μ œν’ˆμ˜ κΈ°λ³Έ μ •λ³΄λ§Œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • λ§€μ§„λœ μ œν’ˆμ€ κ²€μƒ‰λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/search
  \ -X 'POST'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  searchText?: string // 검색할 μ œν’ˆ 이름
  searchTags?: string[] // 검색할 μ œν’ˆ νƒœκ·Έ
}
{
  "searchText": "μ‚Όμ„±μ „μž",
  "searchTags": ["κ°€μ „"]
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = Product[] // κ΄€λ¦¬ν•˜λŠ” λͺ¨λ“  μ œν’ˆμ˜ λͺ©λ‘

interface Product { // μ œν’ˆ 정보
  id: string // μ œν’ˆ ID
  title: string // μ œν’ˆ 이름
  price: number // μ œν’ˆ 가격
  description: string // μ œν’ˆ μ„€λͺ…(μ΅œλŒ€ 100자)
  tags: string[] // μ œν’ˆ νƒœκ·Έ
  thumbnail: string | null // μ œν’ˆ 썸넀일 이미지(URL)
  discountRate: number // μ œν’ˆ ν• μΈμœ¨
}
[
  {
    "id": "cFmeC7aY5KjZbBAdJE9y",
    "title": "μ‚Όμ„±μ „μž 슀마트λͺ¨λ‹ˆν„° M7 S43AM700",
    "price": 639000,
    "description": "107.9cm(43인치) / μ™€μ΄λ“œ(16:9) / 평면 / VA / 3840 x 2160(4K UHD) / ν”½μ…€ν”ΌμΉ˜: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
    "tags": [
      "κ°€μ „",
      "λͺ¨λ‹ˆν„°",
      "컴퓨터"
    ],
    "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
    "discountRate": 0
  }
]

μ œν’ˆ 거래(ꡬ맀) μ‹ μ²­

  • μ‚¬μš©μž μ „μš© APIμž…λ‹ˆλ‹€.
  • 거래(ꡬ맀) μ‹ μ²­μ‹œ μ—°κ²°λœ κ³„μ’Œμ—μ„œ κ²°μ œλ©λ‹ˆλ‹€.
  • κ²°μ œν•  κ³„μ’Œ(ID)λ₯Ό κΌ­ 선택해야 ν•©λ‹ˆλ‹€.(κ³„μ’Œ λͺ©λ‘ 및 μž”μ•‘ 쑰회 APIλ₯Ό μ‚¬μš©ν•˜μ„Έμš”)
  • μ„ νƒν•œ κ³„μ’Œμ˜ μž”μ•‘λ³΄λ‹€ 결제 κΈˆμ•‘μ΄ 크면 κ²°μ œκ°€ μ²˜λ¦¬λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.(μ—λŸ¬ λ°˜ν™˜)
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/buy 
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  productId: string // κ±°λž˜ν•  μ œν’ˆ ID (ν•„μˆ˜!)
  accountId: string // κ²°μ œν•  μ‚¬μš©μž κ³„μ’Œ ID (ν•„μˆ˜!)
  reservation?: { // μ˜ˆμ•½ 정보(μ˜ˆμ•½ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•˜λŠ” 경우만 ν•„μš”)
    start: string // μ˜ˆμ•½ μ‹œμž‘ μ‹œκ°„(ISO)
    end: string // μ˜ˆμ•½ μ’…λ£Œ μ‹œκ°„(ISO)
  }
}
const isoString = new Date().toISOString()
{
  "productId": "nbqtQvEivYwEXTDet7YM",
  "accountId": "Mq2KKHk8vlmr6Xkg58Fa",
  "reservation": {
    "start": "2021-11-12T06:00:00.000Z",
    "end": "2021-11-12T07:00:00.000Z"
  }
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true // 거래 μ‹ μ²­ 처리 μ—¬λΆ€

μ œν’ˆ 거래(ꡬ맀) μ·¨μ†Œ

  • μ‚¬μš©μž μ „μš© APIμž…λ‹ˆλ‹€.
  • '거래 μ·¨μ†Œ'μ‹œ κ²°μ œν•œ μ‚¬μš©μž κ³„μ’Œλ‘œ κΈˆμ•‘μ΄ ν™˜λΆˆλ©λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/cancel 
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  detailId: string // μ·¨μ†Œν•  μ œν’ˆμ˜ 거래 λ‚΄μ—­ ID
}
{
  "detailId": "dMhfxyrAupQP18OYmywy"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true // 거래 μ·¨μ†Œ 처리 μ—¬λΆ€

μ œν’ˆ 거래(ꡬ맀) ν™•μ •

  • μ‚¬μš©μž μ „μš© APIμž…λ‹ˆλ‹€.
  • '거래(ꡬ맀) ν™•μ •' ν›„μ—λŠ” '거래 μ·¨μ†Œ'λ₯Ό ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/ok 
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  detailId: string // 거래(ꡬ맀) ν™•μ •ν•  μ œν’ˆμ˜ 거래 λ‚΄μ—­ ID
}
{
  "detailId": "dMhfxyrAupQP18OYmywy"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type ResponseValue = true // 거래(ꡬ맀) ν™•μ • 처리 μ—¬λΆ€

μ œν’ˆ 전체 거래(ꡬ맀) λ‚΄μ—­

  • μ‚¬μš©μž μ „μš© APIμž…λ‹ˆλ‹€.
  • 거래 λ‚΄μ—­μ˜ κΈ°λ³Έ μ •λ³΄λ§Œ ν¬ν•¨λ©λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/details 
  \ -X 'GET'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

  • μ—†μŒ

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

type RequestValue = TransactionDetail[] // λͺ¨λ“  거래 λ‚΄μ—­μ˜ λͺ©λ‘

interface TransactionDetail { // 거래 λ‚΄μ—­ 정보
  detailId: string // 거래 λ‚΄μ—­ ID
  product: { // κ±°λž˜ν•œ μ œν’ˆ 정보
    productId: string
    title: string
    price: number
    description: string
    tags: string[]
    thumbnail: string | null
    discountRate: number // μ œν’ˆ ν• μΈμœ¨
  }
  reservation: Reservation | null // κ±°λž˜ν•œ μ œν’ˆμ˜ μ˜ˆμ•½ 정보
  timePaid: string // μ œν’ˆμ„ κ±°λž˜ν•œ μ‹œκ°„
  isCanceled: boolean // 거래 μ·¨μ†Œ μ—¬λΆ€
  done: boolean // 거래 μ™„λ£Œ μ—¬λΆ€
}

interface Reservation {
  start: string // μ˜ˆμ•½ μ‹œμž‘ μ‹œκ°„
  end: string // μ˜ˆμ•½ μ’…λ£Œ μ‹œκ°„
  isCanceled: boolean // μ˜ˆμ•½ μ·¨μ†Œ μ—¬λΆ€
  isExpired: boolean // μ˜ˆμ•½ 만료 μ—¬λΆ€
}
[
  {
    "detailId": "9jAoagzrZBkSWI5NctEB",
    "product": {
      "productId": "nbqtQvEivYwEXTDet7YM",
      "title": "MacBook Pro 16",
      "price": 3360000,
      "description": "μ—­λŒ€ κ°€μž₯ κ°•λ ₯ν•œ MacBook Proκ°€ λ“±μž₯ν–ˆμŠ΅λ‹ˆλ‹€. 졜초의 ν”„λ‘œμš© Apple Silicon인 M1 Pro λ˜λŠ” M1 Max 칩을 νƒ‘μž¬ν•΄ μœμ‚΄κ°™μ΄ λΉ λ₯Έ μ†λ„λŠ” λ¬Όλ‘ , 획기적인 μ„±",
      "tags": [
        "κ°€μ „",
        "λ…ΈνŠΈλΆ",
        "컴퓨터"
      ],
      "thumbnail": "https://storage.googleapis.com/heropy-api/vIKMk_jy4Yv195256.png",
      "discountRate": 0
    },
    "reservation": null,
    "timePaid": "2021-11-07T20:17:32.112Z",
    "isCanceled": true,
    "done": false
  },
  {
    "detailId": "dMhfxyrAupQP18OYmywy",
    "product": {
      "productId": "cFmeC7aY5KjZbBAdJE9y",
      "title": "μ‚Όμ„±μ „μž 슀마트λͺ¨λ‹ˆν„° M7 S43AM700",
      "price": 639000,
      "description": "107.9cm(43인치) / μ™€μ΄λ“œ(16:9) / 평면 / VA / 3840 x 2160(4K UHD) / ν”½μ…€ν”ΌμΉ˜: 0.2451mm / 8ms(GTG) / 300cd / 5,00",
      "tags": [
        "κ°€μ „",
        "λͺ¨λ‹ˆν„°",
        "컴퓨터"
      ],
      "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
      "discountRate": 0
    },
    "reservation": {
      "start": "2021-11-12T06:00:00.000Z",
      "end": "2021-11-12T07:00:00.000Z",
      "isCanceled": false,
      "isExpired": true
    },
    "timePaid": "2021-11-07T20:01:49.100Z",
    "isCanceled": false,
    "done": true
  }
]

단일 μ œν’ˆ 상세 거래(ꡬ맀) λ‚΄μ—­

  • μ‚¬μš©μž μ „μš© APIμž…λ‹ˆλ‹€.
curl https://asia-northeast3-heropy-api.cloudfunctions.net/api/products/transactions/detail 
  \ -X 'POST'
  \ -H 'Authorization: Bearer <accessToken>'

μš”μ²­ 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface RequestBody {
  detailId: string // 상세 λ‚΄μš©μ„ 확인할 거래(ꡬ맀) λ‚΄μ—­ ID
}
{
  "detailId": "dMhfxyrAupQP18OYmywy"
}

응닡 데이터 νƒ€μž… 및 μ˜ˆμ‹œ:

interface TransactionDetail { // 상세 거래 정보
  detailId: string // 거래 λ‚΄μ—­ ID
  account: { // κ±°λž˜ν•œ μ‚¬μš©μžμ˜ κ³„μ’Œ 정보
    bankName: string
    bankCode: string
    accountNumber: string
  }
  product: { // κ±°λž˜ν•œ μ œν’ˆ 정보
    productId: string
    title: string
    price: number
    description: string
    tags: string[]
    thumbnail: string | null
    photo: string | null
    discountRate: number // μ œν’ˆ ν• μΈμœ¨
  }
  reservation: Reservation | null // κ±°λž˜ν•œ μ œν’ˆμ˜ μ˜ˆμ•½ 정보
  timePaid: string // μ œν’ˆμ„ κ±°λž˜ν•œ μ‹œκ°„
  isCanceled: boolean // 거래 μ·¨μ†Œ μ—¬λΆ€
  done: boolean // 거래 μ™„λ£Œ μ—¬λΆ€
}

interface Reservation {
  start: string // μ˜ˆμ•½ μ‹œμž‘ μ‹œκ°„
  end: string // μ˜ˆμ•½ μ’…λ£Œ μ‹œκ°„
  isCanceled: boolean // μ˜ˆμ•½ μ·¨μ†Œ μ—¬λΆ€
  isExpired: boolean // μ˜ˆμ•½ 만료 μ—¬λΆ€
}
{
  "detailId": "dMhfxyrAupQP18OYmywy",
  "account": {
    "bankName": "KBꡭ민은행",
    "bankCode": "004",
    "accountNumber": "123-XX-XXXX-XXX"
  },
  "product": {
    "productId": "cFmeC7aY5KjZbBAdJE9y",
    "title": "μ‚Όμ„±μ „μž 슀마트λͺ¨λ‹ˆν„° M7 S43AM700",
    "price": 639000,
    "description": "107.9cm(43인치) / μ™€μ΄λ“œ(16:9) / 평면 / VA / 3840 x 2160(4K UHD) / ν”½μ…€ν”ΌμΉ˜: 0.2451mm / 8ms(GTG) / 300cd / 5,000:1 / μ΅œλŒ€ μ£Όμ‚¬μœ¨: 60Hz / HDMI 2.0 / USB Type-C / ν”Œλ¦¬μ»€ 프리 / λΈ”λ£¨λΌμ΄νŠΈ 차단 / κ²Œμž„λͺ¨λ“œ 지원 / μŠ€ν”Όμ»€ / 리λͺ¨μ»¨ / USBν—ˆλΈŒ / Wi-Fi(무선) / 슀마트TV / λΈ”λ£¨νˆ¬μŠ€ / ν‹ΈνŠΈ(μƒν•˜) / 200 x 200mm / HDR / HDR10 / 10.6kg κΈ°νšμ „ μ°¨μ„ΈλŒ€ κ²Œμž„ 라이프 PS5 맀λ ₯뢄석 관련기사 νμ†Œλ‹‰, 43인치 4K UHD 슀마트 λͺ¨λ‹ˆν„° β€˜μ‚Όμ„±μ „μž M7 S43AM700’ μΆœμ‹œ 및 할인 행사 μ‚¬μš©κΈ° μ‚Όμ„± 슀마트λͺ¨λ‹ˆν„° m7 s43am700",
    "tags": [
      "κ°€μ „",
      "λͺ¨λ‹ˆν„°",
      "컴퓨터"
    ],
    "thumbnail": "https://storage.googleapis.com/heropy-api/vBAK4MQdH5v195712.png",
    "photo": "https://storage.googleapis.com/heropy-api/vVLP-ox_zSDv195712.jpg",
    "discountRate": 0
  },
  "reservation": null,
  "timePaid": "2021-11-07T20:01:49.100Z",
  "isCanceled": false,
  "done": true
}