Skip to content

Commit bcc76a8

Browse files
authored
Merge pull request #60 from swyp-app-team-4/feat#12-region-api
Feat#12 region api
2 parents 0102427 + 951dbfb commit bcc76a8

17 files changed

Lines changed: 282 additions & 74 deletions

File tree

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ dependencies {
7676
implementation 'com.google.firebase:firebase-admin:9.5.0'
7777
implementation 'org.springframework.boot:spring-boot-starter-batch'
7878

79+
7980
//s3
8081
implementation 'software.amazon.awssdk:s3:2.20.56'
8182

src/main/java/boombimapi/domain/alarm/presentation/controller/AlarmController.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,25 @@
99
import boombimapi.domain.alarm.presentation.dto.res.HistoryResponse;
1010
import boombimapi.domain.alarm.presentation.dto.res.RegisterFcmTokenResponse;
1111
import boombimapi.domain.alarm.presentation.dto.res.SendAlarmResponse;
12+
import boombimapi.global.response.BaseOKResponse;
1213
import io.swagger.v3.oas.annotations.Operation;
1314
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1415
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1516
import io.swagger.v3.oas.annotations.tags.Tag;
1617
import jakarta.validation.Valid;
1718
import lombok.RequiredArgsConstructor;
1819
import lombok.extern.slf4j.Slf4j;
20+
import org.springframework.http.HttpStatus;
1921
import org.springframework.http.ResponseEntity;
2022
import org.springframework.security.core.annotation.AuthenticationPrincipal;
2123
import org.springframework.web.bind.annotation.*;
2224

2325
import java.util.List;
2426
import java.util.concurrent.CompletableFuture;
2527

28+
import static boombimapi.global.response.ResponseMessage.GET_ALARM_SUCCESS;
29+
import static boombimapi.global.response.ResponseMessage.VOTE_SUCCESS;
30+
2631
@RestController
2732
@RequestMapping("/api/alarm")
2833
@RequiredArgsConstructor
@@ -85,24 +90,33 @@ public ResponseEntity<List<HistoryResponse>> getAlarmHistory(
8590
@ApiResponse(responseCode = "404", description = "알림 및 유저 존재하지 않음"),
8691
})
8792
@PatchMapping
88-
public void updateAlarmRead(
93+
public ResponseEntity<BaseOKResponse<Void>> updateAlarmRead(
8994
@AuthenticationPrincipal String userId,
9095
@RequestBody UpdateAlarmStatusReq req
9196
) {
9297
alarmService.updateAlarmRead(userId, req);
98+
99+
return ResponseEntity.ok(
100+
BaseOKResponse.of(
101+
HttpStatus.OK,
102+
GET_ALARM_SUCCESS));
93103
}
94104

105+
95106
@Operation(summary = "알림 설정 활성화", description = "알림을 활성화 및 비활성화를 합니다.")
96107
@ApiResponses(value = {
97108
@ApiResponse(responseCode = "200", description = "조회 성공"),
98109
@ApiResponse(responseCode = "404", description = "유저 존재하지 않음"),
99110
})
100111
@PatchMapping("/status")
101-
public void updateAlarmStatus(
112+
public ResponseEntity<BaseOKResponse<Void>> updateAlarmStatus(
102113
@AuthenticationPrincipal String userId
103114
) {
104115
alarmService.updateAlarmStatus(userId);
116+
return ResponseEntity.ok(
117+
BaseOKResponse.of(
118+
HttpStatus.OK,
119+
GET_ALARM_SUCCESS));
105120
}
106121

107-
108122
}

src/main/java/boombimapi/domain/congestion/repository/MemberCongestionRepository.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import boombimapi.domain.congestion.entity.MemberCongestion;
44
import java.time.LocalDateTime;
55
import java.util.Optional;
6+
7+
import feign.Param;
68
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
710

811
public interface MemberCongestionRepository extends JpaRepository<MemberCongestion, Long> {
912

@@ -17,4 +20,12 @@ Optional<MemberCongestion> findFirstByMemberPlaceIdAndExpiresAtAfterOrderByCreat
1720
LocalDateTime now
1821
);
1922

23+
@Query("""
24+
SELECT COUNT(mc)
25+
FROM MemberCongestion mc
26+
WHERE mc.memberPlace.id = :placeId
27+
AND CAST(mc.createdAt AS DATE) = CURRENT_DATE
28+
""")
29+
long countTodayByPlace(@Param("placeId") Long placeId);
30+
2031
}

src/main/java/boombimapi/domain/favorite/repository/FavoriteRepository.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@
22

33
import boombimapi.domain.favorite.entity.Favorite;
44
import java.util.List;
5+
6+
import boombimapi.domain.member.domain.entity.Member;
7+
import feign.Param;
58
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
610

711
public interface FavoriteRepository extends JpaRepository<Favorite, Long> {
812

@@ -20,4 +24,13 @@ List<Favorite> findAllByMemberId(
2024
String memberId
2125
);
2226

27+
28+
@Query("SELECT f FROM Favorite f " +
29+
"JOIN FETCH f.memberPlace mp " +
30+
"JOIN FETCH mp.memberCongestions mc " +
31+
"JOIN FETCH mc.congestionLevel cl " +
32+
"WHERE f.member = :member")
33+
List<Favorite> findByMemberWithJoin(@Param("member") Member member);
34+
35+
2336
}

src/main/java/boombimapi/domain/member/application/service/MemberService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,8 @@
22

33

44
import boombimapi.domain.member.presentation.dto.member.req.MemberLeaveReq;
5-
import boombimapi.domain.member.presentation.dto.member.res.GetMemberRes;
6-
import boombimapi.domain.member.presentation.dto.member.res.GetNicknameRes;
5+
import boombimapi.domain.member.presentation.dto.member.res.*;
76

8-
import boombimapi.domain.member.presentation.dto.member.res.MyPageVoteRes;
9-
import boombimapi.domain.member.presentation.dto.member.res.ProfileRes;
107
import org.springframework.web.multipart.MultipartFile;
118

129
import java.io.IOException;
@@ -17,6 +14,9 @@ public interface MemberService {
1714
// 1번 구간
1815
GetMemberRes getMember(String userId);
1916

17+
// 2번 구간
18+
List<GetFavoriteRes> getFavorites(String userId);
19+
2020
// 3번 구간
2121
List<MyPageVoteRes> getMyVoteAnswer(String userId);
2222

src/main/java/boombimapi/domain/member/application/service/impl/MemberServiceImpl.java

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,17 @@
11
package boombimapi.domain.member.application.service.impl;
22

33

4+
import boombimapi.domain.congestion.repository.MemberCongestionRepository;
5+
import boombimapi.domain.favorite.entity.Favorite;
6+
import boombimapi.domain.favorite.repository.FavoriteRepository;
47
import boombimapi.domain.member.application.service.MemberService;
58

69
import boombimapi.domain.member.domain.entity.Member;
710
import boombimapi.domain.member.domain.entity.MemberLeave;
811
import boombimapi.domain.member.domain.repository.MemberLeaveRepository;
912
import boombimapi.domain.member.domain.repository.MemberRepository;
1013
import boombimapi.domain.member.presentation.dto.member.req.MemberLeaveReq;
11-
import boombimapi.domain.member.presentation.dto.member.res.GetMemberRes;
12-
import boombimapi.domain.member.presentation.dto.member.res.GetNicknameRes;
13-
import boombimapi.domain.member.presentation.dto.member.res.MyPageVoteRes;
14-
import boombimapi.domain.member.presentation.dto.member.res.ProfileRes;
14+
import boombimapi.domain.member.presentation.dto.member.res.*;
1515
import boombimapi.domain.member.presentation.dto.member.res.mypage.MPVoteRes;
1616
import boombimapi.domain.vote.domain.entity.Vote;
1717
import boombimapi.domain.vote.domain.entity.VoteAnswer;
@@ -47,6 +47,8 @@ public class MemberServiceImpl implements MemberService {
4747
private final VoteRepository voteRepository;
4848
private final S3Service s3Service;
4949
private final MemberLeaveRepository memberLeaveRepository;
50+
private final FavoriteRepository favoriteRepository;
51+
private final MemberCongestionRepository memberCongestionRepository;
5052

5153
@Override
5254
public GetMemberRes getMember(String userId) {
@@ -63,6 +65,31 @@ public GetMemberRes getMember(String userId) {
6365
return GetMemberRes.of(user, (long) voteAnswers.size(), (long) (voteDus.size() + votes.size()));
6466
}
6567

68+
@Override
69+
public List<GetFavoriteRes> getFavorites(String userId) {
70+
Member user = userRepository.findById(userId).orElse(null);
71+
if (user == null) throw new BoombimException(ErrorCode.USER_NOT_EXIST);
72+
73+
List<GetFavoriteRes> result = new ArrayList<>();
74+
75+
76+
List<Favorite> byFavorites = favoriteRepository.findByMemberWithJoin(user);
77+
78+
79+
for (Favorite byFavorite : byFavorites) {
80+
81+
long todyPeopleCnt = memberCongestionRepository.countTodayByPlace(byFavorite.getMemberPlace().getId());
82+
GetFavoriteRes getFavoriteRes = GetFavoriteRes.of("",
83+
byFavorite.getMemberPlace().getName(),
84+
byFavorite.getMemberPlace().getId(),
85+
byFavorite.getMemberPlace().getMemberCongestions().get(0).getCongestionLevel().getName(),
86+
String.valueOf(todyPeopleCnt));
87+
result.add(getFavoriteRes);
88+
}
89+
90+
return result;
91+
}
92+
6693
// 3번 api 투표
6794
@Override
6895
public List<MyPageVoteRes> getMyVoteAnswer(String userId) {

src/main/java/boombimapi/domain/member/presentation/controller/MemberController.java

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,16 @@
33
import boombimapi.domain.member.application.service.MemberService;
44
import boombimapi.domain.member.presentation.dto.member.req.MemberLeaveReq;
55
import boombimapi.domain.member.presentation.dto.member.req.NicknameReq;
6-
import boombimapi.domain.member.presentation.dto.member.res.GetMemberRes;
7-
import boombimapi.domain.member.presentation.dto.member.res.GetNicknameRes;
8-
import boombimapi.domain.member.presentation.dto.member.res.MyPageVoteRes;
9-
import boombimapi.domain.member.presentation.dto.member.res.ProfileRes;
6+
import boombimapi.domain.member.presentation.dto.member.res.*;
7+
import boombimapi.global.response.BaseOKResponse;
8+
import boombimapi.global.response.BaseResponse;
109
import io.swagger.v3.oas.annotations.Operation;
1110
import io.swagger.v3.oas.annotations.responses.ApiResponse;
1211
import io.swagger.v3.oas.annotations.responses.ApiResponses;
1312
import io.swagger.v3.oas.annotations.tags.Tag;
1413
import lombok.RequiredArgsConstructor;
1514
import lombok.extern.slf4j.Slf4j;
15+
import org.springframework.http.HttpStatus;
1616
import org.springframework.http.ResponseEntity;
1717
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1818
import org.springframework.web.bind.annotation.*;
@@ -21,6 +21,8 @@
2121
import java.io.IOException;
2222
import java.util.List;
2323

24+
import static boombimapi.global.response.ResponseMessage.*;
25+
2426
@RestController
2527
@RequestMapping("/api/member")
2628
@RequiredArgsConstructor
@@ -36,8 +38,12 @@ public class MemberController {
3638
@ApiResponse(responseCode = "404", description = "유저 존재하지 않음")
3739
})
3840
@PatchMapping("/name")
39-
public void updateNickname(@AuthenticationPrincipal String userId, @RequestBody NicknameReq req) {
41+
public ResponseEntity<BaseOKResponse<Void>> updateNickname(@AuthenticationPrincipal String userId, @RequestBody NicknameReq req) {
4042
memberService.updateNickname(userId, req.name());
43+
return ResponseEntity.ok(
44+
BaseOKResponse.of(
45+
HttpStatus.OK,
46+
POST_NICKNAME_SUCCESS));
4147
}
4248

4349
@Operation(summary = "마이페이지(1번 구간) 사용자 정보 조회 API", description = "사용자 정보를 조회합니다.")
@@ -50,6 +56,16 @@ public ResponseEntity<GetMemberRes> getMember(@AuthenticationPrincipal String us
5056
return ResponseEntity.ok(memberService.getMember(userId));
5157
}
5258

59+
@Operation(summary = "마이페이지(2번 구간) 즐겨찾기 조회 API", description = "사용자가 즐겨찾기한 장소를 조회합니다.")
60+
@ApiResponses(value = {
61+
@ApiResponse(responseCode = "200", description = "사용자 조회 성공"),
62+
@ApiResponse(responseCode = "404", description = "유저 존재하지 않음")
63+
})
64+
@GetMapping("/favorite")
65+
public ResponseEntity<List<GetFavoriteRes>> getFavorite(@AuthenticationPrincipal String userId) {
66+
return ResponseEntity.ok(memberService.getFavorites(userId));
67+
}
68+
5369
@Operation(summary = "마이페이지(3번 구간) 나의 투표 조회 API", description = "나의 투표를 조회합니다.")
5470
@ApiResponses(value = {
5571
@ApiResponse(responseCode = "200", description = "사용자 조회 성공"),
@@ -76,8 +92,12 @@ public ResponseEntity<List<MyPageVoteRes>> getMpVote(@AuthenticationPrincipal St
7692
@ApiResponse(responseCode = "404", description = "유저 존재하지 않음")
7793
})
7894
@DeleteMapping
79-
public void memberDelete(@AuthenticationPrincipal String userId, @RequestBody MemberLeaveReq req) {
95+
public ResponseEntity<BaseOKResponse<Void>> memberDelete(@AuthenticationPrincipal String userId, @RequestBody MemberLeaveReq req) {
8096
memberService.memberDelete(userId, req);
97+
return ResponseEntity.ok(
98+
BaseOKResponse.of(
99+
HttpStatus.OK,
100+
MEMBER_DELETE));
81101
}
82102

83103
@Operation(summary = "프로필 사진 바꾸기 API", description = "회원의 프로필 사진을 바꿉니다.")
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package boombimapi.domain.member.presentation.dto.member.res;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
5+
@Schema(description = "즐겨찾기 응답 DTO")
6+
public record GetFavoriteRes(
7+
8+
@Schema(description = "장소 프로필 이미지 URL", example = "https://cdn.boombim.com/profile/user123.png")
9+
String profile,
10+
11+
@Schema(description = "장소 이름", example = "강남역 스타벅스")
12+
String posName,
13+
14+
@Schema(description = "장소 고유 ID", example = "1")
15+
Long placeId,
16+
17+
@Schema(description = "혼잡도 응답 타입", example = "CROWDED")
18+
String answerType,
19+
20+
@Schema(description = "오늘 올린 인원 수", example = "120")
21+
String peopleCnt
22+
) {
23+
24+
25+
public static GetFavoriteRes of(
26+
String profile,
27+
String posName,
28+
Long placeId,
29+
String answerType,
30+
String peopleCnt
31+
) {
32+
return new GetFavoriteRes(profile, posName, placeId, answerType, peopleCnt);
33+
}
34+
}
Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
11
package boombimapi.domain.oauth2.presentation.controller;
22

33
import boombimapi.domain.oauth2.application.service.LogoutService;
4+
import boombimapi.global.response.BaseOKResponse;
45
import io.swagger.v3.oas.annotations.Operation;
56
import io.swagger.v3.oas.annotations.tags.Tag;
67
import lombok.RequiredArgsConstructor;
8+
import org.springframework.http.HttpStatus;
79
import org.springframework.http.ResponseEntity;
810
import org.springframework.web.bind.annotation.*;
911

12+
import static boombimapi.global.response.ResponseMessage.LOGOUT_SUCCESS;
13+
import static boombimapi.global.response.ResponseMessage.VOTE_SUCCESS;
14+
1015

1116
@RestController
1217
@RequiredArgsConstructor
@@ -17,10 +22,15 @@ public class LogoutController {
1722

1823
@Operation(summary = "로그아웃", description = "사용자를 로그아웃하고 토큰을 무효화합니다.")
1924
@PostMapping("/api/oauth2/logout")
20-
public ResponseEntity<Void> logout(@RequestBody LogoutRequest request) {
25+
public ResponseEntity<BaseOKResponse<Void>> logout(@RequestBody LogoutRequest request) {
2126
logoutService.logout(request.refreshToken());
22-
return ResponseEntity.ok().build();
27+
28+
return ResponseEntity.ok(
29+
BaseOKResponse.of(
30+
HttpStatus.OK,
31+
LOGOUT_SUCCESS));
2332
}
2433

25-
public record LogoutRequest(String refreshToken) {}
34+
public record LogoutRequest(String refreshToken) {
35+
}
2636
}

0 commit comments

Comments
 (0)