Skip to content

Commit

Permalink
Merge pull request #300 from Team-Sopetit/feat/#298-acquire-dailyrout…
Browse files Browse the repository at this point in the history
…ines

[FEAT] 테마별 데일리 루틴 목록 조회(public, 온보딩) 기능 구현
  • Loading branch information
thguss authored Jun 27, 2024
2 parents cc883a3 + 48929e5 commit b902ac3
Show file tree
Hide file tree
Showing 8 changed files with 239 additions and 56 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ private void authorizeHttpRequests(HttpSecurity http) throws Exception {
.requestMatchers(new AntPathRequestMatcher("/api/v1/routines/daily")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/api/v1/dolls/image/{type}")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/api/v1/versions/client/app")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/api/v2/routines/daily", "GET")).permitAll()
.requestMatchers(new AntPathRequestMatcher("/error")).permitAll()
.anyRequest().authenticated()
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@
import com.soptie.server.common.support.RepositoryAdapter;
import com.soptie.server.member.entity.Member;
import com.soptie.server.routine.entity.Routine;
import com.soptie.server.routine.entity.RoutineType;
import com.soptie.server.routine.exception.RoutineException;
import com.soptie.server.routine.repository.RoutineRepository;
import com.soptie.server.routine.service.vo.RoutineVO;
import com.soptie.server.theme.entity.Theme;

import lombok.RequiredArgsConstructor;
Expand All @@ -30,10 +32,14 @@ public List<Routine> findDailyRoutinesByThemeAndNotMember(Theme theme, Member me

public Routine findById(long id) {
return routineRepository.findById(id)
.orElseThrow(() -> new RoutineException(INVALID_ROUTINE));
.orElseThrow(() -> new RoutineException(INVALID_ROUTINE));
}

public List<Routine> findChallengeRoutinesByTheme(Long themeId) {
return routineRepository.findByTypeAndThemeId(CHALLENGE, themeId);
}

public List<RoutineVO> findAllByTypeAndThemeId(RoutineType type, long themeId) {
return routineRepository.findByTypeAndThemeId(type, themeId).stream().map(RoutineVO::from).toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.soptie.server.routine.controller.v2;

import java.util.LinkedHashSet;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.soptie.server.common.dto.SuccessResponse;
import com.soptie.server.routine.controller.v2.docs.DailyRoutineControllerV2Docs;
import com.soptie.server.routine.controller.v2.dto.response.DailyRoutineListAcquireResponseV2;
import com.soptie.server.routine.message.RoutineSuccessMessage;
import com.soptie.server.routine.service.RoutineService;

import lombok.RequiredArgsConstructor;
import lombok.val;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v2/routines/daily")
public class DailyRoutineControllerV2 implements DailyRoutineControllerV2Docs {

private final RoutineService routineService;

@GetMapping
public ResponseEntity<SuccessResponse<DailyRoutineListAcquireResponseV2>> acquireAllByThemes(
@RequestParam LinkedHashSet<Long> themeIds
) {
val response = routineService.acquireAllInDailyWithThemeId(themeIds);
return ResponseEntity.ok(SuccessResponse.success(
RoutineSuccessMessage.SUCCESS_GET_ROUTINE.getMessage(),
DailyRoutineListAcquireResponseV2.from(response)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.soptie.server.routine.controller.v2.docs;

import java.util.LinkedHashSet;

import org.springframework.http.ResponseEntity;

import com.soptie.server.common.dto.SuccessResponse;
import com.soptie.server.routine.controller.v2.dto.response.DailyRoutineListAcquireResponseV2;

import io.swagger.v3.oas.annotations.Parameter;

public interface DailyRoutineControllerV2Docs {

ResponseEntity<SuccessResponse<DailyRoutineListAcquireResponseV2>> acquireAllByThemes(
@Parameter(name = "list of themes id", description = "조회할 테마 id 목록") LinkedHashSet<Long> themeIds
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.soptie.server.routine.controller.v2.dto.response;

import java.util.List;
import java.util.Map;

import com.soptie.server.routine.service.vo.RoutineVO;

import jakarta.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PRIVATE)
public record DailyRoutineListAcquireResponseV2(
List<ThemeResponse> themes
) {

public static DailyRoutineListAcquireResponseV2 from(Map<Long, List<RoutineVO>> routinesMap) {
return DailyRoutineListAcquireResponseV2.builder()
.themes(routinesMap.keySet().stream().map(key -> ThemeResponse.from(key, routinesMap.get(key))).toList())
.build();
}

@Builder(access = AccessLevel.PRIVATE)
private record ThemeResponse(
long themeId,
List<RoutineResponse> routines
) {

private static ThemeResponse from(long themeId, List<RoutineVO> routines) {
return ThemeResponse.builder()
.themeId(themeId)
.routines(routines.stream().map(RoutineResponse::from).toList())
.build();
}
}

@Builder(access = AccessLevel.PRIVATE)
private record RoutineResponse(
long routineId,
@NotNull String content
) {

private static RoutineResponse from(RoutineVO routine) {
return RoutineResponse.builder()
.routineId(routine.routineId())
.content(routine.content())
.build();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,25 @@
package com.soptie.server.routine.service;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.soptie.server.member.adapter.MemberFinder;
import com.soptie.server.routine.adapter.ChallengeFinder;
import com.soptie.server.routine.adapter.RoutineFinder;
import com.soptie.server.routine.entity.RoutineType;
import com.soptie.server.routine.service.dto.request.DailyRoutineListByThemeGetServiceRequest;
import com.soptie.server.routine.service.dto.request.DailyRoutineListByThemesGetServiceRequest;
import com.soptie.server.routine.service.dto.request.HappinessRoutineListGetServiceRequest;
import com.soptie.server.routine.service.dto.request.HappinessSubRoutineListGetServiceRequest;
import com.soptie.server.routine.service.dto.response.DailyRoutineListGetServiceResponse;
import com.soptie.server.routine.service.dto.response.HappinessRoutineListGetServiceResponse;
import com.soptie.server.routine.service.dto.response.HappinessSubRoutineListGetServiceResponse;
import com.soptie.server.routine.service.vo.RoutineVO;
import com.soptie.server.theme.adapter.ThemeFinder;

import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -54,4 +61,13 @@ public HappinessSubRoutineListGetServiceResponse getHappinessSubRoutines(
val subRoutines = challengeFinder.findByRoutine(routine);
return HappinessSubRoutineListGetServiceResponse.of(routine, subRoutines);
}

public Map<Long, List<RoutineVO>> acquireAllInDailyWithThemeId(Set<Long> themeIds) {
val themeToRoutine = new LinkedHashMap<Long, List<RoutineVO>>();
for (val themeId : themeIds) {
val routines = routineFinder.findAllByTypeAndThemeId(RoutineType.DAILY, themeId);
themeToRoutine.put(themeId, routines);
}
return themeToRoutine;
}
}
24 changes: 24 additions & 0 deletions src/main/java/com/soptie/server/routine/service/vo/RoutineVO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.soptie.server.routine.service.vo;

import com.soptie.server.routine.entity.Routine;
import com.soptie.server.routine.entity.RoutineType;

import jakarta.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.Builder;

@Builder(access = AccessLevel.PRIVATE)
public record RoutineVO(
long routineId,
@NotNull String content,
@NotNull RoutineType routineType
) {

public static RoutineVO from(Routine routine) {
return RoutineVO.builder()
.routineId(routine.getId())
.content(routine.getContent())
.routineType(routine.getType())
.build();
}
}
Loading

0 comments on commit b902ac3

Please sign in to comment.