From 10ed982caf5ffdc4592e134bedbea0453b8c71e1 Mon Sep 17 00:00:00 2001 From: Bombo Date: Sun, 26 Nov 2023 22:20:43 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[SIX-264]=20refactor=20:=20=EC=BF=BC?= =?UTF-8?q?=EB=A6=AC=20=EC=84=B1=EB=8A=A5=20=EA=B0=9C=EC=84=A0=20=EB=B0=8F?= =?UTF-8?q?=20=EB=B6=88=20=ED=95=84=EC=9A=94=ED=95=9C=20=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chatroom/ChatRoomService.java | 22 ++--- .../UserMissionChatRoomQueryRepository.java | 50 ----------- .../UserMissionChatRoomQueryResponse.java | 10 --- ...serMissionChatRoomQueryRepositoryTest.java | 85 ------------------- .../UserMissionChatRoomRepository.java | 2 + .../UserMissionChatRoomQueryResponse.java | 7 ++ 6 files changed, 21 insertions(+), 155 deletions(-) delete mode 100644 onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepository.java delete mode 100644 onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/response/UserMissionChatRoomQueryResponse.java delete mode 100644 onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepositoryTest.java create mode 100644 onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/response/UserMissionChatRoomQueryResponse.java diff --git a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java b/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java index ac85ddee..ac446f77 100644 --- a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java +++ b/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java @@ -1,7 +1,5 @@ package com.sixheroes.onedayheroapplication.chatroom; -import com.sixheroes.onedayheroapplication.chatroom.repository.UserMissionChatRoomQueryRepository; -import com.sixheroes.onedayheroapplication.chatroom.repository.response.UserMissionChatRoomQueryResponse; import com.sixheroes.onedayheroapplication.chatroom.request.CreateMissionChatRoomServiceRequest; import com.sixheroes.onedayheroapplication.chatroom.response.MissionChatRoomCreateResponse; import com.sixheroes.onedayheroapplication.chatroom.response.MissionChatRoomExitResponse; @@ -33,7 +31,6 @@ public class ChatRoomService { private final MissionChatRoomReader missionChatRoomReader; private final MissionChatRoomRepository missionChatRoomRepository; private final UserMissionChatRoomRepository userMissionChatRoomRepository; - private final UserMissionChatRoomQueryRepository userMissionChatRoomQueryRepository; private final UserMissionChatRoomReader userMissionChatRoomReader; private final MissionChatRoomRedisRepository missionChatRoomRedisRepository; private final ChatMessageMongoRepository chatMessageMongoRepository; @@ -51,14 +48,14 @@ public MissionChatRoomCreateResponse createChatRoom( public List findJoinedChatRoom( Long userId ) { - var missionChatRooms = userMissionChatRoomQueryRepository.findJoinedChatRooms(userId); + var missionChatRooms = userMissionChatRoomRepository.findByUserIdAndIsJoinedTrue(userId); + var chatRoomIds = getJoinedChatRoomIds(missionChatRooms); - var receiverIds = getReceiverIds(userId, chatRoomIds); + var latestMessagesByChatRoomIds = chatMessageMongoRepository.findLatestMessagesByChatRoomIds(chatRoomIds); + var receiverIds = getReceiverIds(userId, chatRoomIds); var receiverChatRoomInfos = userMissionChatRoomRepository.findReceiverChatRoomInfoInReceiverIds(receiverIds); - var latestMessagesByChatRoomIds = chatMessageMongoRepository.findLatestMessagesByChatRoomIds(chatRoomIds); - var missionChatRoomFindResponses = makeMissionChatRoomResponse(receiverChatRoomInfos, latestMessagesByChatRoomIds); return missionChatRoomFindResponses; @@ -84,14 +81,19 @@ public MissionChatRoomExitResponse exitChatRoom( return MissionChatRoomExitResponse.from(userChatRoom.getMissionChatRoom(), userId); } - private List getJoinedChatRoomIds(List missionChatRooms) { + private List getJoinedChatRoomIds( + List missionChatRooms + ) { return missionChatRooms.stream() - .mapToLong(UserMissionChatRoomQueryResponse::chatRoomId) + .mapToLong(UserMissionChatRoom::getId) .boxed() .toList(); } - private List getReceiverIds(Long userId, List chatRoomIds) { + private List getReceiverIds( + Long userId, + List chatRoomIds + ) { return userMissionChatRoomRepository.findByMissionChatRoom_IdIn(chatRoomIds) .stream() .filter(userMissionChatRoom -> !userMissionChatRoom.isUserChatRoom(userId)) diff --git a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepository.java b/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepository.java deleted file mode 100644 index d07d6e34..00000000 --- a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepository.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.sixheroes.onedayheroapplication.chatroom.repository; - -import com.querydsl.core.BooleanBuilder; -import com.querydsl.core.types.Projections; -import com.querydsl.jpa.impl.JPAQueryFactory; -import com.sixheroes.onedayheroapplication.chatroom.repository.response.UserMissionChatRoomQueryResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Repository; - -import java.util.List; - -import static com.sixheroes.onedayherodomain.mission.QMission.mission; -import static com.sixheroes.onedayherodomain.missionchatroom.QMissionChatRoom.missionChatRoom; -import static com.sixheroes.onedayherodomain.missionchatroom.QUserMissionChatRoom.userMissionChatRoom; - -@Slf4j -@Repository -@RequiredArgsConstructor -public class UserMissionChatRoomQueryRepository { - - private final JPAQueryFactory queryFactory; - - public List findJoinedChatRooms( - Long userId - ) { - return queryFactory.select( - Projections.constructor(UserMissionChatRoomQueryResponse.class, - userMissionChatRoom.id, - userMissionChatRoom.missionChatRoom.id, - userMissionChatRoom.missionChatRoom.missionId, - userMissionChatRoom.missionChatRoom.headCount, - mission.missionInfo.title)) - .from(userMissionChatRoom) - .join(userMissionChatRoom.missionChatRoom, missionChatRoom) - .join(mission) - .on(missionChatRoom.missionId.eq(mission.id)) - .where(userIdEq(userId), - isJoined() - ).fetch(); - } - - private BooleanBuilder userIdEq(Long userId) { - return new BooleanBuilder(userMissionChatRoom.userId.eq(userId)); - } - - private BooleanBuilder isJoined() { - return new BooleanBuilder(userMissionChatRoom.isJoined.eq(true)); - } -} diff --git a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/response/UserMissionChatRoomQueryResponse.java b/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/response/UserMissionChatRoomQueryResponse.java deleted file mode 100644 index 0e14fcf5..00000000 --- a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/repository/response/UserMissionChatRoomQueryResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.sixheroes.onedayheroapplication.chatroom.repository.response; - -public record UserMissionChatRoomQueryResponse( - Long id, - Long chatRoomId, - Long missionId, - Integer headCount, - String title -) { -} diff --git a/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepositoryTest.java b/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepositoryTest.java deleted file mode 100644 index 8bb13fc2..00000000 --- a/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/repository/UserMissionChatRoomQueryRepositoryTest.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.sixheroes.onedayheroapplication.chatroom.repository; - - -import com.sixheroes.onedayheroapplication.IntegrationQueryDslTest; -import com.sixheroes.onedayherodomain.mission.Mission; -import com.sixheroes.onedayherodomain.mission.MissionInfo; -import com.sixheroes.onedayherodomain.mission.repository.MissionCategoryRepository; -import com.sixheroes.onedayherodomain.mission.repository.MissionRepository; -import com.sixheroes.onedayherodomain.missionchatroom.MissionChatRoom; -import com.sixheroes.onedayherodomain.missionchatroom.repository.MissionChatRoomRepository; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.transaction.annotation.Transactional; - -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.time.LocalTime; -import java.util.List; - -import static org.assertj.core.api.Assertions.assertThat; - -@Transactional -class UserMissionChatRoomQueryRepositoryTest extends IntegrationQueryDslTest { - - @Autowired - private MissionRepository missionRepository; - - @Autowired - private MissionCategoryRepository missionCategoryRepository; - - @Autowired - private MissionChatRoomRepository missionChatRoomRepository; - - @Autowired - private UserMissionChatRoomQueryRepository userMissionChatRoomQueryRepository; - - @DisplayName("현재 유저가 입장해있는 채팅방을 조회 할 수 있다.") - @Test - void findUserChatRoomWithJoined() { - // given - var missionCategory = missionCategoryRepository.findById(1L).get(); - var citizenId = 1L; - var regionId = 1L; - - var missionInfo = MissionInfo.builder() - .title("미션 제목") - .content("미션 내용") - .missionDate(LocalDate.of(2023, 11, 15)) - .startTime(LocalTime.of(9, 0, 0)) - .endTime(LocalTime.of(9, 30, 0)) - .deadlineTime(LocalDateTime.of( - LocalDate.of(2023, 11, 15), - LocalTime.of(5, 0, 0) - )) - .serverTime(LocalDateTime.of( - LocalDate.of(2023, 11, 14), - LocalTime.NOON - )) - .price(10000) - .build(); - - var mission = Mission.createMission( - missionCategory, - citizenId, - regionId, - 123.45, - 123.45, - missionInfo - ); - - var savedMission = missionRepository.save(mission); - - var missionChatRoom = MissionChatRoom.createMissionChatRoom(savedMission.getId(), List.of(1L, 2L)); - missionChatRoomRepository.save(missionChatRoom); - - // when - var joinedChatRooms = userMissionChatRoomQueryRepository.findJoinedChatRooms(citizenId); - - // then - assertThat(joinedChatRooms.get(0).missionId()).isEqualTo(savedMission.getId()); - assertThat(joinedChatRooms.get(0).title()).isEqualTo(savedMission.getMissionInfo().getTitle()); - assertThat(joinedChatRooms.get(0).headCount()).isEqualTo(2); - } -} \ No newline at end of file diff --git a/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java b/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java index 79958928..fa13c2c7 100644 --- a/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java +++ b/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java @@ -30,4 +30,6 @@ public interface UserMissionChatRoomRepository extends JpaRepository findReceiverChatRoomInfoInReceiverIds(List receiverIds); + + List findByUserIdAndIsJoinedTrue(Long userId); } \ No newline at end of file diff --git a/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/response/UserMissionChatRoomQueryResponse.java b/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/response/UserMissionChatRoomQueryResponse.java new file mode 100644 index 00000000..6b23b4d1 --- /dev/null +++ b/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/response/UserMissionChatRoomQueryResponse.java @@ -0,0 +1,7 @@ +package com.sixheroes.onedayherodomain.missionchatroom.repository.response; + +public record UserMissionChatRoomQueryResponse( + Long id, + Long chatRoomId +) { +} From 40e5d935a2590ff795e3afc565c3d58e39eebb10 Mon Sep 17 00:00:00 2001 From: Bombo Date: Mon, 27 Nov 2023 16:08:57 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[SIX-264]=20test=20:=20=EC=B1=84=ED=8C=85?= =?UTF-8?q?=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20=EB=B0=8F=20=EB=82=98=EA=B0=80?= =?UTF-8?q?=EA=B8=B0=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/static/docs/index.html | 10155 ---------------- .../chatroom/ChatRoomService.java | 33 +- .../IntegrationApplicationTest.java | 12 + .../chatroom/ChatRoomServiceTest.java | 231 + .../UserMissionChatRoomRepository.java | 12 +- 5 files changed, 267 insertions(+), 10176 deletions(-) delete mode 100644 onedayhero-api/src/main/resources/static/docs/index.html diff --git a/onedayhero-api/src/main/resources/static/docs/index.html b/onedayhero-api/src/main/resources/static/docs/index.html deleted file mode 100644 index 001c8afb..00000000 --- a/onedayhero-api/src/main/resources/static/docs/index.html +++ /dev/null @@ -1,10155 +0,0 @@ - - - - - - - -OneDayHero REST API 문서 - - - - - - - -
-
-

Kakao Login API

-
-
-

카카오 회원가입 후 로그인

-
-

HTTP Request

-
-
-
POST /api/v1/auth/kakao/login HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Content-Length: 35
-Host: localhost:8080
-
-{
-  "code" : "authorization code"
-}
-
-
-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

code

String

인가 코드

-
-
-

HTTP Response

-
-
-
HTTP/1.1 201 Created
-Set-Cookie: refreshToken=01f1ec2a-c0d7-4575-8e22-af4c23a3f80c; HttpOnly
-Location:
-Content-Type: application/json;charset=UTF-8
-Content-Length: 134
-
-{
-  "status" : 201,
-  "data" : {
-    "userId" : 1,
-    "accessToken" : "accessToken"
-  },
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.userId

Number

회원가입 후 로그인한 유저 아이디

data.accessToken

String

발급된 액세스 토큰

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

카카오 로그인

-
-

HTTP Request

-
-
-
POST /api/v1/auth/kakao/login HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Content-Length: 35
-Host: localhost:8080
-
-{
-  "code" : "authorization code"
-}
-
-
-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

code

String

인가 코드

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Set-Cookie: refreshToken=c84dd034-07d7-4dbf-9785-fa497bc7481f; HttpOnly
-Content-Type: application/json;charset=UTF-8
-Content-Length: 134
-
-{
-  "status" : 200,
-  "data" : {
-    "userId" : 1,
-    "accessToken" : "accessToken"
-  },
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.userId

Number

로그인 유저 아이디

data.accessToken

String

발급된 액세스 토큰

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

User API

-
-
-

유저 정보 조회

-
-

HTTP Request

-
-
-
GET /api/v1/me HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 781
-
-{
-  "status" : 200,
-  "data" : {
-    "basicInfo" : {
-      "nickname" : "이름",
-      "gender" : "MALE",
-      "birth" : "1990-01-01",
-      "introduce" : "자기 소개"
-    },
-    "image" : {
-      "originalName" : "profile.jpg",
-      "uniqueName" : "unique.jpg",
-      "path" : "http://"
-    },
-    "favoriteWorkingDay" : {
-      "favoriteDate" : [ "MON", "THU" ],
-      "favoriteStartTime" : "12:00",
-      "favoriteEndTime" : "18:00"
-    },
-    "favoriteRegions" : [ {
-      "id" : 1,
-      "si" : "서울시",
-      "gu" : "강남구",
-      "dong" : "역삼동"
-    }, {
-      "id" : 2,
-      "si" : "서울시",
-      "gu" : "강남구",
-      "dong" : "청담동"
-    } ],
-    "heroScore" : 30,
-    "isHeroMode" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Object

응답 데이터

data.basicInfo

Object

유저 기본 정보

data.basicInfo.nickname

String

닉네임

data.basicInfo.gender

String

성별

data.basicInfo.birth

String

yyyy-MM-dd

태어난 날짜

data.basicInfo.introduce

String

O

자기 소개

data.image

Object

프로필 이미지

data.image.originalName

String

O

원본 이름

data.image.uniqueName

String

O

고유 이름

data.image.path

String

O

이미지 경로

data.favoriteWorkingDay

Object

희망 근무 정보

data.favoriteWorkingDay.favoriteDate

Array

O

희망 근무 요일

data.favoriteWorkingDay.favoriteStartTime

String

O

HH:mm

희망 근무 시작 시간

data.favoriteWorkingDay.favoriteEndTime

String

O

HH:mm

희망 근무 종료 시간

data.favoriteRegions

Array

O

선호 지역

data.favoriteRegions[].id

Number

O

지역 아이디

data.favoriteRegions[].si

String

O

시 이름

data.favoriteRegions[].gu

String

O

구 이름

data.favoriteRegions[].dong

String

O

동 이름

data.heroScore

Number

히어로 점수

data.isHeroMode

Boolean

히어로 모드 활성 여부

-
-
-
-

유저 정보 수정

-
-

HTTP Request

-
-
-
POST /api/v1/me HTTP/1.1
-Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Accept: application/json
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=userUpdateRequest; filename=json
-Content-Type: application/json
-
-{"basicInfo":{"nickname":"이름","gender":"MALE","birth":"1990-01-01","introduce":"자기 소개"},"favoriteWorkingDay":{"favoriteDate":["MON","THU"],"favoriteStartTime":"12:00","favoriteEndTime":"18:00"},"favoriteRegions":[1,2]}
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=images; filename=imageA.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PathTypeDescription

basicInfo

Object

유저 기본 정보

basicInfo.nickname

String

닉네임

basicInfo.gender

String

성별

basicInfo.birth

String

태어난 날짜

basicInfo.introduce

String

자기 소개

favoriteWorkingDay

Object

희망 근무 정보

favoriteWorkingDay.favoriteDate

Array

희망 근무 요일

favoriteWorkingDay.favoriteStartTime

String

희망 근무 시작 시간

favoriteWorkingDay.favoriteEndTime

String

희망 근무 종료 시간

favoriteRegions

Array

선호 지역

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Object

응답 데이터

data.id

Number

유저 아이디

-
-
-
-

유저 이미지 삭제

-
-

HTTP Request

-
-
-
DELETE /api/v1/me/user-images/1 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- - ---- - - - - - - - - - - - - -
Table 1. /api/v1/me/user-images/{userImageId}
ParameterDescription

userImageId

유저 이미지 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 204 No Content
-Content-Type: application/json;charset=UTF-8
-Content-Length: 81
-
-{
-  "status" : 204,
-  "data" : null,
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Null

응답 데이터

-
-
-
-

내 미션 찜 조회

-
-

HTTP Request

-
-
-
GET /api/v1/me/bookmarks?page=0&size=3&sort= HTTP/1.1
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- ---- - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

sort

정렬 기준 필드

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 2193
-
-{
-  "status" : 200,
-  "data" : {
-    "userId" : 1,
-    "missionBookmarkMeResponses" : {
-      "content" : [ {
-        "missionId" : 1,
-        "missionBookmarkId" : 5,
-        "isAlive" : true,
-        "missionInfo" : {
-          "title" : "청소 미션",
-          "categoryName" : "청소",
-          "bookmarkCount" : 5,
-          "price" : 35000,
-          "missionDate" : "2023-12-05",
-          "startTime" : "14:30",
-          "endTime" : "18:30"
-        },
-        "region" : {
-          "id" : 1,
-          "si" : "서울시",
-          "gu" : "강남구",
-          "dong" : "역삼동"
-        }
-      }, {
-        "missionId" : 2,
-        "missionBookmarkId" : 6,
-        "isAlive" : true,
-        "missionInfo" : {
-          "title" : "심부름1",
-          "categoryName" : "심부름",
-          "bookmarkCount" : 3,
-          "price" : 10000,
-          "missionDate" : "2023-12-06",
-          "startTime" : "10:30",
-          "endTime" : "12:30"
-        },
-        "region" : {
-          "id" : 1,
-          "si" : "서울시",
-          "gu" : "강남구",
-          "dong" : "역삼동"
-        }
-      }, {
-        "missionId" : 5,
-        "missionBookmarkId" : 10,
-        "isAlive" : true,
-        "missionInfo" : {
-          "title" : "심부름2",
-          "categoryName" : "심부름",
-          "bookmarkCount" : 3,
-          "price" : 10000,
-          "missionDate" : "2023-12-07",
-          "startTime" : "12:30",
-          "endTime" : "13:30"
-        },
-        "region" : {
-          "id" : 1,
-          "si" : "서울시",
-          "gu" : "강남구",
-          "dong" : "역삼동"
-        }
-      } ],
-      "pageable" : {
-        "pageNumber" : 0,
-        "pageSize" : 3,
-        "sort" : {
-          "empty" : true,
-          "sorted" : false,
-          "unsorted" : true
-        },
-        "offset" : 0,
-        "paged" : true,
-        "unpaged" : false
-      },
-      "size" : 3,
-      "number" : 0,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "numberOfElements" : 3,
-      "first" : true,
-      "last" : false,
-      "empty" : false
-    }
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.userId

Number

내 유저 아이디

data.missionBookmarkMeResponses

Object

내 찜 미션 목록

data.missionBookmarkMeResponses.content[]

Array

찜 미션 목록 배열

data.missionBookmarkMeResponses.content[].missionId

Number

찜한 미션 아이디

data.missionBookmarkMeResponses.content[].missionBookmarkId

Number

북마크 아이디

data.missionBookmarkMeResponses.content[].isAlive

Boolean

아직 매칭 가능한 미션일 경우 true

data.missionBookmarkMeResponses.content[].missionInfo.title

String

미션 제목

data.missionBookmarkMeResponses.content[].missionInfo.categoryName

String

미션 카테고리

data.missionBookmarkMeResponses.content[].missionInfo.bookmarkCount

Number

미션 북마크 수

data.missionBookmarkMeResponses.content[].missionInfo.price

Number

미션 수익

data.missionBookmarkMeResponses.content[].missionInfo.missionDate

String

yyyy-MM-dd

미션 수행 일

data.missionBookmarkMeResponses.content[].missionInfo.startTime

String

HH:mm

미션 시작 시간

data.missionBookmarkMeResponses.content[].missionInfo.endTime

String

HH:mm

미션 종료 시간

data.missionBookmarkMeResponses.content[].region.id

Number

지역 아이디

data.missionBookmarkMeResponses.content[].region.si

String

data.missionBookmarkMeResponses.content[].region.gu

String

data.missionBookmarkMeResponses.content[].region.dong

String

data.missionBookmarkMeResponses.pageable.pageNumber

Number

현재 페이지 번호

data.missionBookmarkMeResponses.pageable.pageSize

Number

페이지 크기

data.missionBookmarkMeResponses.pageable.sort

Object

정렬 상태 객체

data.missionBookmarkMeResponses.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.missionBookmarkMeResponses.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.missionBookmarkMeResponses.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.missionBookmarkMeResponses.pageable.offset

Number

페이지 번호

data.missionBookmarkMeResponses.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.missionBookmarkMeResponses.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.missionBookmarkMeResponses.size

Number

미션 리스트 크기

data.missionBookmarkMeResponses.number

Number

현재 페이지 번호

data.missionBookmarkMeResponses.sort

Object

미션 리스트 정렬 정보 객체

data.missionBookmarkMeResponses.sort.empty

Boolean

미션 리스트의 정렬 정보가 비어있는지 여부

data.missionBookmarkMeResponses.sort.sorted

Boolean

미션 리스트의 정렬 정보가 있는지 여부

data.missionBookmarkMeResponses.sort.unsorted

Boolean

미션 리스트의 정렬 정보가 정렬되지 않은지 여부

data.missionBookmarkMeResponses.numberOfElements

Number

현재 페이지의 요소 수

data.missionBookmarkMeResponses.first

Boolean

첫 번째 페이지인지 여부

data.missionBookmarkMeResponses.last

Boolean

마지막 페이지인지 여부

data.missionBookmarkMeResponses.empty

Boolean

미션 리스트가 비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

내가 작성한 리뷰 조회

-
-

HTTP Request

-
-
-
GET /api/v1/me/reviews/send?page=0&size=5&sort= HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Accept: application/json
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- ---- - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

sort

정렬 기준 필드

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1130
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "reviewId" : 1,
-      "categoryName" : "심부름",
-      "missionTitle" : "심부름 미션",
-      "starScore" : 3,
-      "senderNickname" : "리뷰 작성자 닉네임",
-      "profileImage" : [ "s3 프로필 이미지 주소" ],
-      "createdAt" : "2023-11-26T20:05:41"
-    }, {
-      "reviewId" : 2,
-      "categoryName" : "청소",
-      "missionTitle" : "청소 미션",
-      "starScore" : 4,
-      "senderNickname" : "리뷰 작성자 닉네임",
-      "profileImage" : [ "s3 프로필 이미지 주소" ],
-      "createdAt" : "2023-11-26T20:05:41"
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 5,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 5,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 2,
-    "first" : true,
-    "last" : false,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

내가 작성한 리뷰 목록 배열

data.content[].reviewId

Number

내가 작성한 리뷰 아이디

data.content[].categoryName

String

내가 리뷰를 작성한 미션의 카테고리 이름

data.content[].missionTitle

String

내가 리뷰를 작성한 미션의 제목

data.content[].starScore

Number

내가 준 별점

data.content[].senderNickname

String

내 닉네임

data.content[].profileImage

Array

O

내 프로필 이미지 경로

data.content[].createdAt

String

내가 리뷰를 작성한 시간

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

현재 페이지 조회에서 가져온 리뷰 개수

data.number

Number

현재 페이지 번호

data.sort

Object

정렬 정보 객체

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

내가 받은 리뷰 조회

-
-

HTTP Request

-
-
-
GET /api/v1/me/reviews/receive?page=0&size=5&sort= HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Accept: application/json
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- ---- - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

sort

정렬 기준 필드

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1142
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "reviewId" : 1,
-      "senderId" : 5,
-      "senderNickname" : "nickname A",
-      "profileImage" : [ "s3 프로필 이미지 주소" ],
-      "categoryName" : "청소",
-      "missionTitle" : "청소 미션",
-      "starScore" : 4,
-      "createdAt" : "2023-11-26T20:05:41"
-    }, {
-      "reviewId" : 2,
-      "senderId" : 8,
-      "senderNickname" : "nickname B",
-      "profileImage" : [ "s3 프로필 이미지 주소" ],
-      "categoryName" : "심부름",
-      "missionTitle" : "심부름 미션",
-      "starScore" : 3,
-      "createdAt" : "2023-11-26T20:05:41"
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 5,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 5,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 2,
-    "first" : true,
-    "last" : false,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

내가 받은 리뷰 목록 배열

data.content[].reviewId

Number

내가 받은 리뷰의 아이디

data.content[].senderId

Number

내가 받은 리뷰 작성 유저 아이디

data.content[].senderNickname

String

내가 받은 리뷰 작성 유저 닉네임

data.content[].profileImage

Array

O

내가 받은 리뷰를 작성한 유저의 프로필 이미지 경로

data.content[].categoryName

String

내가 받은 리뷰의 미션 카테고리 이름

data.content[].missionTitle

String

내가 받은 리뷰의 미션 제목

data.content[].starScore

Number

내가 받은 별점

data.content[].createdAt

String

내가 리뷰를 받은 시간

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

현재 페이지 조회에서 가져온 리뷰 개수

data.number

Number

현재 페이지 번호

data.sort

Object

정렬 정보 객체

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저 히어로 모드 활성화

-
-

HTTP Request

-
-
-
PATCH /api/v1/me/change-hero HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Object

응답 데이터

data.id

Number

유저 아이디

-
-
-
-

유저 히어로 모드 비활성화

-
-

HTTP Request

-
-
-
PATCH /api/v1/me/change-citizen HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Object

응답 데이터

data.id

Number

유저 아이디

-
-
-
-
-
-

Profile API

-
-
-

시민 프로필 조회

-
-

HTTP Request

-
-
-
GET /api/v1/users/1/citizen-profile HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Host: localhost:8080
-
-
- - ---- - - - - - - - - - - - - -
Table 2. /api/v1/users/{userId}/citizen-profile
ParameterDescription

userId

유저 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 335
-
-{
-  "status" : 200,
-  "data" : {
-    "basicInfo" : {
-      "nickname" : "이름",
-      "gender" : "MALE",
-      "birth" : "1990-01-01"
-    },
-    "image" : {
-      "originalName" : "profile.jpg",
-      "uniqueName" : "unique.jpg",
-      "path" : "https://"
-    },
-    "heroScore" : 60
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Object

응답 데이터

data.basicInfo

Object

유저 기본 정보

data.basicInfo.nickname

String

닉네임

data.basicInfo.gender

String

성별

data.basicInfo.birth

String

yyyy-MM-dd

태어난 날짜

data.image

Object

프로필 이미지

data.image.originalName

String

O

원본 이름

data.image.uniqueName

String

O

고유 이름

data.image.path

String

O

이미지 경로

data.heroScore

Number

히어로 점수

-
-
-
-

히어로 프로필 조회

-
-

HTTP Request

-
-
-
GET /api/v1/users/1/hero-profile HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Host: localhost:8080
-
-
- - ---- - - - - - - - - - - - - -
Table 3. /api/v1/users/{userId}/hero-profile
ParameterDescription

userId

유저 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 756
-
-{
-  "status" : 200,
-  "data" : {
-    "basicInfo" : {
-      "nickname" : "이름",
-      "gender" : "MALE",
-      "birth" : "1990-01-01",
-      "introduce" : "자기 소개"
-    },
-    "image" : {
-      "originalName" : "profile.jpg",
-      "uniqueName" : "unique.jpg",
-      "path" : "https://"
-    },
-    "favoriteWorkingDay" : {
-      "favoriteDate" : [ "MON", "THU" ],
-      "favoriteStartTime" : "12:00",
-      "favoriteEndTime" : "18:00"
-    },
-    "favoriteRegions" : [ {
-      "id" : 1,
-      "si" : "서울시",
-      "gu" : "강남구",
-      "dong" : "역삼동"
-    }, {
-      "id" : 2,
-      "si" : "서울시",
-      "gu" : "강남구",
-      "dong" : "청담동"
-    } ],
-    "heroScore" : 60
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

data

Object

응답 데이터

data.basicInfo

Object

유저 기본 정보

data.basicInfo.nickname

String

닉네임

data.basicInfo.gender

String

성별

data.basicInfo.birth

String

yyyy-MM-dd

태어난 날짜

data.basicInfo.introduce

String

O

자기 소개

data.image

Object

프로필 이미지

data.image.originalName

String

O

원본 이름

data.image.uniqueName

String

O

고유 이름

data.image.path

String

O

이미지 경로

data.favoriteWorkingDay

Object

희망 근무 정보

data.favoriteWorkingDay.favoriteDate

Array

O

희망 근무 요일

data.favoriteWorkingDay.favoriteStartTime

String

O

HH:mm

희망 근무 시작 시간

data.favoriteWorkingDay.favoriteEndTime

String

O

HH:mm

희망 근무 종료 시간

data.favoriteRegions

Array

O

선호 지역

data.favoriteRegions[].id

Number

O

지역 아이디

data.favoriteRegions[].si

String

O

시 이름

data.favoriteRegions[].gu

String

O

구 이름

data.favoriteRegions[].dong

String

O

동 이름

data.heroScore

Number

히어로 점수

-
-
-
- -
-

HTTP Request

-
-
-
GET /api/v1/users/hero-search?page=0&size=3&nickname=%EB%8B%98 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Accept: application/json
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

nickname

히어로 이름

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1432
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "id" : 2,
-      "nickname" : "달님",
-      "image" : {
-        "originalName" : "profile.jpg",
-        "uniqueName" : "unique.jpg",
-        "path" : "https://"
-      },
-      "favoriteMissionCategories" : [ {
-        "code" : "MC_001",
-        "name" : "서빙"
-      } ],
-      "heroScore" : 30
-    }, {
-      "id" : 3,
-      "nickname" : "별님",
-      "image" : {
-        "originalName" : "profile.jpg",
-        "uniqueName" : "unique.jpg",
-        "path" : "https://"
-      },
-      "favoriteMissionCategories" : [ {
-        "code" : "MC_002",
-        "name" : "주방"
-      } ],
-      "heroScore" : 30
-    }, {
-      "id" : 1,
-      "nickname" : "햇님",
-      "image" : {
-        "originalName" : "profile.jpg",
-        "uniqueName" : "unique.jpg",
-        "path" : "https://"
-      },
-      "favoriteMissionCategories" : [ ],
-      "heroScore" : 30
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 3,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 3,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 3,
-    "first" : true,
-    "last" : false,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

히어로 목록 배열

data.content[].id

Number

히어로 아이디

data.content[].nickname

String

히어로 이름

data.content[].image.originalName

String

O

이미지 원본 이름

data.content[].image.uniqueName

String

O

이미지 고유 이름

data.content[].image.path

String

O

이미지 경로

data.content[].favoriteMissionCategories

Array

O

선호 미션 카테고리

data.content[].favoriteMissionCategories[].code

String

선호 미션 카테고리 코드

data.content[].favoriteMissionCategories[].name

String

선호 미션 카테고리 이름

data.content[].heroScore

Number

히어로 점수

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

현재 페이지 조회에서 가져온 리뷰 개수

data.number

Number

현재 페이지 번호

data.sort

Object

정렬 정보 객체

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Mission API

-
-
-

시민은 미션을 생성 할 수 있다.

-
-

HTTP Request

-
-
-
POST /api/v1/missions HTTP/1.1
-Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Accept: application/json
-Host: localhost:8080
-
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=missionCreateRequest; filename=json
-Content-Type: application/json
-
-{"missionCategoryId":1,"regionId":1,"latitude":123.45,"longitude":123.45,"missionInfo":{"title":"제목","content":"내용","missionDate":"2023-10-10","startTime":"10:00","endTime":"10:30","deadlineTime":"2023-10-10T10:00:00","price":10000}}
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=multipartFiles; filename=imageA.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=multipartFiles; filename=imageA.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PathTypeDescription

missionCategoryId

Number

카테고리 아이디

regionId

Number

지역 아이디

latitude

Number

위도

longitude

Number

경도

missionInfo

Object

미션 상세 정보 객체

missionInfo.title

String

미션 상세 제목

missionInfo.content

String

미션 상세 내용

missionInfo.missionDate

String

미션 수행 일

missionInfo.startTime

String

미션 시작 시간

missionInfo.endTime

String

미션 종료 시간

missionInfo.deadlineTime

String

미션 마감 시간

missionInfo.price

Number

미션 포상금

-
-
-

HTTP Response

-
-
-
HTTP/1.1 201 Created
-Location: /api/v1/missions/1
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 201,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 미션을 단 건 조회 할 수 있다.

-
-

Http Request

- - ---- - - - - - - - - - - - - -
Table 4. /api/v1/missions/{missionId}
ParameterDescription

missionId

미션 아이디

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
GET /api/v1/missions/1 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
-
-
-

Http Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 755
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1,
-    "missionCategory" : {
-      "id" : 1,
-      "code" : "MC_001",
-      "name" : "서빙"
-    },
-    "citizenId" : 1,
-    "region" : {
-      "id" : 1,
-      "si" : "서울시",
-      "gu" : "강남구",
-      "dong" : "역삼동"
-    },
-    "longitude" : 123.45,
-    "latitude" : 123.45,
-    "missionInfo" : {
-      "title" : "제목",
-      "content" : "내용",
-      "missionDate" : "2023-10-10",
-      "startTime" : "10:00",
-      "endTime" : "10:30",
-      "deadlineTime" : "2023-10-10T09:30:00",
-      "price" : 10000
-    },
-    "bookmarkCount" : 0,
-    "missionStatus" : "MATCHING",
-    "paths" : [ "path://1", "path://2" ],
-    "isBookmarked" : true
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 아이디

data.citizenId

Number

시민 아이디

data.missionCategory

Object

미션 카테고리 정보 객체

data.missionCategory.id

Number

미션 카테고리 아이디

data.missionCategory.code

String

미션 카테고리 코드

data.missionCategory.name

String

미션 카테고리 내용 ex) 청소

data.region

Object

미션 수행 지역 객체

data.region.id

Number

미션 수행 지역 아이디

data.region.si

String

미션 수행 지역 시

data.region.gu

String

미션 수행 지역 구

data.region.dong

String

미션 수행 지역 동

data.longitude

Number

경도

data.latitude

Number

위도

data.missionInfo

Object

미션 상세 정보 객체

data.missionInfo.title

String

미션 상세 제목

data.missionInfo.content

String

미션 상세 내용

data.missionInfo.missionDate

String

yyyy-MM-dd

미션 수행 일

data.missionInfo.startTime

String

HH:mm

미션 시작 시간

data.missionInfo.endTime

String

HH:mm

미션 종료 시간

data.missionInfo.deadlineTime

String

HH:mm

미션 마감 시간

data.missionInfo.price

Number

미션 포상금

data.bookmarkCount

Number

미션 찜 개수

data.missionStatus

String

미션 진행 상태 (MATCHING)

data.paths

Array

미션에 등록된 사진들

data.isBookmarked

Boolean

북마크 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 미션을 필터 조회 할 수 있다.

-
-

Http Request

- ---- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

sort

정렬 기준 필드

missionCategoryCodes

미션 카테고리 필터 코드

missionDates

미션 수행 일 필터

regionIds

미션 수행 지역 필터

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
GET /api/v1/missions?page=0&size=4&sort=&missionCategoryCodes=MC_001&missionCategoryCodes=MC_002&missionDates=2023-10-31&missionDates=2023-11-02&regionIds=1&regionIds=3 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
-
-
-

Http Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 2029
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "id" : 1,
-      "missionCategory" : {
-        "id" : 1,
-        "code" : "MC_001",
-        "name" : "서빙"
-      },
-      "citizenId" : 1,
-      "region" : {
-        "id" : 1,
-        "si" : "서울시",
-        "gu" : "강남구",
-        "dong" : "역삼동"
-      },
-      "longitude" : 123.45,
-      "latitude" : 123.45,
-      "missionInfo" : {
-        "title" : "제목",
-        "content" : "내용",
-        "missionDate" : "2023-10-21",
-        "startTime" : "09:00",
-        "endTime" : "09:30",
-        "deadlineTime" : "2023-10-21T08:30:00",
-        "price" : 1000
-      },
-      "bookmarkCount" : 0,
-      "missionStatus" : "MATCHING",
-      "paths" : [ "path://1", "path://2" ],
-      "isBookmarked" : true
-    }, {
-      "id" : 2,
-      "missionCategory" : {
-        "id" : 1,
-        "code" : "MC_001",
-        "name" : "서빙"
-      },
-      "citizenId" : 1,
-      "region" : {
-        "id" : 1,
-        "si" : "서울시",
-        "gu" : "강남구",
-        "dong" : "역삼동"
-      },
-      "longitude" : 123.45,
-      "latitude" : 123.45,
-      "missionInfo" : {
-        "title" : "제목",
-        "content" : "내용",
-        "missionDate" : "2023-10-22",
-        "startTime" : "09:00",
-        "endTime" : "09:30",
-        "deadlineTime" : "2023-10-22T08:30:00",
-        "price" : 1000
-      },
-      "bookmarkCount" : 0,
-      "missionStatus" : "MATCHING",
-      "paths" : [ "path://3", "path://4" ],
-      "isBookmarked" : true
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 4,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 4,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 2,
-    "first" : true,
-    "last" : true,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

미션 응답 데이터 배열

data.content[].id

Number

미션 ID

data.content[].missionCategory

Object

미션 카테고리 객체

data.content[].missionCategory.id

Number

미션 카테고리 ID

data.content[].missionCategory.code

String

미션 카테고리 코드

data.content[].missionCategory.name

String

미션 카테고리 이름

data.content[].citizenId

Number

시민 ID

data.content[].region

Object

지역 정보 객체

data.content[].region.id

Number

지역 ID

data.content[].region.si

String

지역 시

data.content[].region.gu

String

지역 구

data.content[].region.dong

String

지역 동

data.content[].longitude

Number

경도

data.content[].latitude

Number

위도

data.content[].missionInfo

Object

미션 상세 정보 객체

data.content[].missionInfo.title

String

미션 상세 제목

data.content[].missionInfo.content

String

미션 내용

data.content[].missionInfo.missionDate

String

yyyy-MM-dd

미션 날짜

data.content[].missionInfo.startTime

String

HH:mm

미션 시작 시간

data.content[].missionInfo.endTime

String

HH:mm

미션 종료 시간

data.content[].missionInfo.deadlineTime

String

HH:mm

미션 마감 시간

data.content[].missionInfo.price

Number

미션 가격

data.content[].bookmarkCount

Number

북마크 횟수

data.content[].missionStatus

String

미션 상태

data.content[].paths

Array

이미지 사진 경로

data.content[].isBookmarked

Boolean

북마크 여부

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

미션 리스트 크기

data.number

Number

현재 페이지 번호

data.sort

Object

미션 리스트 정렬 정보 객체

data.sort.empty

Boolean

미션 리스트의 정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

미션 리스트의 정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

미션 리스트의 정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

미션 리스트가 비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 진행중인 미션을 조회 할 수 있다.

-
-

Http Request

- - ---- - - - - - - - - - - - - -
Table 5. /api/v1/missions/progress/{userId}
ParameterDescription

userId

시민 아이디

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
GET /api/v1/missions/progress?page=0&size=4&sort= HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
-
-
-

Http Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 874
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "id" : 1,
-      "title" : "제목",
-      "missionCategory" : {
-        "id" : 1,
-        "code" : "MC_001",
-        "name" : "서빙"
-      },
-      "missionDate" : "2023-11-06",
-      "bookmarkCount" : 1,
-      "missionStatus" : "MATCHING",
-      "imagePath" : "s3://path",
-      "isBookmarked" : true
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 4,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 4,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 1,
-    "first" : true,
-    "last" : true,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

미션 응답 데이터 배열

data.content[].id

Number

미션 ID

data.content[].title

String

미션 제목

data.content[].missionCategory

Object

미션 카테고리 객체

data.content[].missionCategory.id

Number

미션 카테고리 ID

data.content[].missionCategory.code

String

미션 카테고리 코드

data.content[].missionCategory.name

String

미션 카테고리 이름

data.content[].missionDate

String

yyyy-MM-dd

미션 날짜

data.content[].bookmarkCount

Number

북마크 횟수

data.content[].missionStatus

String

미션 상태

data.content[].imagePath

String

O

이미지 사진 경로

data.content[].isBookmarked

Boolean

북마크 상태

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

미션 리스트 크기

data.number

Number

현재 페이지 번호

data.sort

Object

미션 리스트 정렬 정보 객체

data.sort.empty

Boolean

미션 리스트의 정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

미션 리스트의 정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

미션 리스트의 정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

미션 리스트가 비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 완료된 미션을 조회 할 수 있다.

-
-

Http Request

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
GET /api/v1/missions/completed?page=0&size=4&sort= HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
-
-
-

Http Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 874
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "id" : 1,
-      "title" : "제목",
-      "missionCategory" : {
-        "id" : 1,
-        "code" : "MC_001",
-        "name" : "서빙"
-      },
-      "missionDate" : "2023-11-06",
-      "bookmarkCount" : 1,
-      "missionStatus" : "MATCHING",
-      "imagePath" : "s3://path",
-      "isBookmarked" : true
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 4,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 4,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 1,
-    "first" : true,
-    "last" : true,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

미션 응답 데이터 배열

data.content[].id

Number

미션 ID

data.content[].title

String

미션 제목

data.content[].missionCategory

Object

미션 카테고리 객체

data.content[].missionCategory.id

Number

미션 카테고리 ID

data.content[].missionCategory.code

String

미션 카테고리 코드

data.content[].missionCategory.name

String

미션 카테고리 이름

data.content[].missionDate

String

yyyy-MM-dd

미션 날짜

data.content[].bookmarkCount

Number

북마크 횟수

data.content[].missionStatus

String

미션 상태

data.content[].imagePath

String

O

이미지 사진 경로

data.content[].isBookmarked

Boolean

북마크 상태

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

미션 리스트 크기

data.number

Number

현재 페이지 번호

data.sort

Object

미션 리스트 정렬 정보 객체

data.sort.empty

Boolean

미션 리스트의 정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

미션 리스트의 정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

미션 리스트의 정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

미션 리스트가 비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 제안할 미션을 조회할 수 있다.

-
-

Http Request

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
GET /api/v1/missions/matching HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
-
-
-

Http Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1276
-
-{
-  "status" : 200,
-  "data" : {
-    "missionMatchingResponses" : [ {
-      "id" : 1,
-      "title" : "제목",
-      "missionCategory" : {
-        "id" : 1,
-        "code" : "MC_001",
-        "name" : "서빙"
-      },
-      "region" : {
-        "id" : 1,
-        "si" : "서울시",
-        "gu" : "강남구",
-        "dong" : "역삼동"
-      },
-      "missionCreatedAt" : "2023-11-03T12:00:00",
-      "missionDate" : "2023-11-06",
-      "startTime" : "12:00",
-      "endTime" : "18:00",
-      "price" : 20000,
-      "bookmarkCount" : 1,
-      "missionStatus" : "MATCHING",
-      "imagePath" : "s3://path",
-      "isBookmarked" : true
-    }, {
-      "id" : 2,
-      "title" : "제목",
-      "missionCategory" : {
-        "id" : 1,
-        "code" : "MC_001",
-        "name" : "서빙"
-      },
-      "region" : {
-        "id" : 1,
-        "si" : "서울시",
-        "gu" : "강남구",
-        "dong" : "역삼동"
-      },
-      "missionCreatedAt" : "2023-10-29T12:00:00",
-      "missionDate" : "2023-11-06",
-      "startTime" : "12:00",
-      "endTime" : "18:00",
-      "price" : 20000,
-      "bookmarkCount" : 1,
-      "missionStatus" : "MATCHING",
-      "imagePath" : "s3://path",
-      "isBookmarked" : true
-    } ]
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.missionMatchingResponses

Array

미션 응답 데이터 배열

data.missionMatchingResponses[].id

Number

미션 ID

data.missionMatchingResponses[].title

String

미션 제목

data.missionMatchingResponses[].bookmarkCount

Number

북마크 횟수

data.missionMatchingResponses[].isBookmarked

Boolean

미션 북마크 여부

data.missionMatchingResponses[].missionCategory

Object

미션 카테고리 객체

data.missionMatchingResponses[].missionCategory.id

Number

미션 카테고리 ID

data.missionMatchingResponses[].missionCategory.code

String

미션 카테고리 코드

data.missionMatchingResponses[].missionCategory.name

String

미션 카테고리 이름

data.missionMatchingResponses[].region.id

Number

미션 지역 아이디

data.missionMatchingResponses[].region.si

String

시 이름

data.missionMatchingResponses[].region.gu

String

구 이름

data.missionMatchingResponses[].region.dong

String

동 이름

data.missionMatchingResponses[].missionCreatedAt

String

yyyy-MM-dd'T'HH:mm:ss

미션 생성 시re

data.missionMatchingResponses[].missionDate

String

yyyy-MM-dd

미션 날짜

data.missionMatchingResponses[].startTime

String

HH:mm

미션 시작 시간

data.missionMatchingResponses[].endTime

String

HH:mm

미션 종료 시간

data.missionMatchingResponses[].missionStatus

String

미션 상태

data.missionMatchingResponses[].imagePath

String

O

이미지 사진 경로

data.missionMatchingResponses[].isBookmarked

Boolean

북마크 상태

data.missionMatchingResponses[].price

Number

미션 급여

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

시민은 미션을 수정 할 수 있다.

-
-

Http Request

- - ---- - - - - - - - - - - - - -
Table 6. /api/v1/missions/{missionId}
ParameterDescription

missionId

미션 아이디

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
POST /api/v1/missions/1 HTTP/1.1
-Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=missionUpdateRequest; filename=json
-Content-Type: application/json
-
-{"missionCategoryId":1,"regionId":1,"latitude":1234252.23,"longitude":1234277.388,"missionInfo":{"title":"제목","content":"내용","missionDate":"2023-10-10","startTime":"10:00","endTime":"10:30","deadlineTime":"2023-10-10T10:00:00","price":10000}}
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=multipartFiles; filename=imageA.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
-
-
- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PathTypeDescription

missionCategoryId

Number

카테고리 아이디

regionId

Number

지역 아이디

latitude

Number

위도

longitude

Number

경도

missionInfo

Object

미션 상세 정보 객체

missionInfo.title

String

제목

missionInfo.content

String

미션 상세 내용

missionInfo.missionDate

String

미션 수행 일

missionInfo.startTime

String

미션 시작 시간

missionInfo.endTime

String

미션 종료 시간

missionInfo.deadlineTime

String

미션 마감 시간

missionInfo.price

Number

미션 포상금

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

시민은 미션을 연장 할 수 있다.

- - ---- - - - - - - - - - - - - -
Table 7. /api/v1/missions/{missionId}/extend
ParameterDescription

missionId

미션 아이디

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
PATCH /api/v1/missions/1/extend HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 124
-Host: localhost:8080
-
-{
-  "missionDate" : "2023-10-10",
-  "startTime" : "10:00",
-  "endTime" : "10:30",
-  "deadlineTime" : "2023-10-10T10:00:00"
-}
-
-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionDate

String

yyyy-MM-dd

미션 수행 일

startTime

String

HH:mm

미션 시작 시간

endTime

String

HH:mm

미션 종료 시간

deadlineTime

String

HH:mm

미션 마감 시간

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

시민은 미션을 완료 상태로 변경 할 수 있다.

- - ---- - - - - - - - - - - - - -
Table 8. /api/v1/missions/{missionId}/complete
ParameterDescription

missionId

미션 아이디

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
PATCH /api/v1/missions/1/complete HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ----- - - - - - - - - - - - - - - -
PathTypeDescription

userId

Number

유저 아이디

-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

시민은 미션을 삭제 할 수 있다.

-
-

Http Request

- - ---- - - - - - - - - - - - - -
Table 9. /api/v1/missions/{missionId}
ParameterDescription

missionId

미션 아이디

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-
DELETE /api/v1/missions/1 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ----- - - - - - - - - - - - - - - -
PathTypeDescription

citizenId

Number

시민 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 204 No Content
-Content-Type: application/json;charset=UTF-8
-Content-Length: 81
-
-{
-  "status" : 204,
-  "data" : null,
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Null

응답 데이터

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Mission Bookmark API

-
-
-

미션 찜 등록

-
-

HTTP Request

-
-
-
POST /api/v1/bookmarks HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 21
-Host: localhost:8080
-
-{
-  "missionId" : 1
-}
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionId

Number

미션 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 201,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

생성된 미션 찜 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

미션 찜 취소

-
-

HTTP Request

-
-
-
DELETE /api/v1/bookmarks HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 21
-Host: localhost:8080
-
-{
-  "missionId" : 1
-}
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionId

Number

미션 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 204 No Content
-Content-Type: application/json;charset=UTF-8
-Content-Length: 81
-
-{
-  "status" : 204,
-  "data" : null,
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PathTypeDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.missionBookmarkId

Number

제거된 북마크 아이디

data.missionId

Number

찜 취소된 미션 아이디

data.userId

Number

찜 취소한 유저 아이디

serverDateTime

String

서버 응답 시간

-
-
-
-
-
-

Mission Match API

-
-
-

미션 매치 생성

-
-

HTTP Request

-
-
-
POST /api/v1/mission-matches HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 37
-Host: localhost:8080
-
-{
-  "missionId" : 2,
-  "heroId" : 3
-}
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionId

Number

미션 아이디

heroId

Number

히어로 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 201,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

생성된 미션 매칭 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

미션 매치 취소

-
-

HTTP Request

-
-
-
PUT /api/v1/mission-matches/cancel HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 21
-Host: localhost:8080
-
-{
-  "missionId" : 2
-}
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionId

Number

미션 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

취소된 미션 매칭 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Mission Proposal API

-
-
-

미션 제안 생성

-
-

HTTP Request

-
-
-
POST /api/v1/mission-proposals HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 37
-Host: localhost:8080
-
-{
-  "missionId" : 1,
-  "heroId" : 1
-}
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionId

Number

미션 아이디

heroId

Number

히어로 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 201 Created
-Location: /api/v1/mission-proposals/1
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 201,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 제안 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

미션 제안 승낙

-
-

HTTP Request

-
-
-
PATCH /api/v1/mission-proposals/1/approve HTTP/1.1
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- - ---- - - - - - - - - - - - - -
Table 10. /api/v1/mission-proposals/{missionProposalId}/approve
ParameterDescription

missionProposalId

미션 제안 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 제안 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

미션 제안 거절

-
-

HTTP Request

-
-
-
PATCH /api/v1/mission-proposals/1/reject HTTP/1.1
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

미션 제안 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

제안받은 미션 조회

-
-

HTTP Request

-
-
-
GET /api/v1/mission-proposals?page=0&size=5 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- ---- - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

heroId

히어로 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 3909
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "id" : 1,
-      "mission" : {
-        "id" : 1,
-        "status" : "MATCHING",
-        "bookmarkCount" : 5,
-        "isBookmarked" : true,
-        "createdAt" : "2023-11-26T20:05:40",
-        "region" : {
-          "si" : "서울시",
-          "gu" : "프로구",
-          "dong" : "래머동"
-        },
-        "missionCategory" : {
-          "code" : "MC_001",
-          "name" : "서빙"
-        },
-        "missionInfo" : {
-          "title" : "미션 제목",
-          "missionDate" : "2023-10-30",
-          "startTime" : "12:00",
-          "endTime" : "18:00",
-          "price" : 30000
-        },
-        "imagePath" : "s3://image"
-      }
-    }, {
-      "id" : 2,
-      "mission" : {
-        "id" : 2,
-        "status" : "MATCHING",
-        "bookmarkCount" : 5,
-        "isBookmarked" : true,
-        "createdAt" : "2023-11-25T20:05:40",
-        "region" : {
-          "si" : "서울시",
-          "gu" : "프로구",
-          "dong" : "래머동"
-        },
-        "missionCategory" : {
-          "code" : "MC_001",
-          "name" : "서빙"
-        },
-        "missionInfo" : {
-          "title" : "미션 제목",
-          "missionDate" : "2023-10-30",
-          "startTime" : "12:00",
-          "endTime" : "18:00",
-          "price" : 30000
-        },
-        "imagePath" : "s3://image"
-      }
-    }, {
-      "id" : 3,
-      "mission" : {
-        "id" : 3,
-        "status" : "MATCHING_COMPLETED",
-        "bookmarkCount" : 5,
-        "isBookmarked" : true,
-        "createdAt" : "2023-11-23T20:05:40",
-        "region" : {
-          "si" : "서울시",
-          "gu" : "프로구",
-          "dong" : "래머동"
-        },
-        "missionCategory" : {
-          "code" : "MC_001",
-          "name" : "서빙"
-        },
-        "missionInfo" : {
-          "title" : "미션 제목",
-          "missionDate" : "2023-10-30",
-          "startTime" : "12:00",
-          "endTime" : "18:00",
-          "price" : 30000
-        },
-        "imagePath" : "s3://image"
-      }
-    }, {
-      "id" : 4,
-      "mission" : {
-        "id" : 4,
-        "status" : "MISSION_COMPLETED",
-        "bookmarkCount" : 5,
-        "isBookmarked" : true,
-        "createdAt" : "2023-11-24T20:05:40",
-        "region" : {
-          "si" : "서울시",
-          "gu" : "프로구",
-          "dong" : "래머동"
-        },
-        "missionCategory" : {
-          "code" : "MC_001",
-          "name" : "서빙"
-        },
-        "missionInfo" : {
-          "title" : "미션 제목",
-          "missionDate" : "2023-10-30",
-          "startTime" : "12:00",
-          "endTime" : "18:00",
-          "price" : 30000
-        },
-        "imagePath" : "s3://image"
-      }
-    }, {
-      "id" : 5,
-      "mission" : {
-        "id" : 5,
-        "status" : "EXPIRED",
-        "bookmarkCount" : 5,
-        "isBookmarked" : true,
-        "createdAt" : "2023-11-23T20:05:40",
-        "region" : {
-          "si" : "서울시",
-          "gu" : "프로구",
-          "dong" : "래머동"
-        },
-        "missionCategory" : {
-          "code" : "MC_001",
-          "name" : "서빙"
-        },
-        "missionInfo" : {
-          "title" : "미션 제목",
-          "missionDate" : "2023-10-30",
-          "startTime" : "12:00",
-          "endTime" : "18:00",
-          "price" : 30000
-        },
-        "imagePath" : "s3://image"
-      }
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 5,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 5,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 5,
-    "first" : true,
-    "last" : false,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

미션 제안 데이터 배열

data.content[].id

Number

미션 제안 ID

data.content[].mission

Object

미션 정보

data.content[].mission.id

Number

미션 ID

data.content[].mission.status

String

미션 상태

data.content[].mission.bookmarkCount

Number

미션 찜 카운트

data.content[].mission.createdAt

String

yyyy-MM-dd'T'HH:mm:ss

미션 생성일

data.content[].mission.imagePath

String

미션 이미지 경로

data.content[].mission.isBookmarked

Boolean

미션 북마크 여부

data.content[].mission.region

Object

지역

data.content[].mission.region.si

String

data.content[].mission.region.gu

String

data.content[].mission.region.dong

String

data.content[].mission.missionCategory

Object

미션 카테고리

data.content[].mission.missionCategory.code

String

카테고리 코드

data.content[].mission.missionCategory.name

String

카테고리 이름

data.content[].mission.missionInfo

Object

미션 상세 정보

data.content[].mission.missionInfo.title

String

미션 제목

data.content[].mission.missionInfo.missionDate

String

yyyy-MM-dd

미션 시작 일

data.content[].mission.missionInfo.startTime

String

HH:mm

미션 시작 시간

data.content[].mission.missionInfo.endTime

String

HH:mm

미션 종료 시간

data.content[].mission.missionInfo.price

Number

급여

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

미션 제안 리스트 크기

data.number

Number

현재 페이지 번호

data.sort

Object

미션 제안 리스트 정렬 정보 객체

data.sort.empty

Boolean

미션 제안 리스트의 정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

미션 제안 리스트의 정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

미션 제안 리스트의 정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

미션 제안 리스트가 비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Review API

-
-
-

리뷰 생성

-
-

HTTP Request

-
-
-
POST /api/v1/reviews HTTP/1.1
-Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Accept: application/json
-Host: localhost:8080
-
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=reviewCreateRequest; filename=json
-Content-Type: application/json
-
-{"senderId":1,"receiverId":2,"missionId":10,"categoryId":1,"missionTitle":"서빙 구함","content":"리뷰 내용","starScore":5}
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=images; filename=imageA.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=images; filename=imageB.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
-
-
- ----- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
PathTypeDescription

senderId

Number

리뷰 작성 유저 아이디

receiverId

Number

리뷰 대상 유저 아이디

missionId

Number

리뷰가 생성된 미션 아이디

categoryId

Number

미션 카테고리 아이디

missionTitle

String

미션 제목

content

String

리뷰 내용

starScore

Number

별점

-
-
-

HTTP Response

-
-
-
HTTP/1.1 201 Created
-Location: /api/v1/reviews/1
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 201,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

생성된 리뷰 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

리뷰 수정

-
-

HTTP Request

-
-
-
POST /api/v1/reviews/1 HTTP/1.1
-Content-Type: multipart/form-data;charset=UTF-8; boundary=6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Accept: application/json
-Host: localhost:8080
-
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=reviewUpdateRequest; filename=json
-Content-Type: application/json
-
-{"content":"리뷰 내용","starScore":5}
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm
-Content-Disposition: form-data; name=images; filename=imageA.jpeg
-Content-Type: image/jpeg
-
-<<jpeg data>>
---6o2knFse3p53ty9dmcQvWAIx1zInP11uCfbm--
-
-
- ----- - - - - - - - - - - - - - - - - - - - -
PathTypeDescription

content

String

리뷰 내용

starScore

Number

별점

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 95
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

수정된 리뷰 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

리뷰 상세 조회

-
-

HTTP Request

-
-
-
GET /api/v1/reviews/1 HTTP/1.1
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Accept: application/json
-Host: localhost:8080
-
-
- - ---- - - - - - - - - - - - - -
Table 11. /api/v1/reviews/{reviewId}
ParameterDescription

reviewId

리뷰 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 719
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1,
-    "senderId" : 1,
-    "senderNickname" : "슈퍼 히어로 토끼",
-    "receiverId" : 2,
-    "categoryId" : 1,
-    "categoryCode" : "MC_001",
-    "categoryName" : "서빙",
-    "missionTitle" : "서빙 구함",
-    "content" : "리뷰 내용",
-    "starScore" : 5,
-    "reviewImageResponses" : [ {
-      "id" : 1,
-      "originalName" : "A 원본 이미지 이름",
-      "uniqueName" : "A",
-      "path" : "S3 이미지 주소A"
-    }, {
-      "id" : 2,
-      "originalName" : "B 원본 이미지 이름",
-      "uniqueName" : "B",
-      "path" : "S3 이미지 주소B"
-    } ],
-    "createdAt" : "2023-11-26T20:05:40"
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

조회한 리뷰 아이디

data.senderId

Number

리뷰 작성 유저 아이디

data.senderNickname

String

리뷰 작성 유저 닉네임

data.receiverId

Number

리뷰 대상 유저 아이디

data.categoryId

Number

미션 카테고리 아이디

data.categoryCode

String

미션 카테고리 코드

data.categoryName

String

미션 카테고리 내용 ex) 청소

data.missionTitle

String

리뷰가 발생된 미션 제목

data.content

String

리뷰 내용

data.starScore

Number

별점

data.createdAt

String

yyyy-MM-dd'T'HH:mm:ss

리뷰 생성 시간

data.reviewImageResponses[]

Array

리뷰 이미지 응답 데이터 배열

data.reviewImageResponses[].id

Number

리뷰 이미지 아이디

data.reviewImageResponses[].originalName

String

리뷰 이미지 오리지널 네임

data.reviewImageResponses[].uniqueName

String

리뷰 이미지 유니크 네임

data.reviewImageResponses[].path

String

리뷰 이미지 S3 주소

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

리뷰 삭제

-
-

HTTP Request

-
-
-
DELETE /api/v1/reviews/1 HTTP/1.1
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- - ---- - - - - - - - - - - - - -
Table 12. /api/v1/reviews/{reviewId}
ParameterDescription

reviewId

리뷰 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 204 No Content
-Content-Type: application/json;charset=UTF-8
-Content-Length: 81
-
-{
-  "status" : 204,
-  "data" : null,
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-
-

특정 유저가 받은 리뷰 조회

-
-

HTTP Request

-
-
-
GET /api/v1/reviews/users/1/receive?page=0&size=5&sort= HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Accept: application/json
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- - ---- - - - - - - - - - - - - -
Table 13. /api/v1/reviews/users/{userId}/receive
ParameterDescription

userId

특정 유저 아이디

- ---- - - - - - - - - - - - - - - - - - - - - -
ParameterDescription

page

페이지 번호

size

데이터 크기

sort

정렬 기준 필드

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1142
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "reviewId" : 1,
-      "senderId" : 5,
-      "senderNickname" : "nickname A",
-      "profileImage" : [ "s3 프로필 이미지 주소" ],
-      "categoryName" : "청소",
-      "missionTitle" : "청소 미션",
-      "starScore" : 4,
-      "createdAt" : "2023-11-26T20:05:41"
-    }, {
-      "reviewId" : 2,
-      "senderId" : 8,
-      "senderNickname" : "nickname B",
-      "profileImage" : [ "s3 프로필 이미지 주소" ],
-      "categoryName" : "심부름",
-      "missionTitle" : "심부름 미션",
-      "starScore" : 3,
-      "createdAt" : "2023-11-26T20:05:41"
-    } ],
-    "pageable" : {
-      "pageNumber" : 0,
-      "pageSize" : 5,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 0,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 5,
-    "number" : 0,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 2,
-    "first" : true,
-    "last" : false,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:41"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

특정 유저가 받은 리뷰 목록 배열

data.content[].reviewId

Number

특정 유저가 받은 리뷰의 아이디

data.content[].senderId

Number

특정 유저가 받은 리뷰를 작성한 유저의 아이디

data.content[].senderNickname

String

특정 유저가 받은 리뷰를 작성한 유저의 닉네임

data.content[].profileImage

Array

O

특정 유저가 받은 리뷰를 작성한 유저의 프로필 이미지 경로

data.content[].categoryName

String

툭정 유저가 받은 리뷰의 미션 카테고리 이름

data.content[].missionTitle

String

특정 유저가 받은 리뷰의 미션 제목

data.content[].starScore

Number

특정 유저가 받은 별점

data.content[].createdAt

String

특정 유저가 리뷰를 받은 시간

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

현재 페이지 조회에서 가져온 리뷰 개수

data.number

Number

현재 페이지 번호

data.sort

Object

정렬 정보 객체

data.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Main API

-
-
-

메인 페이지를 조회한다.

-
-

HTTP Request

-
-
-
GET /api/v1/main?longitude=127.02880308004335&latitude=37.49779692073204 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - - - - - -
ParameterDescription

longitude

경도

latitude

위도

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1299
-
-{
-  "status" : 200,
-  "data" : {
-    "missionCategories" : [ {
-      "id" : 1,
-      "code" : "MC_001",
-      "name" : "서빙"
-    }, {
-      "id" : 2,
-      "code" : "MC_002",
-      "name" : "주방"
-    }, {
-      "id" : 3,
-      "code" : "MC_003",
-      "name" : "배달, 운전"
-    } ],
-    "soonExpiredMissions" : [ {
-      "id" : 1,
-      "title" : "미션 제목1",
-      "region" : {
-        "id" : 1,
-        "si" : "서울시",
-        "gu" : "강남구",
-        "dong" : "역삼동"
-      },
-      "missionCategory" : {
-        "id" : 2,
-        "code" : "MC_002",
-        "name" : "주방"
-      },
-      "missionDate" : "2023-11-22",
-      "bookmarkCount" : 3,
-      "missionStatus" : "MATCHING",
-      "imagePath" : "s3://path",
-      "isBookmarked" : false
-    }, {
-      "id" : 2,
-      "title" : "미션 제목2",
-      "region" : {
-        "id" : 2,
-        "si" : "서울시",
-        "gu" : "강남구",
-        "dong" : "역삼동"
-      },
-      "missionCategory" : {
-        "id" : 3,
-        "code" : "MC_003",
-        "name" : "배달, 운전"
-      },
-      "missionDate" : "2023-11-22",
-      "bookmarkCount" : 3,
-      "missionStatus" : "MATCHING",
-      "imagePath" : "s3://path",
-      "isBookmarked" : false
-    } ]
-  },
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.missionCategories

Array

미션 카테고리 정보 배열

data.missionCategories[].id

Number

미션 카테고리 아이디

data.missionCategories[].code

String

미션 카테고리 코드

data.missionCategories[].name

String

미션 카테고리 내용 ex) 청소

data.soonExpiredMissions

Array

곧 마감될 미션 배열

data.soonExpiredMissions[].id

Number

미션 ID

data.soonExpiredMissions[].title

String

미션 제목

data.soonExpiredMissions[].region.id

Number

지역 ID

data.soonExpiredMissions[].region.si

String

지역 시

data.soonExpiredMissions[].region.gu

String

지역 구

data.soonExpiredMissions[].region.dong

String

지역 동

data.soonExpiredMissions[].missionCategory

Object

미션 카테고리 객체

data.soonExpiredMissions[].missionCategory.id

Number

미션 카테고리 ID

data.soonExpiredMissions[].missionCategory.code

String

미션 카테고리 코드

data.soonExpiredMissions[].missionCategory.name

String

미션 카테고리 이름

data.soonExpiredMissions[].missionDate

String

yyyy-MM-dd

미션 날짜

data.soonExpiredMissions[].bookmarkCount

Number

북마크 횟수

data.soonExpiredMissions[].missionStatus

String

미션 상태

data.soonExpiredMissions[].imagePath

String

O

이미지 사진 경로

data.soonExpiredMissions[].isBookmarked

Boolean

북마크 상태

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

SSE API

-
-
-

SSE 구독

-
-

HTTP Request

-
-
-
GET /api/v1/sse/subscribe HTTP/1.1
-Content-Type: text/event-stream;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-
-
-
-
-
-
-
-

Alarm API

-
-
-

알림 조회

-
-

HTTP Request

-
-
-
GET /api/v1/alarms HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 1245
-
-{
-  "status" : 200,
-  "data" : {
-    "content" : [ {
-      "id" : "f26d85bd-b53c-42f4-b091-934d559b8e2f",
-      "title" : "알림 제목",
-      "content" : "알림 내용",
-      "createdAt" : "2023-11-21T12:00:00"
-    }, {
-      "id" : "44684d3b-eccd-4850-8de1-28dfbf5577e9",
-      "title" : "알림 제목",
-      "content" : "알림 내용",
-      "createdAt" : "2023-11-21T10:00:00"
-    }, {
-      "id" : "fce0354f-cd9e-4a87-8e1e-64b925ab1482",
-      "title" : "알림 제목",
-      "content" : "알림 내용",
-      "createdAt" : "2023-11-20T12:00:00"
-    }, {
-      "id" : "1fb6bf49-983f-4206-b204-ef69d4e28b80",
-      "title" : "알림 제목",
-      "content" : "알림 내용",
-      "createdAt" : "2023-11-14T12:00:00"
-    } ],
-    "pageable" : {
-      "pageNumber" : 1,
-      "pageSize" : 4,
-      "sort" : {
-        "empty" : true,
-        "sorted" : false,
-        "unsorted" : true
-      },
-      "offset" : 4,
-      "paged" : true,
-      "unpaged" : false
-    },
-    "size" : 4,
-    "number" : 1,
-    "sort" : {
-      "empty" : true,
-      "sorted" : false,
-      "unsorted" : true
-    },
-    "numberOfElements" : 4,
-    "first" : false,
-    "last" : false,
-    "empty" : false
-  },
-  "serverDateTime" : "2023-11-26T20:05:38"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.content[]

Array

알람 응답 데이터 배열

data.content[].id

String

알람 ID

data.content[].title

String

알람 제목

data.content[].content

String

알람 내용

data.content[].createdAt

String

알림 생성 시간

data.pageable.pageNumber

Number

현재 페이지 번호

data.pageable.pageSize

Number

페이지 크기

data.pageable.sort

Object

정렬 상태 객체

data.pageable.sort.empty

Boolean

정렬 정보가 비어있는지 여부

data.pageable.sort.sorted

Boolean

정렬 정보가 있는지 여부

data.pageable.sort.unsorted

Boolean

정렬 정보가 정렬되지 않은지 여부

data.pageable.offset

Number

페이지 번호

data.pageable.paged

Boolean

페이징이 되어 있는지 여부

data.pageable.unpaged

Boolean

페이징이 되어 있지 않은지 여부

data.size

Number

알람 리스트 크기

data.number

Number

현재 페이지 번호

data.sort

Object

알람 리스트 정렬 정보 객체

data.sort.empty

Boolean

알람 리스트의 정렬 정보가 비어있는지 여부

data.sort.sorted

Boolean

알람 리스트의 정렬 정보가 있는지 여부

data.sort.unsorted

Boolean

알람 리스트의 정렬 정보가 정렬되지 않은지 여부

data.numberOfElements

Number

현재 페이지의 요소 수

data.first

Boolean

첫 번째 페이지인지 여부

data.last

Boolean

마지막 페이지인지 여부

data.empty

Boolean

알람 리스트가 비어있는지 여부

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

알림 삭제

-
-

HTTP Request

-
-
-
DELETE /api/v1/alarms/b301c854-a1f9-4792-ae51-966ca44242d8 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Authorization: Bearer 액세스토큰

- - ---- - - - - - - - - - - - - -
Table 14. /api/v1/alarms/{alarmId}
ParameterDescription

alarmId

알람 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 204 No Content
-Content-Type: application/json;charset=UTF-8
-Content-Length: 81
-
-{
-  "status" : 204,
-  "data" : null,
-  "serverDateTime" : "2023-11-26T20:05:38"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Null

응답 데이터

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Chatroom API

-
-
-

시민은 채팅방을 만들 수 있다.

-
-

HTTP Request

-
-
-
POST /api/v1/chat-rooms HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Content-Length: 45
-Host: localhost:8080
-
-{
-  "missionId" : 1,
-  "userIds" : [ 1, 2 ]
-}
-
-
-
-
-

Request Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

missionId

Number

미션 아이디

userIds

Array

채팅방에 들어갈 유저 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 201 Created
-Location: /api/v1/chat-rooms/1
-Content-Type: application/json;charset=UTF-8
-Content-Length: 137
-
-{
-  "status" : 201,
-  "data" : {
-    "id" : 1,
-    "missionId" : 1,
-    "headCount" : 2
-  },
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

채팅방 아이디

data.missionId

Number

미션 아이디

data.headCount

Number

채팅방 인원 수

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 현재 자신이 들어가 있는 채팅방을 조회 할 수 있다.

-
-

HTTP Request

-
-
-
GET /api/v1/chat-rooms/me HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 840
-
-{
-  "status" : 200,
-  "data" : [ {
-    "id" : 1,
-    "missionId" : 1,
-    "missionStatus" : "MATCHING",
-    "receiverId" : 1,
-    "title" : "심부름 해주실 분을 찾습니다.",
-    "receiverNickname" : "슈퍼 히어로 토끼 A",
-    "receiverImagePath" : "s3://abc.jpeg",
-    "lastSentMessage" : "거의 다 와갑니다!",
-    "headCount" : 1,
-    "lastSentMessageTime" : "2023-11-12T12:00:00"
-  }, {
-    "id" : 2,
-    "missionId" : 2,
-    "missionStatus" : "MATCHING_COMPLETED",
-    "receiverId" : 2,
-    "title" : "벌레 잡아주실 분을 찾습니다.",
-    "receiverNickname" : "슈퍼 히어로 토끼 B",
-    "receiverImagePath" : "s3://abd.jpeg",
-    "lastSentMessage" : "어떤 벌레인가요?",
-    "headCount" : 2,
-    "lastSentMessageTime" : "2023-11-12T12:00:00"
-  } ],
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data[]

Array

채팅방 조회 배열

data[].id

Number

채팅방 아이디

data[].missionId

Number

미션 아이디

data[].title

String

미션 제목

data[].missionStatus

String

미션 상태

data[].receiverId

Number

수신자 아이디

data[].receiverNickname

String

수신자 닉네임

data[].receiverImagePath

String

수신자 프로필 이미지 경로

data[].lastSentMessage

String

마지막으로 받은 메시지

data[].lastSentMessageTime

String

yyyy-MM-dd'T'HH:mm:ss

마지막으로 받은 메시지 시간

data[].headCount

Number

채팅방 인원

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 채팅방의 채팅 내역을 조회 할 수 있다.

-
-

HTTP Request

-
-
-
GET /api/v1/chat-rooms/1 HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- - ---- - - - - - - - - - - - - -
Table 15. /api/v1/chat-rooms/{chatRoomId}
ParameterDescription

chatRoomId

채팅방 ID

- ---- - - - - - - - - - - - - -
NameDescription

Authorization

Auth Credential

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 369
-
-{
-  "status" : 200,
-  "data" : [ {
-    "senderNickName" : "거북이",
-    "message" : "안녕하세요!",
-    "sentMessageTime" : "2023-11-26T19:25:30"
-  }, {
-    "senderNickName" : "두루미",
-    "message" : "안녕하세요! 미션 내용 확인하고자합니다!",
-    "sentMessageTime" : "2023-11-26T19:27:00"
-  } ],
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data[]

Array

채팅방 메시지 배열

data[].senderNickName

String

채팅방 아이디

data[].message

String

미션 제목

data[].sentMessageTime

String

yyyy-MM-dd'T'HH:mm:ss

수신자 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-

유저는 현재 자신이 들어가 있는 채팅방을 나갈 수 있다.

-
-

HTTP Request

- - ---- - - - - - - - - - - - - -
Table 16. /api/v1/chat-rooms/{chatRoomId}/exit
ParameterDescription

chatRoomId

채팅방 아이디

-
-
-
PATCH /api/v1/chat-rooms/1/exit HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJpZCI6MSwicm9sZSI6Ik1FTUJFUiIsImlhdCI6MTY5OTk0MDA5NiwiZXhwIjoxNzU5OTQwMDk2fQ.7xyZyQIzbkp-FLxNOLXpSI3Yg0CZ8tAJvlHrgATzZB4
-Host: localhost:8080
-
-
- ----- - - - - - - - - - - - - - - -
PathTypeDescription

userId

Number

유저 아이디

-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 134
-
-{
-  "status" : 200,
-  "data" : {
-    "id" : 1,
-    "userId" : 1,
-    "missionId" : 1
-  },
-  "serverDateTime" : "2023-11-26T20:05:39"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data

Object

응답 데이터

data.id

Number

채팅방 아이디

data.missionId

Number

미션 아이디

data.userId

Number

유저 아이디

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
-

Region API

-
-
-

모든 지역 조회

-
-

HTTP Request

-
-
-
GET /api/v1/regions HTTP/1.1
-Content-Type: application/json;charset=UTF-8
-Host: localhost:8080
-
-
-
-
-

HTTP Response

-
-
-
HTTP/1.1 200 OK
-Content-Type: application/json;charset=UTF-8
-Content-Length: 472
-
-{
-  "status" : 200,
-  "data" : [ {
-    "si" : "서울특별시",
-    "gu" : [ {
-      "gu" : "강남구",
-      "dong" : [ {
-        "id" : 1,
-        "dong" : "삼성1동"
-      }, {
-        "id" : 2,
-        "dong" : "삼성2동"
-      } ]
-    }, {
-      "gu" : "서초구",
-      "dong" : [ {
-        "id" : 3,
-        "dong" : "양재1동"
-      }, {
-        "id" : 4,
-        "dong" : "양재2동"
-      } ]
-    } ]
-  } ],
-  "serverDateTime" : "2023-11-26T20:05:40"
-}
-
-
-
-
-

Response Fields

- ------- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
pathtypeOptionalFormatDescription

status

Number

HTTP 응답 코드

data[].si

String

행정 구역 (시)

data[].gu

Array

행정 구역 (구) 배열

data[].gu[].gu

String

행정 구역 (구)

data[].gu[].dong

Array

행정 구역 (동) 배열

data[].gu[].dong[].id

Number

지역 아이디

data[].gu[].dong[].dong

String

행정 구역 (동)

serverDateTime

String

yyyy-MM-dd'T'HH:mm:ss

서버 응답 시간

-
-
-
-
-
- - - - - \ No newline at end of file diff --git a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java b/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java index ac446f77..bd1e96e0 100644 --- a/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java +++ b/onedayhero-application/src/main/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomService.java @@ -17,6 +17,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.ArrayList; import java.util.List; @@ -25,6 +26,7 @@ @Slf4j @RequiredArgsConstructor @Service +@Transactional(readOnly = true) public class ChatRoomService { private static final int MAX_CAPACITY = 2; @@ -35,6 +37,7 @@ public class ChatRoomService { private final MissionChatRoomRedisRepository missionChatRoomRedisRepository; private final ChatMessageMongoRepository chatMessageMongoRepository; + @Transactional public MissionChatRoomCreateResponse createChatRoom( CreateMissionChatRoomServiceRequest request ) { @@ -51,11 +54,12 @@ public List findJoinedChatRoom( var missionChatRooms = userMissionChatRoomRepository.findByUserIdAndIsJoinedTrue(userId); var chatRoomIds = getJoinedChatRoomIds(missionChatRooms); - var latestMessagesByChatRoomIds = chatMessageMongoRepository.findLatestMessagesByChatRoomIds(chatRoomIds); - var receiverIds = getReceiverIds(userId, chatRoomIds); + var receiverChatRoomInfos = userMissionChatRoomRepository.findReceiverChatRoomInfoInReceiverIds(receiverIds); + var latestMessagesByChatRoomIds = chatMessageMongoRepository.findLatestMessagesByChatRoomIds(chatRoomIds); + var missionChatRoomFindResponses = makeMissionChatRoomResponse(receiverChatRoomInfos, latestMessagesByChatRoomIds); return missionChatRoomFindResponses; @@ -81,15 +85,17 @@ public MissionChatRoomExitResponse exitChatRoom( return MissionChatRoomExitResponse.from(userChatRoom.getMissionChatRoom(), userId); } + // 유저가 나가지 않은 채팅방에 속한 다른 유저들을 조회한다. private List getJoinedChatRoomIds( - List missionChatRooms + List userMissionChatRooms ) { - return missionChatRooms.stream() - .mapToLong(UserMissionChatRoom::getId) + return userMissionChatRooms.stream() + .mapToLong((userMissionChatRoom) -> userMissionChatRoom.getMissionChatRoom().getId()) .boxed() .toList(); } + // 채팅 수신자에 대한 수신자 아이디를 가지고 온다. private List getReceiverIds( Long userId, List chatRoomIds @@ -102,6 +108,7 @@ private List getReceiverIds( .toList(); } + // 똑같은 채팅방 ID에 속한 값으로 채팅방 목록 응답 값을 생성한다. private List makeMissionChatRoomResponse( List receiverChatRoomInfos, List latestMessagesByChatRoomIds @@ -125,14 +132,6 @@ private List makeMissionChatRoomResponse( return result; } - public MissionChatRoomCreateResponse findOne( - Long missionChatRoomId - ) { - var missionChatRoom = missionChatRoomReader.findById(missionChatRoomId); - - return MissionChatRoomCreateResponse.from(missionChatRoom); - } - private UserMissionChatRoom getUserChatRoom( Long userId, List findMissionChatRooms @@ -142,4 +141,12 @@ private UserMissionChatRoom getUserChatRoom( .findFirst() .orElseThrow(() -> new IllegalArgumentException(ErrorCode.T_001.name())); } + + public MissionChatRoomCreateResponse findOne( + Long missionChatRoomId + ) { + var missionChatRoom = missionChatRoomReader.findById(missionChatRoomId); + + return MissionChatRoomCreateResponse.from(missionChatRoom); + } } diff --git a/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/IntegrationApplicationTest.java b/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/IntegrationApplicationTest.java index 3f4da10e..9ae24f77 100644 --- a/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/IntegrationApplicationTest.java +++ b/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/IntegrationApplicationTest.java @@ -19,6 +19,8 @@ import com.sixheroes.onedayherodomain.mission.repository.MissionCategoryRepository; import com.sixheroes.onedayherodomain.mission.repository.MissionImageRepository; import com.sixheroes.onedayherodomain.mission.repository.MissionRepository; +import com.sixheroes.onedayherodomain.missionchatroom.repository.MissionChatRoomRepository; +import com.sixheroes.onedayherodomain.missionchatroom.repository.UserMissionChatRoomRepository; import com.sixheroes.onedayherodomain.missionproposal.repository.MissionProposalRepository; import com.sixheroes.onedayherodomain.region.Region; import com.sixheroes.onedayherodomain.region.repository.RegionRepository; @@ -27,6 +29,7 @@ import com.sixheroes.onedayherodomain.user.repository.UserMissionCategoryRepository; import com.sixheroes.onedayherodomain.user.repository.UserRegionRepository; import com.sixheroes.onedayherodomain.user.repository.UserRepository; +import com.sixheroes.onedayheromongo.chat.repository.ChatMessageMongoRepository; import org.junit.jupiter.api.BeforeAll; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -55,6 +58,12 @@ public abstract class IntegrationApplicationTest { @Autowired protected RegionRepository regionRepository; + @Autowired + protected MissionChatRoomRepository missionChatRoomRepository; + + @Autowired + protected UserMissionChatRoomRepository userMissionChatRoomRepository; + @Autowired protected MissionService missionService; @@ -112,6 +121,9 @@ public abstract class IntegrationApplicationTest { @MockBean protected MissionChatRoomRedisRepository missionChatRoomRedisRepository; + @MockBean + protected ChatMessageMongoRepository chatMessageMongoRepository; + @BeforeAll public static void setUp( @Autowired MissionCategoryRepository missionCategoryRepository, diff --git a/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomServiceTest.java b/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomServiceTest.java index 4a3ee09d..f5d5594a 100644 --- a/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomServiceTest.java +++ b/onedayhero-application/src/test/java/com/sixheroes/onedayheroapplication/chatroom/ChatRoomServiceTest.java @@ -3,14 +3,25 @@ import com.sixheroes.onedayheroapplication.IntegrationApplicationTest; import com.sixheroes.onedayheroapplication.chatroom.request.CreateMissionChatRoomServiceRequest; import com.sixheroes.onedayherochat.application.repository.request.MissionChatRoomRedisRequest; +import com.sixheroes.onedayherodomain.mission.Mission; +import com.sixheroes.onedayherodomain.mission.MissionInfo; +import com.sixheroes.onedayherodomain.mission.MissionStatus; import com.sixheroes.onedayherodomain.missionchatroom.MissionChatRoom; +import com.sixheroes.onedayherodomain.user.*; +import com.sixheroes.onedayheromongo.chat.ChatMessage; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.List; +import java.util.UUID; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.tuple; +import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.any; @@ -41,4 +52,224 @@ void createChatRoom() { // then assertThat(chatRoom.missionId()).isEqualTo(missionId); } + + @DisplayName("유저가 둘 다 나가있지 않은 상태에서 채팅방을 나갈 수 있다.") + @Test + void exitChatRoomWithMaxConnection() { + // given + var missionId = 1L; + var userIds = List.of(1L, 2L); + + var request = CreateMissionChatRoomServiceRequest.builder() + .missionId(missionId) + .userIds(userIds) + .build(); + + var missionChatRoom = MissionChatRoom.createMissionChatRoom(request.missionId(), request.userIds()); + var redisRequest = MissionChatRoomRedisRequest.from(missionChatRoom); + + given(missionChatRoomRedisRepository.create(any(MissionChatRoomRedisRequest.class))) + .willReturn(redisRequest); + + var chatRoom = chatRoomService.createChatRoom(request); + + // when + chatRoomService.exitChatRoom(chatRoom.id(), 1L); + + var findMissionChatRoom = missionChatRoomRepository.findById(chatRoom.id()).get(); + var userMissionChatRooms = userMissionChatRoomRepository.findByMissionChatRoom_Id(chatRoom.id()); + + // then + assertThat(findMissionChatRoom.getHeadCount()).isEqualTo(1); + assertThat(userMissionChatRooms.size()).isEqualTo(1); + } + + @DisplayName("유저 한명이 나간 상태에서 채팅방을 나가면 채팅방이 삭제 된다.") + @Test + void exitChatRoomWithAlone() { + // given + var missionId = 1L; + var userIds = List.of(1L, 2L); + + var request = CreateMissionChatRoomServiceRequest.builder() + .missionId(missionId) + .userIds(userIds) + .build(); + + var missionChatRoom = MissionChatRoom.createMissionChatRoom(request.missionId(), request.userIds()); + var redisRequest = MissionChatRoomRedisRequest.from(missionChatRoom); + + given(missionChatRoomRedisRepository.create(any(MissionChatRoomRedisRequest.class))) + .willReturn(redisRequest); + + var chatRoom = chatRoomService.createChatRoom(request); + chatRoomService.exitChatRoom(chatRoom.id(), 1L); + + // when + chatRoomService.exitChatRoom(chatRoom.id(), 2L); + var findMissionChatRoom = missionChatRoomRepository.findById(chatRoom.id()); + + // then + assertThat(findMissionChatRoom).isEmpty(); + } + + @DisplayName("현재 유저가 들어가 있는 채팅방 목록을 확인 할 수 있다.") + @Test + void findJoinedChatRooms() { + // given + var missionId = 1L; + + var userA = User.builder() + .email(Email.builder() + .email("abc@123.com") + .build()) + .userBasicInfo(UserBasicInfo.builder() + .nickname("시민 A") + .birth(LocalDate.of(1990, 1, 1)) + .gender(UserGender.MALE) + .introduce("그냥 한 번 만들어봤습니다.") + .build()) + .userFavoriteWorkingDay(UserFavoriteWorkingDay.builder() + .favoriteDate(List.of(Week.MON, Week.THU)) + .favoriteStartTime(LocalTime.of(12, 0, 0)) + .favoriteEndTime(LocalTime.of(18, 0, 0)) + .build()) + .userSocialType(UserSocialType.KAKAO) + .userRole(UserRole.MEMBER) + .build(); + + + var userB = User.builder() + .email(Email.builder() + .email("abcde@123.com") + .build()) + .userBasicInfo(UserBasicInfo.builder() + .nickname("시민 B") + .birth(LocalDate.of(1990, 1, 10)) + .gender(UserGender.MALE) + .introduce("설거지 일등 공신") + .build()) + .userFavoriteWorkingDay(UserFavoriteWorkingDay.builder() + .favoriteDate(List.of(Week.MON, Week.THU)) + .favoriteStartTime(LocalTime.of(12, 0, 0)) + .favoriteEndTime(LocalTime.of(18, 0, 0)) + .build()) + .userSocialType(UserSocialType.KAKAO) + .userRole(UserRole.MEMBER) + .build(); + + var userC = User.builder() + .email(Email.builder() + .email("abcdefgh@123.com") + .build()) + .userBasicInfo(UserBasicInfo.builder() + .nickname("시민 C") + .birth(LocalDate.of(1990, 1, 10)) + .gender(UserGender.FEMALE) + .introduce("누구보다 벌레 잡기를 잘합니다.") + .build()) + .userFavoriteWorkingDay(UserFavoriteWorkingDay.builder() + .favoriteDate(List.of(Week.MON, Week.THU)) + .favoriteStartTime(LocalTime.of(12, 0, 0)) + .favoriteEndTime(LocalTime.of(18, 0, 0)) + .build()) + .userSocialType(UserSocialType.KAKAO) + .userRole(UserRole.MEMBER) + .build(); + + userRepository.saveAll(List.of(userA, userB, userC)); + + var missionCategory = missionCategoryRepository.findById(1L).get(); + + var mission = Mission.builder() + .missionCategory(missionCategory) + .citizenId(1L) + .regionId(1L) + .location(Mission.createPoint(127.3324, 36.1807)) + .missionInfo(MissionInfo.builder() + .missionDate(LocalDate.of(2023, 11, 25)) + .startTime(LocalTime.of(9, 0, 0)) + .endTime(LocalTime.of(14, 0, 0)) + .deadlineTime(LocalDateTime.of( + LocalDate.of(2023, 11, 25), + LocalTime.of(9, 0, 0) + )) + .serverTime(LocalDateTime.of( + LocalDate.of(2023, 10, 18), + LocalTime.MIDNIGHT + )) + .title("벌레를 잡아주세요!") + .content("이상하게 생긴 벌레가 있어요 ㅠㅠㅠ") + .price(5500) + .build()) + .bookmarkCount(0) + .missionStatus(MissionStatus.MATCHING) + .build(); + + missionRepository.save(mission); + + var userIdsA = List.of(1L, 2L); + var userIdsB = List.of(1L, 3L); + + var requestA = CreateMissionChatRoomServiceRequest.builder() + .missionId(missionId) + .userIds(userIdsA) + .build(); + + var requestB = CreateMissionChatRoomServiceRequest.builder() + .missionId(missionId) + .userIds(userIdsB) + .build(); + + var missionChatRoomA = MissionChatRoom.createMissionChatRoom(requestA.missionId(), requestA.userIds()); + var redisRequestA = MissionChatRoomRedisRequest.from(missionChatRoomA); + + given(missionChatRoomRedisRepository.create(any(MissionChatRoomRedisRequest.class))) + .willReturn(redisRequestA); + + var missionChatRoomB = MissionChatRoom.createMissionChatRoom(requestB.missionId(), requestB.userIds()); + var redisRequestB = MissionChatRoomRedisRequest.from(missionChatRoomB); + + given(missionChatRoomRedisRepository.create(any(MissionChatRoomRedisRequest.class))) + .willReturn(redisRequestB); + + var chatRoomA = chatRoomService.createChatRoom(requestA); + var chatRoomB = chatRoomService.createChatRoom(requestB); + + var lastChatMessageA = ChatMessage.builder() + .id(UUID.randomUUID().toString()) + .chatRoomId(chatRoomA.id()) + .senderId(2L) + .message("네! 금방 가도록 하겠습니다!") + .sentMessageTime(LocalDateTime.of( + LocalDate.of(2023, 11, 27), + LocalTime.of(17, 5, 3))) + .build(); + + var lastChatMessageB = ChatMessage.builder() + .id(UUID.randomUUID().toString()) + .chatRoomId(chatRoomB.id()) + .senderId(3L) + .message("헉 거리가 생각보다 꽤 되네요.") + .sentMessageTime(LocalDateTime.of( + LocalDate.of(2023, 11, 27), + LocalTime.of(12, 18, 31))) + .build(); + + + var lastChatMessages = List.of(lastChatMessageA, lastChatMessageB); + + given(chatMessageMongoRepository.findLatestMessagesByChatRoomIds(anyList())) + .willReturn(lastChatMessages); + + // when + var joinedChatRoom = chatRoomService.findJoinedChatRoom(1L); + + // then + assertThat(joinedChatRoom) + .extracting("id", "missionId", "receiverId", "lastSentMessage", "lastSentMessageTime") + .containsExactlyInAnyOrder( + tuple(chatRoomA.id(), chatRoomA.missionId(), 2L, lastChatMessageA.getMessage(), lastChatMessageA.getSentMessageTime()), + tuple(chatRoomB.id(), chatRoomB.missionId(), 3L, lastChatMessageB.getMessage(), lastChatMessageB.getSentMessageTime())); + } } \ No newline at end of file diff --git a/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java b/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java index fa13c2c7..6ffb3976 100644 --- a/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java +++ b/onedayhero-domain/src/main/java/com/sixheroes/onedayherodomain/missionchatroom/repository/UserMissionChatRoomRepository.java @@ -19,14 +19,10 @@ public interface UserMissionChatRoomRepository extends JpaRepository findReceiverChatRoomInfoInReceiverIds(List receiverIds);