Skip to content
Foo edited this page Nov 28, 2021 · 27 revisions

API

Intro

Node.js의 서버가 켜져 있는 상황에서 React-Native가 get, post 등의 http 메소드로 서버에게 요청을 보내면 Node.js는 React-Native가 보낸 요청에 따라 알맞은 핸들링을 한다.

1. 계정

1-1. 회원가입

  • URL : /account/signup
  • METHOD : /POST
  • REQUEST BODY :
{
    "name" : "파람",
    "email":"param@ajou.ac.kr",
    "password":"@2345reqw"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "회원가입이 성공적으로 완료되었습니다",
    "data": {
        "_id": "6127d6d04850b74aacbb781e",
        "name": "파람",
        "email": "param@ajou.ac.kr",
        "password": "$2b$10$Li4vEUF6ghLMR4OLseVhOOTt2YYrL6Y64.KEXh41TL9cgALkXfOg6",
        "__v": 0
    }
}

실패

  1. name, email, password 중 한 개라도 비어있을 경우
{
    "status": "FAILED",
    "message": "빈 문자열입니다.",
}
  1. 닉네임 양식에 맞지 않을 경우
{
    "status": "FAILED",
    "message": "영어, 한글, 숫자만 허용하며, 2자 이상 8자 이내여야 합니다.",
}
  1. 이메일 양식에 맞지 않을 경우
{
    "status": "FAILED",
    "message": "올바르지 않은 양식입니다.",
}
  1. 비밀번호 양식에 맞지 않을 경우
{
    "status": "FAILED",
    "message": "영어, 숫자, 특수문자 혼용 8자 이상이어야 합니다.",
}
  1. 이미 가입된 사용자인 경우
{
    "status": "FAILED",
    "message": "이미 가입된 사용자입니다.",
}
  1. 기타
{
    "status": "FAILED",
    "message": "(기타 동작) 중 에러가 발생하였습니다.",
}

1-2. 로컬로그인

  • URL : /account/signin
  • METHOD : /POST
  • REQUEST BODY :
{
    "email":"param@ajou.ac.kr",
    "password":"@2345reqw"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "로그인에 성공했습니다.",
    "accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJfaWQiOiI2MTI4OWU3ZjU0ZTk2Zjc3ZDRlMWE4YzciLCJuYW1lIjoi7YyM656MIiwiaWF0IjoxNjMwMTQwODExLCJleHAiOjE2MzEzNTA0MTEsInN1YiI6InVzZXJJbmZvIn0.9-oj74u01SFFhxQW7DtCi0qsP2ST5uX3neFqBy4GVsY"
}

실패

  1. name, email, password 중 한 개라도 비어있을 경우
{
    "status": "FAILED",
    "message": "빈 문자열입니다.",
}
  1. 이메일은 있으나 비밀번호가 일치하지 않는 경우
{
    "status": "FAILED",
    "message": "올바르지 않은 비밀번호입니다.",
}
  1. 해당 이메일 유저가 존재하지 않을 경우
{
    "status": "FAILED",
    "message": "가입하지 않은 사용자입니다.",
}
  1. 기타
{
    "status": "FAILED",
    "message": "(기타 동작) 중 에러가 발생하였습니다.",
}

1-3. 중복확인

1-3-1. 이메일 체크
  • URL : /account/checkEmail
  • METHOD : /POST
  • REQUEST BODY :
{
    "email":"param@ajou.ac.kr"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "사용가능한 이메일입니다."
}

실패

{
    "status": "FAILED",
    "message": "이미 가입된 이메일입니다."
}
1-3-2. 닉네임 체크
  • URL : /account/checkName
  • METHOD : /POST
  • REQUEST BODY :
{
    "name":"maxcha98@ajou.ac.kr"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "사용가능한 닉네임입니다."
}

실패

{
    "status": "FAILED",
    "message": "이미 사용중인 닉네임입니다."
}

1-4. 토큰 재발행

  • URL : /account/regenerateToken
  • METHOD : /GET
  • HEADERS :
{
    "x-access-token" : "만료되지 않은 jwt 토큰"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "토큰을 재발행하였습니다.",
    "accessToken": "eyJhbGndhSTHK50"
}

1-5. 이메일 인증

  • URL : /account/emailAuth
  • METHOD : /POST
  • REQUEST BODY :
{
    "email":"duliesoures@gmail.com"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "이메일을 보내기에 성공하였습니다.",
    "code": "9573"
}

1-6. 사용자 프로필 이미지 업로드

  • URL : /account/images/:destination
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( destination : thumbnail ) (key : value, 'thumbnail'이라는 문자열로 고정하여 주시면 됩니다. 이미지가 저장될 S3 폴더를 말합니다.)
  • REQUEST BODY : form-data 형식
KEY VALUE DESCRIPTION
images 사용자가 첨부한 파일(ex. test1.jpg) 문자열이 아니라 파일이어야 함. 프로필이므로 최대 1개까지 업로드 가능
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "사용자 이미지를 성공적으로 저장했습니다.",
    "data": [
        {
            "fileName": "thumbnail/16926866294500.webp", // s3에서 해당 이미지를 식별하는 이름
            "fileUrl": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/thumbnail/16926866294500.webp" // s3 링크
        }
    ]
}

2. 메인

2-1. 민들레 생성

  • URL : /dandelion/create
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • REQUEST BODY :
{
    "name" : "노천 극장 뒷편",
    "location":{
        "longitude":127.04546648336702,
        "latitude":37.28187449622762
    },
    "description":"여기가 구경 핫스팟인데"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레 생성에 성공했습니다.",
    "data": {
        "createdAt": "2021-09-19T13:11:52.490Z",
        "level": 1,
        "_id": "614737180c51e4822031ded5",
        "name": "노천 극장 뒷편",
        "_creator": "6136538af29fa1655c012668",
        "location": {
            "type": "Point",
            "coordinates": [
                127.04546648336702,
                37.28187449622762
            ]
        },
        "description": "여기가 구경 핫스팟인데",
        "__v": 0
    }
}

2-2. 민들레 가져오기

  • URL : /dandelion/get
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • REQUEST BODY :
{
    "centerPosition":{
        "latitude" : 37.28326843430806,
        "longitude":127.04454697578383
    },
    "maxDistance":100 //maxDistance는 최대 몇 m까지 불러올 것인가
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레 불러오기에 성공했습니다.",
    "data": [
        {
            "name": "컵밥 먹는 곳",
            "level": 1,
            "_id": "6145e8d535a2ca50cc2054f6",
            "location": {
                "longitude": 127.04386746757788,
                "latitude": 37.2832631338081
            },
            "ovelap": false
        },
        {
            "name": "성호관 앞",
            "level": 1,
            "_id": "6145e95235a2ca50cc2054f8",
            "location": {
                "longitude": 127.04510657077695,
                "latitude": 37.28268537707143
            },
            "ovelap": false
        },
        {
            "name": "동방들",
            "level": 1,
            "_id": "6145e98935a2ca50cc2054fa",
            "location": {
                "longitude": 127.04547963410569,
                "latitude": 37.28350695642108
            },
            "ovelap": false
        }
    ]
}

2-3. 민들레 클릭(민들레 상세 정보 조회)

  • URL : /dandelion/getDetail/:dandelionId
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "currentPosition":{
        "latitude" : 37.278575439309275,
        "longitude":127.01521012887963
    }
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레 상세 정보입니다.",
    "data": [
        {
            "_id": "616c086ae27a6c277cbcc00d",
            "createdAt": "2021-10-17T11:26:34.845Z",
            "level": 1,
            "name": "추억의 달고나",
            "_creator": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907",
                "thumbnail": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/thumbnail/16926866294500.webp"
            },
            "location": {
                "longitude": 127.01521012887963,
                "latitude": 37.278575439309265
            },
            "description": "오징어게임에 나왔던 달고나 핫스팟",
            "distance": 5.007103355365494e-10, (미터 단위입니다),
            "cumulativeVisitors" : 0 (누적방문자)
            "realTimeVisitors" : 0 (실시간방문자)
            "events": 1
        }
    ]
}

2-4. 민들레 방문

  • URL : /dandelion/visit/:dandelionId
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "currentPosition":{
        "latitude" : 37.278575439309275,
        "longitude":127.01521012887963
    }
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레 방문 정보를 저장하였습니다.",
    "data": [
        {
            "_id": "616c086ae27a6c277cbcc00d",
            "createdAt": "2021-10-17T11:26:34.845Z",
            "level": 1,
            "name": "추억의 달고나",
            "_creator": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907",
                "thumbnail": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/thumbnail/16926866294500.webp"
            },
            "location": {
                "longitude": 127.01521012887963,
                "latitude": 37.278575439309265
            },
            "description": "오징어게임에 나왔던 달고나 핫스팟",
            "cumulativeVisitors": 17,
            "realTimeVisitors": 15,
            "distance": 5.007103355365494e-10, (미터 단위입니다)
            "events": 1,
            "recentImages": [
                "test1.jpg",
                "test2.jpg",
                "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/post/7247523409265676.PNG",
                "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/post/7247523410409342.PNG"
            ] (최근 이미지 링크들, 최대 8개)
        }
    ]
}

2-5. 민들레 나감

  • URL : /dandelion/exit/:dandelionId

  • METHOD : /GET

  • HEADER :( x-access-token : 토큰 값 ) (key : value)

  • PATH VARIABLES :

    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레 실시간 방문자 수가 1 감소하였습니다."
}

3. 민들레 상세 - 게시글

3-1. 게시글 생성

  • URL : /:dandelionId/post/create
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "title":"test2에 첫게시글",
    "text":"블라블라",
    "location":{
        "longitude":127.04275784194242,
        "latitude":37.28335975273373
    },
    "images":["test1.jpg","test2.jpg"]
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "게시글을 작성하였습니다.",
    "data": {
        "createdAt": "2021-10-04T08:50:51.405Z",
        "updatedAt": "2021-10-04T08:50:45.717Z",
        "likes": 0,
        "images": [
            "test1.jpg",
            "test2.jpg"
        ],
        "comments": 0,
        "_id": "615ac06b37a3bd4cc0c2f91c",
        "_user": "61365d8cd4e22a2dd4df2a6f",
        "_dandelion": "614c4ae99aa99a08e0d57c30",
        "location": {
            "type": "Point",
            "coordinates": [
                127.04275784194242,
                37.28335975273373
            ]
        },
        "title": "test2에 첫게시글",
        "text": "블라블라",
        "__v": 0
    }
}

3-2. 게시글 가져오기

  • URL : /:dandelionId/post/
  • METHOD : /GET
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value)
    • ( maxPost : 페이지마다 가져올 게시글 수 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레에 해당하는 게시글입니다.",
    "data": [
        {
            "_id": "615ac06b37a3bd4cc0c2f91c",
            "location": {
                "longitude": 127.04275784194242,
                "latitude": 37.28335975273373
            },
            "createdAt": "2021-10-04T08:50:51.405Z",
            "updatedAt": "2021-10-04T09:29:20.810Z",
            "_dandelion": "614c4ae99aa99a08e0d57c30",
            "_user": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907",
                "thumbnail":(유저 프사 s3 링크)
            },
            "title": "test2 게시글 수정",
            "text": "blahblah",
            "images": [
                "one",
                "two"
            ],
            "likes": 0,
            "comments": 0,
            "userLike": true //현재 유저가 해당 게시글 좋아요 눌렀는지 여부
        }
    ]
}

3-3. 게시글 수정

  • URL : /:dandelionId/post/update/:postId
  • METHOD : /PATCH
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
    • ( postId : 게시글의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "title":"test2 게시글 수정",
    "text":"blahblah",
    "images":["one","two"]
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "게시글이 수정되었습니다."
}

3-4. 게시글 삭제

  • URL : /:dandelionId/post/delete/:postId
  • METHOD : /DELETE
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
    • ( postId : 게시글의 ObjectId, 즉 인덱스 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "게시글을 삭제하였습니다."
}

실패

{
    "status": "SUCCESS",
    "message": (case에 따른 메세지)
}
  1. 존재하지 않는 민들레 인덱스인 경우
  2. 존재하지 않는 게시글 인덱스인 경우
  3. 게시글 인덱스가 민들레 인덱스와 매치하지 않는 경우
  4. 인덱스 타입이 잘못된 ObjectId인 경우

4. 민들레 상세 - 이벤트

4-1. 이벤트 생성

  • URL : /:dandelionId/event/create
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "title":"10.21 event test(9)",
    "text":"event test",
    "location":{
        "longitude":127.04275784194242,
        "latitude":37.28335975273373
    },
    "images":["test1.jpg","test2.jpg"], 
    "rewards":500, //리워드
    "firstComeNum":10, //선착순 사람 수
    "startDate":"2021-10-20" //시작 날짜
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "이벤트를 생성하였습니다.",
    "data": {
        "createdAt": "2021-10-21T23:46:36.516Z",
        "updatedAt": "2021-10-21T23:46:36.516Z",
        "images": [
            "test1.jpg",
            "test2.jpg"
        ],
        "isEvent": true,
        "status": 0,
        "_id": "61717d54c3ae9251b8e650fb",
        "_user": "61365d8cd4e22a2dd4df2a6f",
        "_dandelion": "614c4ae99aa99a08e0d57c30",
        "location": {
            "type": "Point",
            "coordinates": [
                127.04275784194242,
                37.28335975273373
            ]
        },
        "firstComeNum": 10,
        "title": "10.21 event test(9)",
        "text": "event test",
        "rewards": "500",
        "startDate": "2021-10-20T00:00:00.000Z",
        "__v": 0
    }
}

4-2. 이벤트 가져오기

  • URL : /:dandelionId/event/
  • METHOD : /GET
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 이벤트 수 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "민들레에 해당하는 이벤트입니다.",
    "data": [
        {
            "_id": "61717d54c3ae9251b8e650fb",
            "createdAt": "2021-10-21T23:46:36.516Z",
            "updatedAt": "2021-10-21T23:46:36.516Z",
            "images": [
                "test1.jpg",
                "test2.jpg"
            ],
            "status": 0,
            "_user": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907"
            },
            "_dandelion": "614c4ae99aa99a08e0d57c30",
            "location": {
                "longitude": 127.04275784194242,
                "latitude": 37.28335975273373
            },
            "firstComeNum": 10,
            "title": "10.21 event test(9)",
            "text": "event test",
            "rewards": "500",
            "startDate": "2021-10-20T00:00:00.000Z",
            "comments": 0,
            "likes": 0,
            "userLIke":true
        }
    ]
}

4-3. 이벤트 수정

  • URL : /:dandelionId/event/update/:eventId
  • METHOD : /PATCH
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
    • ( eventId : 이벤트의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "title":"new Event has Changed!!",
    "text":"블라블라 location은 아무거나 들어가지 않음~.",
    "location":{
        "longitude":127.04275784194242,
        "latitude":37.28335975273373
    },
    "images":["test1.jpg","test2.jpg"],
    "rewards":400,
    "firstComeNum":8,
    "startDate":"2021-10-12"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "이벤트가 수정되었습니다."
}

4-4. 이벤트 삭제

  • URL : /:dandelionId/event/delete/:eventId
  • METHOD : /DELETE
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
    • ( eventId : 이벤트의 ObjectId, 즉 인덱스 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "이벤트를 삭제하였습니다."
}

실패

{
    "status": "SUCCESS",
    "message": (case에 따른 메세지)
}
  1. 존재하지 않는 민들레 인덱스인 경우
  2. 존재하지 않는 이벤트 인덱스인 경우
  3. 이벤트 인덱스가 민들레 인덱스와 매치하지 않는 경우
  4. 인덱스 타입이 잘못된 ObjectId인 경우

5. 댓글

5-1. 댓글 생성

  • URL : /:postId/comment/create
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( postId : 민들레 게시글 혹은 이벤트의 ObjectId. eventId여도 postId 이름으로 보내줄 것. ) (key : value)
  • REQUEST BODY :
{
    "text":"달고나 댓글 1022"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "댓글을 작성하였습니다.",
    "data": {
        "depth": 1,
        "isDeleted": false,
        "createdAt": "2021-10-22T00:12:00.443Z",
        "updatedAt": "2021-10-22T00:09:38.639Z",
        "_id": "6171834068bce21c44dd0d7b",
        "_user": "61365d8cd4e22a2dd4df2a6f",
        "_post": "616c58c6e31deb2e741afe65",
        "text": "달고나 댓글 1022",
        "__v": 0
    }
}

5-2. 댓글 가져오기

  • URL : /:postId/comment/
  • METHOD : /GET
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( postId : 민들레 게시글/이벤트의 ObjectId, 즉 인덱스 ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 댓글 수 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "게시글에 해당하는 댓글입니다.",
    "data": [
        {
            "_id": "616c5988e31deb2e741afe6b",
            "depth": 1, //댓글이면 1, 답글이면 2, (확장성 고려, 추후 다답글은 3 등등)
            "createdAt": "2021-10-17T17:12:40.481Z",
            "_user": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907"
            },
            "_post": "616c58c6e31deb2e741afe65",
            "text": "달고나 두번째 댓글",
            "nestedComments": 1 // 답글 개수
        },
        {
            "_id": "616c58ece31deb2e741afe68",
            "depth": 1,
            "createdAt": "2021-10-17T17:10:04.209Z",
            "_user": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907"
            },
            "_post": "616c58c6e31deb2e741afe65",
            "text": "달고나 첫 댓글",
            "nestedComments": 0
        }
    ]
}

5-3. 댓글 수정

  • URL : /:postId/comment/update/:commentId
  • METHOD : /PATCH
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( postId : 민들레 게시글/이벤트의 ObjectId, 즉 인덱스 ) (key : value)
    • ( commentId : 댓글의 ObjectId, 즉 인덱스 ) (key : value)
  • REQUEST BODY :
{
    "text":"수정됨222"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "덧글이 수정되었습니다."
}

5-4. 댓글 삭제

  • URL : /:postId/comment/delete/:commentId
  • METHOD : /DELETE
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( postId : 민들레 게시글/이벤트의 ObjectId, 즉 인덱스 ) (key : value)
    • ( commentId : 댓글의 ObjectId, 즉 인덱스 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "댓글을 삭제하였습니다."
}

실패

{
    "status": "SUCCESS",
    "message": (case에 따른 메세지)
}
  1. 존재하지 않는 게시글/이벤트 인덱스인 경우
  2. 존재하지 않는 댓글 인덱스인 경우
  3. 게시글/이벤트 인덱스가 댓글 인덱스와 매치하지 않는 경우
  4. 인덱스 타입이 잘못된 ObjectId인 경우
  5. 작성자가 아닌 경우에 수정/삭제하려는 경우

6. 답글

6-1. 답글 생성

  • URL : /:parentCommentId/nestedComment/create
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( parentCommentId : 댓글의 ObjectId ) (key : value)
  • REQUEST BODY :
{
    "text":"달고나 댓글 1022"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "답글을 작성하였습니다.",
    "data": {
        "depth": 2,
        "isDeleted": false,
        "createdAt": "2021-10-22T00:24:12.759Z",
        "updatedAt": "2021-10-22T00:24:12.759Z",
        "_id": "61718725eb364c490c846b3c",
        "_post": "615f10fc81bde2745cecaefc",
        "_user": "61365d8cd4e22a2dd4df2a6f",
        "_parentComment": "616484d4072c963f5c5c3f7b",
        "text": "첫 댓글에 대한 답글",
        "__v": 0
    }
}

6-2. 답글 가져오기

  • URL : /:parentCommentId/nestedComment/
  • METHOD : /GET
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( parentCommentId : 댓글의 ObjectId ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 답글 수 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "댓글에 해당하는 답글입니다.",
    "data": [
        {
            "_id": "61718725eb364c490c846b3c",
            "depth": 2,
            "createdAt": "2021-10-22T00:24:12.759Z",
            "updatedAt": "2021-10-22T00:24:12.759Z",
            "_post": "615f10fc81bde2745cecaefc",
            "_user": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907"
            },
            "_parentComment": "616484d4072c963f5c5c3f7b",
            "text": "첫 댓글에 대한 답글"
        }
    ]
}

6-3. 답글 수정

  • URL : /:parentCommentId/nestedComment/update/:commentId
  • METHOD : /PATCH
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( parentCommentId : 댓글의 ObjectId ) (key : value)
    • ( commentId : 답글의 ObjectId ) (key : value)
  • REQUEST BODY :
{
    "text":"수정됨222"
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "답글이 수정되었습니다."
}

6-4. 답글 삭제

  • URL : /:parentCommentId/nestedComment/delete/:commentId
  • METHOD : /DELETE
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES :
    • ( parentCommentId : 댓글의 ObjectId ) (key : value)
    • ( commentId : 답글의 ObjectId ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "답글을 삭제하였습니다."
}

실패

{
    "status": "SUCCESS",
    "message": (case에 따른 메세지)
}
  1. 존재하지 않는 댓글 인덱스인 경우
  2. 존재하지 않는 답글 인덱스인 경우
  3. 답글 인덱스가 댓글 인덱스와 매치하지 않는 경우
  4. 인덱스 타입이 잘못된 ObjectId인 경우
  5. 작성자가 아닌 경우에 삭제/수정하려는 경우

6. 게시글/이벤트

6-1. 게시글/이벤트 좋아요

  • URL : /:dandelionId/:postId/like

  • METHOD : /POST

  • HEADER :( x-access-token : 토큰 값 ) (key : value)

  • PATH VARIABLES :

    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
    • ( postId : 게시글/이벤트의 ObjectId, 즉 인덱스 ) (key : value)
  • RETURN :

성공

  1. 좋아요
{
    "status": "SUCCESS",
    "message": "좋아요를 완료하였습니다.",
    "data": {
        "currentLikeStatus": true //현재 사용자의 해당 게시글에 대한 좋아요 상태
    }
}
  1. 좋아요 취소
{
    "status": "SUCCESS",
    "message": "좋아요를 취소했습니다.",
    "data": {
        "currentLikeStatus": false
    }
}

6-2. 게시글/이벤트 상세 조회

  • URL : /:dandelionId/:postId/detail

  • METHOD : /GET

  • HEADER :( x-access-token : 토큰 값 ) (key : value)

  • PATH VARIABLES :

    • ( dandelionId : 민들레의 ObjectId, 즉 인덱스 ) (key : value)
    • ( postId : 게시글/이벤트의 ObjectId, 즉 인덱스 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "게시글 상세 정보입니다.",
    "data": {
        "_id": "6171719d593f7647dc230f91",
        "createdAt": "2021-10-21T13:56:45.000Z",
        "updatedAt": "2021-10-21T13:56:30.716Z",
        "images": [
            "test1.jpg",
            "test2.jpg"
        ],
        "isEvent": true, //게시글이면 false
        "_user": {
            "_id": "61365d8cd4e22a2dd4df2a6f",
            "name": "testUser0907"
        },
        "_dandelion": "614c4ae99aa99a08e0d57c30",
        "location": {
            "longitude": 127.04275784194242,
            "latitude": 37.28335975273373
        },
        "title": "10.21 event test",
        "text": "event test",
        "comments": 0,
        "likes": 1,
        "userLike":true
    }
}

6-3. 게시글/이벤트 이미지 업로드

  • URL : /dandelion/images/:destination
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • PATH VARIABLES : ( destination : post ) (key : value, 'post'이라는 문자열로 고정하여 주시면 됩니다. 이미지가 저장될 S3 폴더를 말합니다.)
  • REQUEST BODY : form-data 형식
KEY VALUE DESCRIPTION
images 사용자가 첨부한 파일(ex. test1.jpg) 문자열이 아니라 파일이어야 함. 최대 10개까지 업로드 가능
postId ex.6187f9dcb7da7625008b5c5c 게시글/이벤트의 Object ID
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "이미지를 성공적으로 저장했습니다.",
    "data": [
        {
            "fileName": "post/16745287686200.png",
            "fileUrl": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/post/16745287686200.png"
        },
        {
            "fileName": "post/16745290394400.PNG",
            "fileUrl": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/post/16745290394400.PNG"
        },
        {
            "fileName": "post/16745291647000.PNG",
            "fileUrl": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/post/16745291647000.PNG"
        },
        {
            "fileName": "post/16745302380600.PNG",
            "fileUrl": "https://paramdandelion.s3.ap-northeast-2.amazonaws.com/post/16745302380600.PNG"
        }
    ]
}

7. 마이페이지

7-1. 내가 쓴 글 조회

  • URL : /dandelion/post/get/mine

  • METHOD : /GET

  • HEADER :( x-access-token : 토큰 값 ) (key : value)

  • QUERY PARAMS :

    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 게시글 수 ) (key : value)
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "내가 작성한 게시글입니다.",
    "data": [
        {
            "_id": "616c58c6e31deb2e741afe65",
            "createdAt": "2021-10-17T17:09:26.064Z",
            "updatedAt": "2021-10-17T11:43:39.681Z",
            "images": [
                "test1.jpg",
                "test2.jpg"
            ],
            "isEvent": false,
            "_user": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907"
            },
            "_dandelion": "616c086ae27a6c277cbcc00d",
            "location": {
                "longitude": 127.01521012887964,
                "latitude": 37.278575439309265
            },
            "title": "달고나 게시글",
            "text": "location은 아무거나 들어감.",
            "comments": 2,
            "likes": 0,
            "userLike":true //현재 유저가 해당 게시글을 좋아요 했는지의 여부
        },
    ]
}

7-2. 내가 심은 민들레 조회

  • URL : /dandelion/get/mine
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 민들레 수 ) (key : value)
  • REQUEST BODY :
{
    "currentPosition":{
        "latitude" : 37.28326843430806,
        "longitude":127.04454697578383
    } //사용자 현재 위치
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "내가 심은 민들레입니다.",
    "data": [
        {
            "_id": "615a92e6b74ebb4dc8ebcb7d",
            "createdAt": "2021-10-04T05:36:38.403Z",
            "level": 1,
            "name": "실험",
            "_creator": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907",
                "thumbnail":(유저 프사 s3 링크)
            },
            "location": {
                "longitude": 127.04271614831424,
                "latitude": 37.283268525520704
            },
            "description": "실험시러",
            "distance": 2491.6923360161572, //사용자 현재 위치로부터 민들레까지의 거리(m)
            "events": 0 //이벤트 개수
            "cumulativeVisitors": 1 //누적방문자수 (아직 방문 api와 테스트 데이터가 없어 실제 데이터에는 표시 되지 않을 것. 그러나 이후 이렇게 구현할 예정.)
        },
        {
            "_id": "615a924b4564ef6ee0909ddd",
            "createdAt": "2021-10-04T05:34:03.127Z",
            "level": 1,
            "name": "기숙사 매점",
            "_creator": {
                "_id": "61365d8cd4e22a2dd4df2a6f",
                "name": "testUser0907",
                "thumbnail":(유저 프사 s3 링크)
            },
            "location": {
                "longitude": 127.04560343208409,
                "latitude": 37.284512523458666
            },
            "description": "기매 맛잇졍",
            "distance": 2771.9652301615392,
            "events": 0,
            "cumulativeVisitors": 3
        }
    ]
}

8. 이미지 업로드

생성/수정할 때 해당 api들을 이용하게 된다. 예를 들어, 사용자가 사진이 있는 게시글/이벤트를 생성할 때, 기존 api를 사용해 게시글/이벤트를 먼저 생성하고 얻은 postID로 6-3. 게시글/이벤트 이미지 업로드를 호출한다. 수정할 때 이미지 업로드 API에서는 DB에 접근하여 기존 이미지들의 정보를 알아내 s3에서 삭제하고, 클라이언트가 보내준 사진들을 s3에 업로드한다.
불러오기에서는 s3링크를 사용해 이미지를 렌더링하면 된다.

9. 핫스팟

9-1. 내 주변 핫스팟 가져오기

  • URL : /dandelion/get/hotspot/local
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 민들레 수 ) (key : value)
  • REQUEST BODY :
{
    "currentPosition":{
        "latitude" : 37.28326843430806,
        "longitude":127.04454697578383
    }, //사용자 현재 위치
   "maxDistance" : 300 // 미터 단위
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "내 주변 민들레 핫스팟입니다.",
    "data": [
        {
            "_id": "6193dd5be752e567bb1d0a70",
            "level": 4,
            "cumulativeVisitors": 223,
            "realTimeVisitors": 122,
            "name": "인마상",
            "location": {
                "longitude": 127.043495,
                "latitude": 37.28236
            },
            "description": "왜 인마상일까요?",
            "distance": 2.4579438848212036,
            "events": 2
        },
        {
            "_id": "6193da36e752e567bb1d0a29",
            "level": 4,
            "cumulativeVisitors": 102,
            "realTimeVisitors": 60,
            "name": "중앙도서관",
            "location": {
                "longitude": 127.044195,
                "latitude": 37.28144
            },
            "description": "#최초_민들레_생성",
            "distance": 119.19073980870387,
            "events": 2
        }
    ]
}

9-2. 전국 핫스팟 가져오기

  • URL : /dandelion/get/hotspot/national
  • METHOD : /POST
  • HEADER :( x-access-token : 토큰 값 ) (key : value)
  • QUERY PARAMS :
    • ( page : 현재 페이지 수 ) (key : value) (시작은 1부터)
    • ( maxPost : 페이지마다 가져올 민들레 수 ) (key : value)
  • REQUEST BODY :
{
    "currentPosition":{
        "latitude" : 37.28326843430806,
        "longitude":127.04454697578383
    } //사용자 현재 위치
}
  • RETURN :

성공

{
    "status": "SUCCESS",
    "message": "내 주변 민들레 핫스팟입니다.",
    "data": [
        {
            "_id": "6193dd5be752e567bb1d0a70",
            "level": 4,
            "cumulativeVisitors": 223,
            "realTimeVisitors": 122,
            "name": "인마상",
            "location": {
                "longitude": 127.043495,
                "latitude": 37.28236
            },
            "description": "왜 인마상일까요?",
            "distance": 2.4579438848212036,
            "events": 2
        },
        {
            "_id": "6193da36e752e567bb1d0a29",
            "level": 4,
            "cumulativeVisitors": 102,
            "realTimeVisitors": 60,
            "name": "중앙도서관",
            "location": {
                "longitude": 127.044195,
                "latitude": 37.28144
            },
            "description": "#최초_민들레_생성",
            "distance": 119.19073980870387,
            "events": 2
        }
    ]
}

TroubleShooting