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

Feat: cotato-manage 과제 구현 #4

Open
wants to merge 7 commits into
base: main
Choose a base branch
from
Open
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
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,15 @@ repositories {

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jdbc'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-validation'

compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'


}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package cotato.cotatomanage.management;

import cotato.cotatomanage.management.domain.Part;
import cotato.cotatomanage.management.dto.request.RegisterRequest;
import cotato.cotatomanage.management.dto.response.MemberInfoListResponse;
import cotato.cotatomanage.management.dto.response.PartInfoListResponse;
import cotato.cotatomanage.management.service.ManagementService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/management")
public class ManagementController {

private final ManagementService managementService;

@PostMapping("/register")
public void registerMember(RegisterRequest registerRequest) {
log.info("멤버 등록");
managementService.registerMember(registerRequest);
}

@GetMapping("/part")
public MemberInfoListResponse getPartAbility(
@RequestParam Part part,
@RequestParam int periodNow
) {
log.info("특정 파트 실력");
return managementService.getPartAbility(part, periodNow);
}

@GetMapping("/stats")
public PartInfoListResponse getPartStatAbility(@RequestParam int periodNow) {
log.info("파트별 실력 통계");
return managementService.getPartStatsAbility(periodNow);
}

@GetMapping
public MemberInfoListResponse getAllAbility(@RequestParam int periodNow) {
log.info("모든 부원 실력");
return managementService.getAllAbility(periodNow);
}
}
73 changes: 73 additions & 0 deletions src/main/java/cotato/cotatomanage/management/domain/Member.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package cotato.cotatomanage.management.domain;

import cotato.cotatomanage.management.dto.request.RegisterRequest;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@Entity
public class Member {

private static final int MAX_AGE = 27;
private static final int PERIOD_INCREASING_ABILITY = 2;

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@NotNull
@Size(max = 20)
private String name;

@NotNull
private int period;

@NotNull
private int age;

@NotNull
@Enumerated(EnumType.STRING)
private Part part;

// 생성자
@Builder
private Member(
String name,
int period,
int age,
Part part) {

this.name = name;
this.period = period;
this.age = age;
this.part = part;
}

public static Member of(RegisterRequest registerRequest) {
return Member.builder()
.name(registerRequest.getName())
.period(registerRequest.getPeriod())
.age(registerRequest.getAge())
.part(registerRequest.getPart())
.build();
}

private int calcAbilityByPeriod(int periodNow) {
return PERIOD_INCREASING_ABILITY * (periodNow - this.getPeriod());
}

public int calcAbility(int periodNow) {
int ability = this.getAge() + calcAbilityByPeriod(periodNow);

if (this.getAge() <= MAX_AGE) {
return ability + PartMonth.calcAbilityByMonth(this);
}
return ability;
}
}
28 changes: 28 additions & 0 deletions src/main/java/cotato/cotatomanage/management/domain/Part.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package cotato.cotatomanage.management.domain;


import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.util.stream.Stream;

@Getter
@RequiredArgsConstructor
public enum Part {
DESIGNER("디자이너"),
PRODUCT("기획"),
BACKEND("백엔드"),
FRONTEND("프론트엔드");

@JsonValue private final String part;

@JsonCreator
public static Part parsing(String inputValue) {
return Stream.of(Part.values())
.filter(part -> part.getPart().equals(inputValue))
.findFirst()
.orElse(null);
}
}
46 changes: 46 additions & 0 deletions src/main/java/cotato/cotatomanage/management/domain/PartMonth.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package cotato.cotatomanage.management.domain;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

import java.time.LocalDate;
import java.util.List;
import java.util.stream.Stream;

import static cotato.cotatomanage.management.domain.Part.*;

@Getter
@RequiredArgsConstructor
public enum PartMonth {

PRODUCT_MONTH(PRODUCT, List.of(1, 5, 9), 10),
DESIGNER_MONTH(DESIGNER, List.of(2, 6, 10), 10),
FRONTEND_MONTH(FRONTEND, List.of(3, 7, 11), 10),
BACKEND_MONTH(BACKEND, List.of(4, 8, 12), 10);

private Part part;
private List<Integer> months;
private int number;

PartMonth(Part part, List<Integer> months, int number) {
this.part = part;
this.months = months;
this.number = number;
}

public static PartMonth partParsing(Part part) {
return Stream.of(PartMonth.values())
.filter(partMonth -> partMonth.getPart().equals(part))
.findFirst()
.orElse(null);
}

public static int calcAbilityByMonth(Member member) {
PartMonth partMonth = partParsing(member.getPart());
int monthNow = LocalDate.now().getDayOfMonth();
if (partMonth.months.contains(monthNow)) {
return partMonth.getNumber();
}
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package cotato.cotatomanage.management.dto.request;

import cotato.cotatomanage.management.domain.Part;
import lombok.Getter;

@Getter
public class RegisterRequest {

private String name;

private int period;

private int age;

private Part part;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package cotato.cotatomanage.management.dto.response;

import cotato.cotatomanage.management.vo.MemberInfoVo;
import lombok.Builder;

import java.util.List;

public class MemberInfoListResponse {

List<MemberInfoVo> memberInfoVoList;

@Builder
private MemberInfoListResponse(List<MemberInfoVo> memberInfoVoList) {
this.memberInfoVoList = memberInfoVoList;
}

public static MemberInfoListResponse from(List<MemberInfoVo> memberInfoVoList) {
return MemberInfoListResponse.builder()
.memberInfoVoList(memberInfoVoList)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package cotato.cotatomanage.management.dto.response;

import cotato.cotatomanage.management.vo.PartInfoVo;
import lombok.Builder;

import java.util.List;

public class PartInfoListResponse {

List<PartInfoVo> partInfoVoList;

@Builder
private PartInfoListResponse(List<PartInfoVo> partInfoVoList) {
this.partInfoVoList = partInfoVoList;
}

public static PartInfoListResponse from(List<PartInfoVo> partInfoVoList) {
return PartInfoListResponse.builder()
.partInfoVoList(partInfoVoList)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package cotato.cotatomanage.management.helper;

import cotato.cotatomanage.management.domain.Part;
import cotato.cotatomanage.management.vo.MemberInfoVo;
import cotato.cotatomanage.management.vo.PartInfoVo;
import org.springframework.stereotype.Component;

import java.util.Comparator;
import java.util.List;

@Component
public class ManagementHelper {

public void sortPart(List<PartInfoVo> partInfoVoList) {
partInfoVoList.sort(Comparator
.comparing(PartInfoVo::getAbility)
.reversed()
.thenComparing(PartInfoVo::getCount)
.thenComparing(PartInfoVo::getPart, Comparator.comparing(Part::ordinal))
);
}

public void sortAll(List<MemberInfoVo> memberInfoList) {
memberInfoList.sort(Comparator
.comparing(MemberInfoVo::getAbility)
.reversed()
.thenComparing(MemberInfoVo::getAge, Comparator.reverseOrder())
.thenComparing(MemberInfoVo::getPeriod)
.thenComparing(MemberInfoVo::getName));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package cotato.cotatomanage.management.mapper;

import cotato.cotatomanage.management.domain.Member;
import cotato.cotatomanage.management.domain.Part;
import cotato.cotatomanage.management.dto.response.PartInfoListResponse;
import cotato.cotatomanage.management.helper.ManagementHelper;
import cotato.cotatomanage.management.repository.MemberRepository;
import cotato.cotatomanage.management.vo.MemberInfoVo;
import cotato.cotatomanage.management.dto.response.MemberInfoListResponse;
import cotato.cotatomanage.management.vo.PartInfoVo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
@RequiredArgsConstructor
public class ManagementMapper {

private final MemberRepository memberRepository;
private final ManagementHelper managementHelper;

public MemberInfoListResponse toMemberInfoListResponse(List<Member> memberList, int periodNow) {
List<MemberInfoVo> memberInfoList =
memberList.stream()
.map(member -> MemberInfoVo.of(member, periodNow))
.toList();
managementHelper.sortAll(memberInfoList);
return MemberInfoListResponse.from(memberInfoList);
}

public PartInfoListResponse toPartInfoListResponse(List<PartInfoVo> partInfoVoList) {
managementHelper.sortPart(partInfoVoList);
return PartInfoListResponse.from(partInfoVoList);
}

public List<PartInfoVo> toPartInfoVoList(int periodNow) {
List<PartInfoVo> partInfoVoList = new ArrayList<>();
Part[] parts = Part.class.getEnumConstants();
for (Part part : parts) {
List<Member> memberList = memberRepository.findAllByPart(part);
PartInfoVo partInfoVo = PartInfoVo.of(part, memberList, periodNow);
partInfoVoList.add(partInfoVo);
}
return partInfoVoList;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package cotato.cotatomanage.management.repository;


import cotato.cotatomanage.management.domain.Member;
import cotato.cotatomanage.management.domain.Part;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MemberRepository extends JpaRepository<Member, Long> {

List<Member> findAllByPart(Part part);
}
Loading