Skip to content

Commit

Permalink
Merge pull request #315 from Open-Eye-Im-Developer/develop
Browse files Browse the repository at this point in the history
[MERGE] develop을 main에 반영
  • Loading branch information
JIN-076 committed Mar 21, 2024
2 parents 7cc4cd0 + 2ebfa25 commit 70eef65
Show file tree
Hide file tree
Showing 6 changed files with 97 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import io.oeid.mogakgo.domain.achievement.infrastructure.UserAchievementJpaRepository;
import io.oeid.mogakgo.domain.achievement.infrastructure.UserActivityJpaRepository;
import io.oeid.mogakgo.domain.achievement.infrastructure.session.AchievementSessionRepository;
import io.oeid.mogakgo.domain.notification.application.NotificationService;
import io.oeid.mogakgo.domain.user.application.UserCommonService;
import io.oeid.mogakgo.domain.user.domain.User;
import java.util.List;
Expand All @@ -47,13 +48,15 @@ public class AchievementEventHandler {
private final UserCommonService userCommonService;
private final AchievementSocketService achievementSocketService;
private final AchievementSessionRepository achievementSessionRepository;
private final NotificationService notificationService;

@Retryable(retryFor = EventListenerProcessingException.class, maxAttempts = 3, backoff = @Backoff(1000))
@Retryable(retryFor = EventListenerProcessingException.class, backoff = @Backoff(1000))
@Transactional
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void executeActivity(final UserActivityEvent event) {

log.info("call activity event of {} on Thread:{}", event.getAchievementId(), Thread.currentThread().getName());
log.info("call activity event of {} on Thread:{}", event.getAchievementId(),
Thread.currentThread().getName());

try {

Expand Down Expand Up @@ -85,7 +88,7 @@ public void executeActivity(final UserActivityEvent event) {
}
}

@Retryable(retryFor = EventListenerProcessingException.class, maxAttempts = 3, backoff = @Backoff(1000))
@Retryable(retryFor = EventListenerProcessingException.class, backoff = @Backoff(1000))
@Transactional
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void executeEvent(final SequenceAchievementEvent event) {
Expand All @@ -111,7 +114,8 @@ public void executeEvent(final SequenceAchievementEvent event) {
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void executeEvent(final AccumulateAchievementEvent event) {

log.info("call activity event of {} on Thread:{}", event.getAchievementId(), Thread.currentThread().getName());
log.info("call activity event of {} on Thread:{}", event.getAchievementId(),
Thread.currentThread().getName());

try {
User user = userCommonService.getUserById(event.getUserId());
Expand All @@ -129,7 +133,7 @@ public void executeEvent(final AccumulateAchievementEvent event) {
if (event.getCompleted().equals(Boolean.TRUE)) {

log.info("call socket for event {} completion", event.getAchievementId());

notificationService.createAchievementNotification(user.getId(), achievement);
achievementSocketService.sendMessageForAchievementCompletion(
achievementSessionRepository.getSession(event.getUserId()),
AchievementMessage.builder()
Expand All @@ -145,20 +149,21 @@ public void executeEvent(final AccumulateAchievementEvent event) {
}
}

@Retryable(retryFor = EventListenerProcessingException.class, maxAttempts = 3, backoff = @Backoff(1000))
@Retryable(retryFor = EventListenerProcessingException.class, backoff = @Backoff(1000))
@Transactional
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void executeEvent(final AccumulateAchievementUpdateEvent event) {

log.info("call activity event of {} on Thread:{}", event.getAchievementId(), Thread.currentThread().getName());
log.info("call activity event of {} on Thread:{}", event.getAchievementId(),
Thread.currentThread().getName());

try {
// 진행중인 업적에 대해 '달성' 업데이트
UserAchievement userAchievement = getByUserAndAchievementId(event);
userAchievement.updateCompleted();

log.info("call socket for event {} completion", event.getAchievementId());

notificationService.createAchievementNotification(userAchievement.getUser().getId(), userAchievement.getAchievement());
// 업적 달성 후, 클라이언트에게 socket 통신
Achievement achievement = getById(event.getAchievementId());
achievementSocketService.sendMessageForAchievementCompletion(
Expand All @@ -167,6 +172,7 @@ public void executeEvent(final AccumulateAchievementUpdateEvent event) {
.userId(event.getUserId())
.achievementId(event.getAchievementId())
.progressCount(achievement.getRequirementValue())
.requirementValue(achievement.getRequirementValue())
.completed(Boolean.TRUE)
.build()
);
Expand All @@ -175,12 +181,13 @@ public void executeEvent(final AccumulateAchievementUpdateEvent event) {
}
}

@Retryable(retryFor = EventListenerProcessingException.class, maxAttempts = 3, backoff = @Backoff(1000))
@Retryable(retryFor = EventListenerProcessingException.class, backoff = @Backoff(1000))
@Transactional
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void executeEvent(final SequenceAchievementUpdateEvent event) {

log.info("call activity event of {} on Thread:{}", event.getAchievementId(), Thread.currentThread().getName());
log.info("call activity event of {} on Thread:{}", event.getAchievementId(),
Thread.currentThread().getName());

try {
// 진행중인 업적에 대해 '달성' 업데이트
Expand All @@ -195,14 +202,15 @@ public void executeEvent(final SequenceAchievementUpdateEvent event) {
history.forEach(UserActivity::delete);

log.info("call socket for event {} completion", event.getAchievementId());

notificationService.createAchievementNotification(userAchievement.getUser().getId(), achievement);
// 업적 달성 후, 클라이언트에게 socket 통신
achievementSocketService.sendMessageForAchievementCompletion(
achievementSessionRepository.getSession(event.getUserId()),
AchievementMessage.builder()
.userId(event.getUserId())
.achievementId(event.getAchievementId())
.progressCount(achievement.getRequirementValue())
.requirementValue(achievement.getRequirementValue())
.completed(Boolean.TRUE)
.build()
);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package io.oeid.mogakgo.common.swagger.template;

import io.oeid.mogakgo.core.properties.swagger.error.SwaggerAchievementErrorExamples;
import io.oeid.mogakgo.core.properties.swagger.error.SwaggerUserAchievementErrorExamples;
import io.oeid.mogakgo.core.properties.swagger.error.SwaggerUserErrorExamples;
import io.oeid.mogakgo.domain.achievement.presentation.dto.res.AchievementInfoAPIRes;
import io.oeid.mogakgo.domain.achievement.presentation.dto.res.UserAchievementDetailAPIRes;
import io.oeid.mogakgo.exception.dto.ErrorResponse;
import io.swagger.v3.oas.annotations.Operation;
Expand Down Expand Up @@ -38,4 +40,18 @@ ResponseEntity<List<UserAchievementDetailAPIRes>> getUserAchievementDetail(
@Parameter(hidden = true) Long userId,
@Parameter(description = "업적을 조회하는 사용자 ID", required = true) Long id
);

@Operation(summary = "업적 상세 조회", description = "특정 업적에 대한 상세 정보를 조회할 때 사용하는 API")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "업적 상세 조회 성공"),
@ApiResponse(responseCode = "404", description = "요청한 데이터가 존재하지 않음",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class),
examples = @ExampleObject(name = "E130301", value = SwaggerAchievementErrorExamples.ACHIEVEMENT_NOT_FOUND)
))
})
ResponseEntity<AchievementInfoAPIRes> getAchievementById(
@Parameter(description = "조회하려는 업적 ID", required = true) Long achievementId
);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.oeid.mogakgo.domain.achievement.application;

import static io.oeid.mogakgo.exception.code.ErrorCode403.ACHIEVEMENT_FORBIDDEN_OPERATION;
import static io.oeid.mogakgo.exception.code.ErrorCode404.ACHIEVEMENT_NOT_FOUND;

import io.oeid.mogakgo.domain.achievement.application.dto.res.UserAchievementInfoRes;
import io.oeid.mogakgo.domain.achievement.domain.entity.Achievement;
Expand Down Expand Up @@ -36,6 +37,11 @@ public class AchievementService {
private final UserActivityJpaRepository userActivityRepository;
private final AchievementFacadeService achievementFacadeService;

public Achievement getById(Long achievementId) {
return achievementRepository.findById(achievementId)
.orElseThrow(() -> new AchievementException(ACHIEVEMENT_NOT_FOUND));
}

public List<UserAchievementInfoRes> getUserAchievementInfo(Long userId, Long id) {
User user = validateToken(userId);
validateUser(user, id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,16 @@ public class AchievementMessage {
private final Long userId;
private final Long achievementId;
private final Integer progressCount;
private final Integer requirementValue;
private final Boolean completed;

@Builder
private AchievementMessage(Long userId, Long achievementId, Integer progressCount, Boolean completed) {
private AchievementMessage(Long userId, Long achievementId, Integer progressCount,
Integer requirementValue, Boolean completed) {
this.userId = userId;
this.achievementId = achievementId;
this.progressCount = progressCount;
this.requirementValue = requirementValue;
this.completed = completed;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import io.oeid.mogakgo.common.swagger.template.AchievementSwagger;
import io.oeid.mogakgo.domain.achievement.application.AchievementService;
import io.oeid.mogakgo.domain.achievement.application.dto.res.UserAchievementInfoRes;
import io.oeid.mogakgo.domain.achievement.presentation.dto.res.AchievementInfoAPIRes;
import io.oeid.mogakgo.domain.achievement.presentation.dto.res.UserAchievementDetailAPIRes;
import java.util.List;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -32,4 +33,11 @@ public ResponseEntity<List<UserAchievementDetailAPIRes>> getUserAchievementDetai
);
}

@GetMapping("/{id}/info")
public ResponseEntity<AchievementInfoAPIRes> getAchievementById(@PathVariable Long id) {
return ResponseEntity.ok().body(
AchievementInfoAPIRes.from(achievementService.getById(id))
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package io.oeid.mogakgo.domain.achievement.presentation.dto.res;

import io.oeid.mogakgo.domain.achievement.domain.entity.Achievement;
import io.oeid.mogakgo.domain.achievement.domain.entity.enums.RequirementType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Schema(description = "업적 상세 정보 조회 응답 DTO")
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class AchievementInfoAPIRes {

@Schema(description = "조회할 업적 ID")
private final Long achievementId;

@Schema(description = "조회할 업적 타이틀")
private final String title;

@Schema(description = "조회할 업적 이미지 Url")
private final String imgUrl;

@Schema(description = "조회할 업적 상세 설명")
private final String description;

@Schema(description = "조회할 업적 타입")
private final RequirementType requirementType;

@Schema(description = "업적 달성을 위해 만족해야 하는 값")
private final Integer requirementValue;

public static AchievementInfoAPIRes from(Achievement achievement) {
return new AchievementInfoAPIRes(
achievement.getId(),
achievement.getTitle(),
achievement.getImgUrl(),
achievement.getDescription(),
achievement.getRequirementType(),
achievement.getRequirementValue()
);
}

}

0 comments on commit 70eef65

Please sign in to comment.