Skip to content
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
@@ -0,0 +1,7 @@
package com.ject.studytrip.dummy.application.dto;

public record CreateDummyMissionCommand(String name) {
public static CreateDummyMissionCommand of(String name) {
return new CreateDummyMissionCommand(name);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ject.studytrip.dummy.application.dto;

import java.time.LocalDate;

public record CreateDummyStampCommand(String name, int stampOrder, LocalDate endDate) {
public static CreateDummyStampCommand of(String name, int stampOrder, LocalDate endDate) {
return new CreateDummyStampCommand(name, stampOrder, endDate);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.ject.studytrip.dummy.application.dto;

import com.ject.studytrip.trip.domain.model.TripCategory;
import java.time.LocalDate;

public record CreateDummyTripCommand(
String name, String memo, TripCategory tripCategory, LocalDate endDate) {
public static CreateDummyTripCommand of(
String name, String memo, TripCategory tripCategory, LocalDate endDate) {
return new CreateDummyTripCommand(name, memo, tripCategory, endDate);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.ject.studytrip.dummy.application.dto;

import com.ject.studytrip.global.util.DateUtil;
import com.ject.studytrip.mission.domain.model.Mission;

public record DummyMissionInfo(
Long missionId,
String missionName,
boolean completed,
String createdAt,
String updatedAt,
String deletedAt) {
public static DummyMissionInfo from(Mission mission) {
return new DummyMissionInfo(
mission.getId(),
mission.getName(),
mission.isCompleted(),
DateUtil.formatDateTime(mission.getCreatedAt()),
DateUtil.formatDateTime(mission.getUpdatedAt()),
DateUtil.formatDateTime(mission.getDeletedAt()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ject.studytrip.dummy.application.dto;

import java.util.List;

public record DummyMissionsInfo(List<DummyMissionInfo> missionInfos) {
public static DummyMissionsInfo of(List<DummyMissionInfo> missionInfos) {
return new DummyMissionsInfo(missionInfos);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.ject.studytrip.dummy.application.dto;

import com.ject.studytrip.global.util.DateUtil;
import com.ject.studytrip.stamp.domain.model.Stamp;

public record DummyStampInfo(
Long stampId,
String stampName,
int stampOrder,
String endDate,
int totalMissions,
int completedMissions,
boolean completed,
String createdAt,
String updatedAt,
String deletedAt) {
public static DummyStampInfo from(Stamp stamp) {
return new DummyStampInfo(
stamp.getId(),
stamp.getName(),
stamp.getStampOrder(),
DateUtil.formatDate(stamp.getEndDate()),
stamp.getTotalMissions(),
stamp.getCompletedMissions(),
stamp.isCompleted(),
DateUtil.formatDateTime(stamp.getCreatedAt()),
DateUtil.formatDateTime(stamp.getUpdatedAt()),
DateUtil.formatDateTime(stamp.getDeletedAt()));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.ject.studytrip.dummy.application.dto;

import java.util.List;

public record DummyStampsInfo(List<DummyStampInfo> stampsInfos) {
public static DummyStampsInfo of(List<DummyStampInfo> stampsInfos) {
return new DummyStampsInfo(stampsInfos);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.ject.studytrip.dummy.application.facade;

import com.ject.studytrip.dummy.application.dto.DummyMissionInfo;
import com.ject.studytrip.dummy.application.dto.DummyMissionsInfo;
import com.ject.studytrip.dummy.application.service.DummyMissionCommandService;
import com.ject.studytrip.dummy.application.service.DummyStampCommandService;
import com.ject.studytrip.dummy.application.service.DummyTripCommandService;
import com.ject.studytrip.member.application.service.MemberQueryService;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.mission.domain.model.Mission;
import com.ject.studytrip.stamp.domain.model.Stamp;
import com.ject.studytrip.trip.domain.model.Trip;
import java.util.List;
import java.util.stream.Stream;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class DummyMissionFacade {
private final MemberQueryService memberQueryService;

private final DummyTripCommandService dummyTripCommandService;
private final DummyStampCommandService dummyStampCommandService;
private final DummyMissionCommandService dummyMissionCommandService;

public DummyMissionsInfo generateDummyMissions(Long memberId, String category, int count) {
Member member = memberQueryService.getValidMember(memberId);

Trip trip = dummyTripCommandService.createDummyTrip(member, category, count);
Stamp stamp = dummyStampCommandService.createDummyStamp(trip, count);
List<Mission> missions =
Stream.generate(() -> dummyMissionCommandService.createDummyMission(stamp))
.limit(count)
.toList();

return DummyMissionsInfo.of(missions.stream().map(DummyMissionInfo::from).toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.ject.studytrip.dummy.application.facade;

import com.ject.studytrip.dummy.application.dto.DummyStampInfo;
import com.ject.studytrip.dummy.application.dto.DummyStampsInfo;
import com.ject.studytrip.dummy.application.service.DummyStampCommandService;
import com.ject.studytrip.dummy.application.service.DummyTripCommandService;
import com.ject.studytrip.member.application.service.MemberQueryService;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.stamp.domain.model.Stamp;
import com.ject.studytrip.trip.domain.model.Trip;
import java.util.List;
import java.util.stream.IntStream;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

@Component
@RequiredArgsConstructor
public class DummyStampFacade {
private final MemberQueryService memberQueryService;

private final DummyTripCommandService dummyTripCommandService;
private final DummyStampCommandService dummyStampCommandService;

public DummyStampsInfo generateDummyStamps(Long memberId, String category, int count) {
Member member = memberQueryService.getValidMember(memberId);

Trip trip = dummyTripCommandService.createDummyTrip(member, category, count);
List<Stamp> stamps =
IntStream.rangeClosed(1, count)
.mapToObj(order -> dummyStampCommandService.createDummyStamp(trip, order))
.toList();

return DummyStampsInfo.of(stamps.stream().map(DummyStampInfo::from).toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.ject.studytrip.dummy.application.generator;

import com.ject.studytrip.dummy.application.dto.CreateDummyMissionCommand;

public final class CreateDummyMissionCommandGenerator {
private CreateDummyMissionCommandGenerator() {}

public static CreateDummyMissionCommand of() {
return CreateDummyMissionCommand.of("testMission");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.ject.studytrip.dummy.application.generator;

import com.ject.studytrip.dummy.application.dto.CreateDummyStampCommand;
import com.ject.studytrip.trip.domain.model.TripCategory;
import java.time.LocalDate;

public final class CreateDummyStampCommandGenerator {
private CreateDummyStampCommandGenerator() {}

public static CreateDummyStampCommand of(TripCategory tripCategory, int stampOrder) {
return switch (tripCategory) {
case COURSE -> ofCourse(stampOrder);
case EXPLORE -> ofExplore();
};
}

private static CreateDummyStampCommand ofCourse(int stampOrder) {
return CreateDummyStampCommand.of("testStamp", stampOrder, LocalDate.now().plusDays(10));
}

private static CreateDummyStampCommand ofExplore() {
return CreateDummyStampCommand.of("testStamp", 0, null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.ject.studytrip.dummy.application.generator;

import com.ject.studytrip.dummy.application.dto.CreateDummyTripCommand;
import com.ject.studytrip.trip.domain.model.TripCategory;
import java.time.LocalDate;

public final class CreateDummyTripCommandGenerator {
private CreateDummyTripCommandGenerator() {}

public static CreateDummyTripCommand of(TripCategory tripCategory) {
return switch (tripCategory) {
case COURSE -> ofCourse();
case EXPLORE -> ofExplore();
};
}

private static CreateDummyTripCommand ofCourse() {
return CreateDummyTripCommand.of(
"testTrip", "testMemo", TripCategory.COURSE, LocalDate.now().plusDays(10));
}

private static CreateDummyTripCommand ofExplore() {
return CreateDummyTripCommand.of("testTrip", "testMemo", TripCategory.EXPLORE, null);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.ject.studytrip.dummy.application.service;

import com.ject.studytrip.dummy.application.dto.CreateDummyMissionCommand;
import com.ject.studytrip.dummy.application.generator.CreateDummyMissionCommandGenerator;
import com.ject.studytrip.mission.domain.factory.MissionFactory;
import com.ject.studytrip.mission.domain.model.Mission;
import com.ject.studytrip.stamp.domain.model.Stamp;
import org.springframework.stereotype.Service;

@Service
public class DummyMissionCommandService {

public Mission createDummyMission(Stamp stamp) {
CreateDummyMissionCommand command = CreateDummyMissionCommandGenerator.of();

return MissionFactory.create(stamp, command.name());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.ject.studytrip.dummy.application.service;

import com.ject.studytrip.dummy.application.dto.CreateDummyStampCommand;
import com.ject.studytrip.dummy.application.generator.CreateDummyStampCommandGenerator;
import com.ject.studytrip.stamp.domain.factory.StampFactory;
import com.ject.studytrip.stamp.domain.model.Stamp;
import com.ject.studytrip.trip.domain.model.Trip;
import org.springframework.stereotype.Service;

@Service
public class DummyStampCommandService {

public Stamp createDummyStamp(Trip trip, int stampOrder) {
CreateDummyStampCommand command =
CreateDummyStampCommandGenerator.of(trip.getCategory(), stampOrder);

return StampFactory.create(trip, command.name(), command.stampOrder(), command.endDate());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.ject.studytrip.dummy.application.service;

import com.ject.studytrip.dummy.application.dto.CreateDummyTripCommand;
import com.ject.studytrip.dummy.application.generator.CreateDummyTripCommandGenerator;
import com.ject.studytrip.member.domain.model.Member;
import com.ject.studytrip.trip.domain.factory.TripFactory;
import com.ject.studytrip.trip.domain.model.Trip;
import com.ject.studytrip.trip.domain.model.TripCategory;
import org.springframework.stereotype.Service;

@Service
public class DummyTripCommandService {

public Trip createDummyTrip(Member member, String category, int count) {
CreateDummyTripCommand command =
CreateDummyTripCommandGenerator.of(TripCategory.from(category));

return TripFactory.create(
member,
command.name(),
command.memo(),
command.tripCategory(),
command.endDate(),
count);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.ject.studytrip.dummy.presentation.controller;

import com.ject.studytrip.dummy.application.dto.DummyMissionsInfo;
import com.ject.studytrip.dummy.application.facade.DummyMissionFacade;
import com.ject.studytrip.dummy.presentation.dto.response.LoadDummyMissionInfoResponse;
import com.ject.studytrip.global.common.response.StandardResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
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;

@Tag(name = "Dummy Mission", description = "더미 미션 API")
@RestController
@RequestMapping("/api/dummies/missions")
@RequiredArgsConstructor
@Validated
public class DummyMissionController {
private final DummyMissionFacade dummyMissionFacade;

@Operation(
summary = "더미 미션 목록 조회",
description = "여행 카테고리와 생성할 더미 데이터 개수를 이용해 더미 미션 목록을 조회합니다.(DB 저장 X)")
@GetMapping
public ResponseEntity<StandardResponse> loadDummyMissions(
@AuthenticationPrincipal String memberId,
@RequestParam
@NotNull(message = "여행 카테고리는 필수 요청 값입니다.")
@Pattern(
regexp = "^(COURSE|EXPLORE)$",
message = "여행 카테고리는 COURSE, EXPLORE 중 하나여야 합니다.")
String category,
@RequestParam @Min(value = 1, message = "count는 1 이상이어야 합니다.") int count) {
DummyMissionsInfo result =
dummyMissionFacade.generateDummyMissions(Long.valueOf(memberId), category, count);
List<LoadDummyMissionInfoResponse> responses =
result.missionInfos().stream().map(LoadDummyMissionInfoResponse::of).toList();

return ResponseEntity.status(HttpStatus.OK)
.body(StandardResponse.success(HttpStatus.OK.value(), responses));
}
}
Loading