Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[FIX] API version1 싱크 통일 #337

Merged
merged 4 commits into from
Aug 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import java.security.Principal;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;

import com.soptie.server.api.controller.dto.request.auth.SignInRequest;
import com.soptie.server.api.controller.dto.response.ErrorResponse;
Expand Down Expand Up @@ -36,7 +35,7 @@ public interface AuthApiDocs {
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
SuccessResponse<SignInResponse> signIn(
@RequestHeader("Authorization") String socialAccessToken,
@Parameter(hidden = true) String socialAccessToken,
@RequestBody SignInRequest request
);

Expand All @@ -63,7 +62,7 @@ SuccessResponse<SignInResponse> signIn(
content = @Content(schema = @Schema(implementation = ErrorResponse.class)))}
)
SuccessResponse<TokenGetResponse> reissueToken(
@RequestHeader("Authorization") String refreshToken
@Parameter(hidden = true) String refreshToken
);

@Operation(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ public record GetHomeInfoResponse(
@Schema(description = "무지개 솜뭉치 개수", example = "10")
int happinessCottonCount,
@Schema(description = "대화 내용 목록", example = "[\"안녕?\", \"반가워~\"]")
@NotNull List<String> conversations
@NotNull List<String> conversations,
String frameImageUrl //TODO: delete
) {

public static GetHomeInfoResponse of(Member member, MemberDoll memberDoll, List<String> conversations) {
Expand All @@ -32,6 +33,17 @@ public static GetHomeInfoResponse of(Member member, MemberDoll memberDoll, List<
.dailyCottonCount(member.getCottonInfo().getBasicCottonCount())
.happinessCottonCount(member.getCottonInfo().getRainbowCottonCount())
.conversations(conversations)
.frameImageUrl(getFrameImageUrl(memberDoll.getDollId()))
.build();
}

private static String getFrameImageUrl(long dollId) {
return switch ((int)dollId) {
case 1 -> "https://github.com/Team-Sopetit/sopetit-image/blob/main/character/brown/background.png?raw=true";
case 2 -> "https://github.com/Team-Sopetit/sopetit-image/blob/main/character/gray/background.png?raw=true";
case 3 -> "https://github.com/Team-Sopetit/sopetit-image/blob/main/character/red/background.png?raw=true";
default ->
"https://github.com/Team-Sopetit/sopetit-image/blob/main/character/white/background.png?raw=true";
};
}
}
199 changes: 199 additions & 0 deletions src/main/java/com/soptie/server/temporary/TemporaryApi.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,199 @@
package com.soptie.server.temporary;

import java.security.Principal;
import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

import com.soptie.server.api.controller.dto.response.SuccessResponse;
import com.soptie.server.domain.doll.DollType;
import com.soptie.server.domain.memberroutine.MemberRoutine;
import com.soptie.server.domain.routine.Routine;
import com.soptie.server.persistence.adapter.ChallengeAdapter;
import com.soptie.server.persistence.adapter.MemberAdapter;
import com.soptie.server.persistence.adapter.MemberMissionAdapter;
import com.soptie.server.persistence.adapter.MemberRoutineAdapter;
import com.soptie.server.persistence.adapter.MissionAdapter;
import com.soptie.server.persistence.adapter.RoutineAdapter;
import com.soptie.server.persistence.adapter.ThemeAdapter;
import com.soptie.server.persistence.entity.ChallengeEntity;
import com.soptie.server.persistence.entity.ThemeEntity;
import com.soptie.server.persistence.repository.ChallengeRepository;
import com.soptie.server.persistence.repository.ThemeRepository;
import com.soptie.server.temporary.dto.CreateMemberDailyRoutine;
import com.soptie.server.temporary.dto.DailyRoutineThemesResponse;
import com.soptie.server.temporary.dto.DailyRoutinesResponse;
import com.soptie.server.temporary.dto.DollResponse;
import com.soptie.server.temporary.dto.GetDailyRoutinesResponse;
import com.soptie.server.temporary.dto.GetHappinessRoutinesResponse;
import com.soptie.server.temporary.dto.GetHappinessSubRoutinesResponse;
import com.soptie.server.temporary.dto.GetMemberDailyRoutinesResponse;
import com.soptie.server.temporary.dto.HappinessRoutineThemesResponse;
import com.soptie.server.temporary.dto.MemberHappinessRoutinesResponse;

import lombok.RequiredArgsConstructor;
import lombok.val;

@RestController
@RequiredArgsConstructor
@RequestMapping("/api/v1")
public class TemporaryApi {
private final ThemeAdapter themeAdapter;
private final ChallengeAdapter challengeAdapter;
private final MissionAdapter missionAdapter;
private final ThemeRepository themeRepository;
private final ChallengeRepository challengeRepository;
private final RoutineAdapter routineAdapter;
private final MemberRoutineAdapter memberRoutineAdapter;
private final MemberAdapter memberAdapter;
private final MemberMissionAdapter memberMissionAdapter;

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/happiness/routine/{routineId}")
public SuccessResponse<GetHappinessSubRoutinesResponse> getHappinessRoutinesByRoutine(
@PathVariable long routineId
) {
val challenge = challengeAdapter.findById(routineId);
val theme = themeAdapter.findById(challenge.getThemeId());
val missions = missionAdapter.findByChallengeIds(List.of(challenge.getId()));
return SuccessResponse.success(
"루틴별 행복 서브 루틴 내용 조회 성공",
GetHappinessSubRoutinesResponse.of(theme, challenge, missions));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/happiness")
public SuccessResponse<GetHappinessRoutinesResponse> getHappinessRoutinesByTheme(
@RequestParam(required = false) Long themeId
) {
val themes = themeId == null
? themeRepository.findAll().stream().map(ThemeEntity::toDomain).toList()
: List.of(themeAdapter.findById(themeId));
val challenges = challengeRepository.findAll().stream().map(ChallengeEntity::toDomain).toList();

val map = themes.stream()
.collect(Collectors.toMap(
theme -> theme,
theme -> challenges.stream()
.filter(challenge -> challenge.getThemeId() == theme.getId())
.toList()
));

return SuccessResponse.success(
"테마 목록별 행복 루틴 목록 조회 성공",
GetHappinessRoutinesResponse.of(map));
}

@ResponseStatus(HttpStatus.CREATED)
@PostMapping("/routines/daily/member")
@Transactional
public SuccessResponse<CreateMemberDailyRoutine> createMemberDailyRoutine(
Principal principal,
@RequestBody CreateMemberDailyRoutine request
) {
val memberId = Long.parseLong(principal.getName());
val member = memberAdapter.findById(memberId);
val routine = routineAdapter.findById(request.routineId());
val memberRoutine = memberRoutineAdapter.saveAll(member, List.of(routine));
return SuccessResponse.success(
"데일리 루틴 추가 성공",
new CreateMemberDailyRoutine(!memberRoutine.isEmpty() ? memberRoutine.get(0).getId() : 0L));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/daily/member")
public SuccessResponse<GetMemberDailyRoutinesResponse> getMemberDailyRoutines(Principal principal) {
val memberId = Long.parseLong(principal.getName());
val memberRoutines = memberRoutineAdapter.findByMemberId(memberId);
val routines = routineAdapter.findByIds(memberRoutines.stream().map(MemberRoutine::getRoutineId).toList());

val routineMap = routines.stream()
.collect(Collectors.toMap(Routine::getId, Function.identity()));

val memberRoutineMap = memberRoutines.stream()
.collect(Collectors.toMap(
Function.identity(), // Key: MemberRoutine 자체
memberRoutine -> routineMap.get(memberRoutine.getRoutineId()) // Value: 해당 MemberRoutine의 Routine
));

return SuccessResponse.success(
"회원의 데일리 루틴 목록 조회 성공",
GetMemberDailyRoutinesResponse.of(memberRoutineMap));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/happiness/themes")
public SuccessResponse<HappinessRoutineThemesResponse> getHappinessRoutineThemes() {
val themes = themeRepository.findAll().stream().map(ThemeEntity::toDomain).toList();
return SuccessResponse.success(
"행복 루틴 테마 목록 조회 성공",
HappinessRoutineThemesResponse.of(themes));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/daily")
public SuccessResponse<DailyRoutinesResponse> getDailyRoutines(@RequestParam List<Long> themes) {
val routines = new ArrayList<Routine>();
for (val themeId : themes) {
routines.addAll(routineAdapter.findByThemeId(themeId));
}
return SuccessResponse.success(
"테마 목록별 데일리 루틴 목록 조회 성공",
DailyRoutinesResponse.of(routines));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/daily/theme/{themeId}")
public SuccessResponse<GetDailyRoutinesResponse> getDailyRoutines(@PathVariable long themeId) {
val routines = routineAdapter.findByThemeId(themeId);
return SuccessResponse.success(
"테마별 데일리 루틴 목록 조회 성공",
GetDailyRoutinesResponse.of(themeId, routines));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/daily/themes")
public SuccessResponse<DailyRoutineThemesResponse> getDailyRoutineThemes() {
val themes = themeAdapter.findByBasic();
return SuccessResponse.success(
"테마별 데일리 루틴 목록 조회 성공",
DailyRoutineThemesResponse.of(themes));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/dolls/image/{type}")
public SuccessResponse<DollResponse> getDolls(@PathVariable DollType type) {
return SuccessResponse.success(
"인형 이미지 불러오기 성공",
DollResponse.of(type));
}

@ResponseStatus(HttpStatus.OK)
@GetMapping("/routines/happiness/member")
public ResponseEntity<?> getDolls(Principal principal) {
val memberId = Long.parseLong(principal.getName());
return memberMissionAdapter.findByMember(memberId)
.map(it -> {
val mission = missionAdapter.findById(it.getMissionId());
val challenge = challengeAdapter.findById(mission.getChallengeId());
val theme = themeAdapter.findById(challenge.getThemeId());
return ResponseEntity.ok(SuccessResponse.success(
"인형 이미지 불러오기 성공",
MemberHappinessRoutinesResponse.of(it, challenge, mission, theme)));
})
.orElseGet(() -> ResponseEntity.noContent().build());
}
}
54 changes: 54 additions & 0 deletions src/main/java/com/soptie/server/temporary/data/ThemeData.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package com.soptie.server.temporary.data;

public class ThemeData {

public static String getColor(long id) {
return switch ((int)id) {
case 1 -> "#E19098";
case 2 -> "#38B662";
case 3 -> "#6392D8";
case 4 -> "#EF596F";
case 5 -> "#52A1DA";
case 6 -> "#EDBF4F";
default -> "#EB9D07";
};
}

public static String getBackgroundImageUrl(long id) {
return switch ((int)id) {
case 1 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%80%E1%85%AA%E1%86%AB%E1%84%80%E1%85%A8_%E1%84%8A%E1%85%A1%E1%87%82%E1%84%80%E1%85%B5.png";
case 2 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%80%E1%85%A5%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%B7_%E1%84%89%E1%85%A5%E1%86%BC%E1%84%8C%E1%85%A1%E1%86%BC.png";
case 3 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%82%E1%85%A1%E1%84%8B%E1%85%AA_%E1%84%8E%E1%85%B5%E1%86%AB%E1%84%92%E1%85%A2%E1%84%8C%E1%85%B5%E1%84%80%E1%85%B5.png";
case 4 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%86%E1%85%A1%E1%84%8B%E1%85%B3%E1%86%B7_%E1%84%8E%E1%85%A2%E1%86%BC%E1%84%80%E1%85%B5%E1%86%B7.png";
case 5 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%80%E1%85%A5%E1%86%AB%E1%84%80%E1%85%A1%E1%86%BC%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%86%E1%85%A9%E1%86%B7.png";
case 6 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%90%E1%85%A9%E1%86%BC%E1%84%90%E1%85%A9%E1%86%BC%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%90%E1%85%A9%E1%86%BC%E1%84%8C%E1%85%A1%E1%86%BC.png";
default ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/background/%E1%84%89%E1%85%A1%E1%86%AB%E1%84%84%E1%85%B3%E1%86%BA%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%8B%E1%85%B5%E1%86%AF%E1%84%89%E1%85%A1%E1%86%BC.png";
};
}

public static String getIconImageUrl(long id) {
return switch ((int)id) {
case 1 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%80%E1%85%AA%E1%86%AB%E1%84%80%E1%85%A8_%E1%84%8A%E1%85%A1%E1%87%82%E1%84%80%E1%85%B5.png";
case 2 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%80%E1%85%A5%E1%86%AF%E1%84%8B%E1%85%B3%E1%86%B7_%E1%84%89%E1%85%A5%E1%86%BC%E1%84%8C%E1%85%A1%E1%86%BC.png";
case 3 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%82%E1%85%A1%E1%84%8B%E1%85%AA_%E1%84%8E%E1%85%B5%E1%86%AB%E1%84%92%E1%85%A2%E1%84%8C%E1%85%B5%E1%84%80%E1%85%B5.png";
case 4 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%86%E1%85%A1%E1%84%8B%E1%85%B3%E1%86%B7_%E1%84%8E%E1%85%A2%E1%86%BC%E1%84%80%E1%85%B5%E1%86%B7.png";
case 5 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%80%E1%85%A5%E1%86%AB%E1%84%80%E1%85%A1%E1%86%BC%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%86%E1%85%A9%E1%86%B7.png";
case 6 ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%90%E1%85%A9%E1%86%BC%E1%84%90%E1%85%A9%E1%86%BC%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%90%E1%85%A9%E1%86%BC%E1%84%8C%E1%85%A1%E1%86%BC.png";
default ->
"https://softie-data-image.s3.ap-northeast-2.amazonaws.com/icon/%E1%84%89%E1%85%A1%E1%86%AB%E1%84%84%E1%85%B3%E1%86%BA%E1%84%92%E1%85%A1%E1%86%AB_%E1%84%8B%E1%85%B5%E1%86%AF%E1%84%89%E1%85%A1%E1%86%BC.png";
};
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.soptie.server.temporary.dto;

public record CreateMemberDailyRoutine(
long routineId
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package com.soptie.server.temporary.dto;

import java.util.List;

import com.soptie.server.domain.theme.Theme;
import com.soptie.server.temporary.data.ThemeData;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.NonNull;

@Builder(access = AccessLevel.PRIVATE)
public record DailyRoutineThemesResponse(
@NonNull List<DailyThemeResponse> themes
) {

public static DailyRoutineThemesResponse of(List<Theme> themes) {
return DailyRoutineThemesResponse.builder()
.themes(themes.stream().map(DailyThemeResponse::of).toList())
.build();
}

@Builder(access = AccessLevel.PRIVATE)
public record DailyThemeResponse(
long themeId,
@NonNull String name,
@NonNull String iconImageUrl,
@NonNull String backgroundImageUrl
) {

public static DailyThemeResponse of(Theme theme) {
return DailyThemeResponse.builder()
.themeId(theme.getId())
.name(theme.getName())
.iconImageUrl(ThemeData.getIconImageUrl(theme.getId()))
.backgroundImageUrl(ThemeData.getBackgroundImageUrl(theme.getId()))
.build();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.soptie.server.temporary.dto;

import java.util.List;

import com.soptie.server.domain.routine.Routine;

import lombok.AccessLevel;
import lombok.Builder;
import lombok.NonNull;

@Builder(access = AccessLevel.PRIVATE)
public record DailyRoutinesResponse(
@NonNull List<DailyRoutineResponse> routines
) {

public static DailyRoutinesResponse of(List<Routine> routines) {
return DailyRoutinesResponse.builder()
.routines(routines.stream().map(DailyRoutineResponse::of).toList())
.build();
}

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

private static DailyRoutineResponse of(Routine routine) {
return DailyRoutineResponse.builder()
.routineId(routine.getId())
.content(routine.getContent())
.build();
}
}
}
Loading
Loading