Skip to content

Commit

Permalink
v0.1.0
Browse files Browse the repository at this point in the history
v0.1.0
  • Loading branch information
char-yb authored Aug 24, 2024
2 parents 7196bee + 8bf7932 commit d161000
Show file tree
Hide file tree
Showing 25 changed files with 69 additions and 73 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import jakarta.validation.Valid;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
Expand Down Expand Up @@ -41,36 +42,37 @@ public ResponseEntity<Void> pushMessageToAll(
Notification notification =
FcmNotificationUtil.buildNotification(
fcmSendRequest.title(), fcmSendRequest.body());
fcmService.sendMulticastMessageToAll(notification);
List<String> tokens = fcmTokenService.getAllTokens();
fcmService.sendMulticastMessage(notification, tokens);
return ResponseEntity.ok().build();
}

@Operation(summary = "FCM 토큰 저장", description = "로그인 시 FCM 토큰을 저장합니다.")
@PostMapping("/token")
public ResponseEntity<Void> storeToken(
public ResponseEntity<Void> fcmTokenStore(
@RequestBody @Validated FcmTokenRequest fcmTokenRequest) {
fcmTokenService.storeOrUpdateToken(fcmTokenRequest.token());
return ResponseEntity.ok().build();
}

@Operation(summary = "FCM 토큰 삭제", description = "로그아웃 시 FCM 토큰을 삭제합니다.")
@DeleteMapping("/token")
public ResponseEntity<Void> deleteToken() {
public ResponseEntity<Void> fcmTokenDelete() {
fcmTokenService.invalidateTokenForCurrentMember();
return ResponseEntity.ok().build();
}

@Operation(summary = "알림 리스트 조회", description = "회원의 알림을 커서 기반으로 페이징하여 조회한다.")
@GetMapping
public FcmNotificationResponse getNotifications(
public FcmNotificationResponse getFcmNotifications(
@Valid @RequestParam(name = "cursor", required = false) String cursor,
@Valid @NotNull @Min(1) @RequestParam(name = "limit", defaultValue = "10") int limit) {
return fcmNotificationService.getNotificationsForCurrentMember(cursor, limit);
}

@Operation(summary = "FCM 알림 읽음 처리", description = "알림을 읽음 상태로 변경합니다.")
@PostMapping("/{notificationId}/read")
public ResponseEntity<Void> markNotificationAsRead(
public ResponseEntity<Void> fcmNotificationAsRead(
@PathVariable("notificationId") Long notificationId) {
fcmNotificationService.markNotificationAsRead(notificationId);
return ResponseEntity.ok().build();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ public void sendDailyNotification() {
FcmNotificationConstants notificationConstants = FcmNotificationConstants.MISSION_START;
String title = notificationConstants.getTitle();
String message = notificationConstants.getMessage();

List<String> tokens = fcmTokenService.getAllTokens();

fcmNotificationService.sendAndNotifications(title, message, tokens);

log.info("모든 사용자에게 정규 알림 전송 및 저장 완료");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,6 @@ public class FcmService {
private final FcmTokenService fcmTokenService;

@Transactional(readOnly = true)
public void sendMulticastMessageToAll(Notification notification) {
List<String> tokens = fcmTokenService.getAllTokens();
int totalTokens = tokens.size();

for (int i = 0; i < totalTokens; i += BATCH_SIZE) {
List<String> batchTokens = tokens.subList(i, Math.min(i + BATCH_SIZE, totalTokens));
MulticastMessage message = buildMulticastMessage(notification, batchTokens);
sendMessage(message, batchTokens);
}

log.info("전체 메세지를 일괄 전송했습니다. 총 메세지 수: {}", totalTokens);
}

@Transactional
public void sendMulticastMessage(Notification notification, List<String> tokens) {
int totalTokens = tokens.size();

Expand All @@ -42,7 +28,7 @@ public void sendMulticastMessage(Notification notification, List<String> tokens)
sendMessage(message, batchTokens);
}

log.info("리마인드 메세지를 일괄 전송했습니다. 총 메세지 수: {}", totalTokens);
log.info("전체 메세지를 일괄 전송했습니다. 총 메세지 수: {}", totalTokens);
}

private MulticastMessage buildMulticastMessage(Notification notification, List<String> tokens) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import com.depromeet.stonebed.domain.feed.dto.response.FeedGetResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

Expand All @@ -17,11 +18,7 @@ public class FeedController {

@Operation(summary = "피드 조회", description = "내 피드를 조회하는 API입니다.")
@GetMapping
public FeedGetResponse getFeed(
@RequestParam(required = false) String cursor,
@RequestParam(required = false) Long memberId,
@RequestParam int limit) {
FeedGetRequest request = new FeedGetRequest(cursor, memberId, limit);
public FeedGetResponse getFeed(@Valid FeedGetRequest request) {
return feedService.getFeed(request);
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package com.depromeet.stonebed.domain.feed.dao;

import static com.depromeet.stonebed.domain.member.domain.QMember.member;
import static com.depromeet.stonebed.domain.mission.domain.QMission.mission;
import static com.depromeet.stonebed.domain.mission.domain.QMissionHistory.missionHistory;
import static com.depromeet.stonebed.domain.missionRecord.domain.QMissionRecord.missionRecord;
import static com.depromeet.stonebed.domain.missionRecord.domain.QMissionRecordBoost.missionRecordBoost;
import static com.depromeet.stonebed.domain.member.domain.QMember.*;
import static com.depromeet.stonebed.domain.mission.domain.QMission.*;
import static com.depromeet.stonebed.domain.missionHistory.domain.QMissionHistory.*;
import static com.depromeet.stonebed.domain.missionRecord.domain.QMissionRecord.*;
import static com.depromeet.stonebed.domain.missionRecord.domain.QMissionRecordBoost.*;

import com.depromeet.stonebed.domain.feed.dto.FindFeedDto;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package com.depromeet.stonebed.domain.feed.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;

public record FeedGetRequest(
@Schema(description = "커서 위치", example = "1") String cursor,
@Schema(description = "작성자 ID", example = "1") Long memberId,
@Schema(description = "피드 당 항목 수", example = "5") int limit) {}
@Schema(description = "작성자 ID", example = "1") @Min(1) Long memberId,
@Schema(description = "피드 당 항목 수", example = "5") @Min(1) @Max(50) int limit) {}
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,8 @@ public ImageUrlResponse uploadCompleteMemberProfile(
currentMember.getId(),
image.getImageKey(),
request.imageFileExtension());

isValidImageUrl(imageUrl);
currentMember.updateProfile(Profile.createProfile(request.nickname(), imageUrl));
return ImageUrlResponse.of(imageUrl);
}
Expand Down Expand Up @@ -138,6 +140,7 @@ public ImageUrlResponse uploadCompleteMissionRecord(MissionRecordImageUploadRequ
image.getImageKey(),
request.imageFileExtension());

isValidImageUrl(imageUrl);
missionRecordService.updateMissionRecordWithImage(request.recordId(), imageUrl);
return ImageUrlResponse.of(imageUrl);
}
Expand Down Expand Up @@ -177,6 +180,7 @@ public ImageUrlResponse uploadCompleteMission(MissionImageUploadRequest request)
image.getImageKey(),
request.imageFileExtension());

isValidImageUrl(imageUrl);
missionService.updateMissionWithImageUrl(request.missionId(), imageUrl);

return ImageUrlResponse.of(imageUrl);
Expand Down Expand Up @@ -250,4 +254,10 @@ private GeneratePresignedUrlRequest createPreSignedUrlRequest(
private Date getPreSignedUrlExpiration() {
return new Date(System.currentTimeMillis() + 1000 * 60 * 30);
}

private void isValidImageUrl(String imageUrl) {
if (imageUrl == null || imageUrl.trim().isEmpty()) {
throw new CustomException(ErrorCode.INVALID_IMAGE_URL);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,16 @@

import com.depromeet.stonebed.domain.member.domain.Member;
import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.dao.mission.MissionRepository;
import com.depromeet.stonebed.domain.mission.dao.missionHistory.MissionHistoryRepository;
import com.depromeet.stonebed.domain.mission.dao.MissionRepository;
import com.depromeet.stonebed.domain.mission.domain.Mission;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.mission.dto.request.MissionCreateRequest;
import com.depromeet.stonebed.domain.mission.dto.request.MissionUpdateRequest;
import com.depromeet.stonebed.domain.mission.dto.response.MissionCreateResponse;
import com.depromeet.stonebed.domain.mission.dto.response.MissionGetOneResponse;
import com.depromeet.stonebed.domain.mission.dto.response.MissionGetTodayResponse;
import com.depromeet.stonebed.domain.mission.dto.response.MissionUpdateResponse;
import com.depromeet.stonebed.domain.missionHistory.dao.MissionHistoryRepository;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import com.depromeet.stonebed.global.error.ErrorCode;
import com.depromeet.stonebed.global.error.exception.CustomException;
import com.depromeet.stonebed.global.util.MemberUtil;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.depromeet.stonebed.domain.mission.dao.mission;
package com.depromeet.stonebed.domain.mission.dao;

import com.depromeet.stonebed.domain.mission.domain.Mission;
import org.springframework.data.jpa.repository.JpaRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.depromeet.stonebed.domain.mission.dao.mission;
package com.depromeet.stonebed.domain.mission.dao;

import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.domain.Mission;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.depromeet.stonebed.domain.mission.dao.mission;
package com.depromeet.stonebed.domain.mission.dao;

import static com.depromeet.stonebed.domain.mission.domain.QMission.mission;
import static com.depromeet.stonebed.domain.mission.domain.QMissionHistory.missionHistory;
import static com.depromeet.stonebed.domain.mission.domain.QMission.*;
import static com.depromeet.stonebed.domain.missionHistory.domain.QMissionHistory.*;

import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.domain.Mission;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.depromeet.stonebed.domain.mission.dao.missionHistory;
package com.depromeet.stonebed.domain.missionHistory.dao;

import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import java.time.LocalDate;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.depromeet.stonebed.domain.mission.dao.missionHistory;
package com.depromeet.stonebed.domain.missionHistory.dao;

import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import java.time.LocalDate;
import java.util.Optional;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.depromeet.stonebed.domain.mission.dao.missionHistory;
package com.depromeet.stonebed.domain.missionHistory.dao;

import static com.depromeet.stonebed.domain.mission.domain.QMissionHistory.missionHistory;
import static com.depromeet.stonebed.domain.missionHistory.domain.QMissionHistory.*;

import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import com.querydsl.jpa.impl.JPAQueryFactory;
import java.time.LocalDate;
import java.util.Optional;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package com.depromeet.stonebed.domain.mission.domain;
package com.depromeet.stonebed.domain.missionHistory.domain;

import com.depromeet.stonebed.domain.common.BaseTimeEntity;
import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.domain.Mission;
import jakarta.persistence.*;
import java.time.LocalDate;
import lombok.AccessLevel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,20 +29,21 @@ public class MissionRecordController {

@Operation(summary = "미션 탭 상태 조회", description = "미션 탭의 상태를 조회한다.")
@GetMapping("/status")
public MissionTabResponse getMissionTabStatus(@RequestParam Long missionId) {
public MissionTabResponse getMissionRecordStatus(@RequestParam Long missionId) {
return missionRecordService.getMissionTabStatus(missionId);
}

@Operation(summary = "미션 참여", description = "미션 참여하기.")
@PostMapping("/start")
public MissionRecordIdResponse startMission(
public MissionRecordIdResponse startMissionRecord(
@Valid @RequestBody MissionRecordStartRequest request) {
return missionRecordService.startMission(request.missionId());
}

@Operation(summary = "미션 기록 저장", description = "미션 완료 후 기록을 저장한다.")
@PostMapping
public ResponseEntity<Void> saveMission(@Valid @RequestBody MissionRecordSaveRequest request) {
public ResponseEntity<Void> saveMissionRecord(
@Valid @RequestBody MissionRecordSaveRequest request) {
missionRecordService.saveMission(request.missionId(), request.content());
return ResponseEntity.ok().build();
}
Expand Down Expand Up @@ -86,7 +87,7 @@ public MissionRecordCompleteTotal getTotalMissionRecords(

@Operation(summary = "부스트 생성", description = "미션 기록에 부스트를 생성한다.")
@PostMapping("/{recordId}/boost")
public ResponseEntity<Void> postFeed(
public ResponseEntity<Void> createMissionRecordBoost(
@PathVariable("recordId") Long recordId,
final @Valid @RequestBody MissionRecordBoostRequest request) {
missionRecordService.createBoost(recordId, request.count());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@
import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService;
import com.depromeet.stonebed.domain.member.domain.Member;
import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.dao.mission.MissionRepository;
import com.depromeet.stonebed.domain.mission.dao.missionHistory.MissionHistoryRepository;
import com.depromeet.stonebed.domain.mission.dao.MissionRepository;
import com.depromeet.stonebed.domain.mission.domain.Mission;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionHistory.dao.MissionHistoryRepository;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordBoostRepository;
import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;
Expand Down Expand Up @@ -197,7 +197,7 @@ public MissionTabResponse getMissionTabStatus(Long missionId) {
.orElse(null);

if (missionRecord == null) {
return MissionTabResponse.of(null, null, MissionRecordStatus.NOT_COMPLETED);
return MissionTabResponse.of(null, MissionRecordStatus.NOT_COMPLETED);
}

MissionRecordStatus missionRecordStatus = missionRecord.getStatus();
Expand All @@ -206,7 +206,7 @@ public MissionTabResponse getMissionTabStatus(Long missionId) {
? missionRecord.getImageUrl()
: null;

return MissionTabResponse.of(missionRecord.getId(), imageUrl, missionRecordStatus);
return MissionTabResponse.of(imageUrl, missionRecordStatus);
}

@Transactional(propagation = Propagation.REQUIRES_NEW)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.depromeet.stonebed.domain.missionRecord.dao;

import com.depromeet.stonebed.domain.member.domain.Member;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord;
import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus;
import java.time.LocalDateTime;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import com.depromeet.stonebed.domain.common.BaseFullTimeEntity;
import com.depromeet.stonebed.domain.member.domain.Member;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.persistence.*;
import lombok.AccessLevel;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,10 @@
import io.swagger.v3.oas.annotations.media.Schema;

public record MissionTabResponse(
@Schema(description = "미션기록 ID", example = "1") Long recordId,
@Schema(description = "이미지 URL", example = "example.jpeg") String imageUrl,
@Schema(description = "미션 상태", example = "NOT_COMPLETED") MissionRecordStatus status) {

public static MissionTabResponse of(
Long recordId, String imageUrl, MissionRecordStatus status) {
return new MissionTabResponse(recordId, imageUrl, status);
public static MissionTabResponse of(String imageUrl, MissionRecordStatus status) {
return new MissionTabResponse(imageUrl, status);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ public enum ErrorCode {
IMAGE_FILE_EXTENSION_NOT_FOUND(HttpStatus.NOT_FOUND, "이미지 파일 확장자를 찾을 수 없습니다."),
INVALID_IMAGE_FILE_EXTENSION(HttpStatus.BAD_REQUEST, "올바른 이미지 확장자가 아닙니다."),
MEMBER_ALREADY_DELETED(HttpStatus.CONFLICT, "이미 탈퇴한 회원입니다."),
INVALID_IMAGE_URL(HttpStatus.BAD_REQUEST, "올바른 이미지 URL이 아닙니다."),

// follow
FOLLOW_SELF_NOT_ALLOWED(HttpStatus.CONFLICT, "본인은 팔로우 할 수 없습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,16 @@

import com.depromeet.stonebed.domain.member.domain.Member;
import com.depromeet.stonebed.domain.member.domain.RaisePet;
import com.depromeet.stonebed.domain.mission.dao.mission.MissionRepository;
import com.depromeet.stonebed.domain.mission.dao.missionHistory.MissionHistoryRepository;
import com.depromeet.stonebed.domain.mission.dao.MissionRepository;
import com.depromeet.stonebed.domain.mission.domain.Mission;
import com.depromeet.stonebed.domain.mission.domain.MissionHistory;
import com.depromeet.stonebed.domain.mission.dto.request.MissionCreateRequest;
import com.depromeet.stonebed.domain.mission.dto.request.MissionUpdateRequest;
import com.depromeet.stonebed.domain.mission.dto.response.MissionCreateResponse;
import com.depromeet.stonebed.domain.mission.dto.response.MissionGetOneResponse;
import com.depromeet.stonebed.domain.mission.dto.response.MissionGetTodayResponse;
import com.depromeet.stonebed.domain.mission.dto.response.MissionUpdateResponse;
import com.depromeet.stonebed.domain.missionHistory.dao.MissionHistoryRepository;
import com.depromeet.stonebed.domain.missionHistory.domain.MissionHistory;
import com.depromeet.stonebed.global.error.ErrorCode;
import com.depromeet.stonebed.global.error.exception.CustomException;
import com.depromeet.stonebed.global.util.MemberUtil;
Expand Down
Loading

0 comments on commit d161000

Please sign in to comment.