diff --git a/src/main/java/com/econovation/third_project/ThirdStudyApplication.java b/src/main/java/com/econovation/third_project/ThirdStudyApplication.java index 86a78f2..4384b1b 100644 --- a/src/main/java/com/econovation/third_project/ThirdStudyApplication.java +++ b/src/main/java/com/econovation/third_project/ThirdStudyApplication.java @@ -1,12 +1,8 @@ package com.econovation.third_project; -import com.econovation.second_project.HellStudyApplication; -import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class ThirdStudyApplication { - public static void main(String[] args) { - SpringApplication.run(ThirdStudyApplication.class, args); - } + public static void main(String[] args) {} } diff --git a/src/main/java/com/econovation/third_project/controller/AdminQueryController.java b/src/main/java/com/econovation/third_project/controller/AdminQueryController.java index 4c15adb..965d13f 100644 --- a/src/main/java/com/econovation/third_project/controller/AdminQueryController.java +++ b/src/main/java/com/econovation/third_project/controller/AdminQueryController.java @@ -1,18 +1,31 @@ package com.econovation.third_project.controller; +import com.econovation.third_project.dto.*; +import com.econovation.third_project.service.*; import com.econovation.third_project.database.Database; import com.econovation.third_project.database.Registration; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; 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 java.time.LocalDate; +import java.util.List; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ExecutionException; + @Controller @RequiredArgsConstructor public class AdminQueryController { private final Database database; + private final ApplicantQueryService applicantQueryService; + private final MajorQueryService majorQueryService; + private final SupportPathQueryService supportPathQueryService; + private final HopeFieldQueryService hopeFieldQueryService; + private final DesiredTimeQueryService desiredTimeQueryService; // 예시 코드 @PostMapping("/registration") @@ -20,9 +33,47 @@ public ResponseEntity postRegistrate(@RequestBody Registration registrat database.register(registration); return ResponseEntity.ok().build(); } - @GetMapping("/registration") - public ResponseEntity getRegistration(String userId) { - return ResponseEntity.ok().body(database.getRegistration(userId)); + + + @GetMapping("/admin/{applicants}/{majors}/{programmers}/{path}/{desiredTime}") + public ResponseEntity getAdmin( + @PathVariable(required = false) String applicants, + @PathVariable(required = false) String majors, + @PathVariable(required = false) String programmers, + @PathVariable(required = false) String path, + @PathVariable(required = false) String desiredTime) throws ExecutionException, InterruptedException { + + CompletableFuture> applicantFuture = applicants.isEmpty() + ? null + : CompletableFuture.supplyAsync(() -> applicantQueryService.execute()); + + CompletableFuture> majorFuture = majors.isEmpty() + ? null + : CompletableFuture.supplyAsync(() -> majorQueryService.execute()); + + CompletableFuture> programmerFuture = programmers.isEmpty() + ? null + : CompletableFuture.supplyAsync(() -> hopeFieldQueryService.execute()); + + CompletableFuture> pathFuture = path.isEmpty() + ? null + : CompletableFuture.supplyAsync(() -> supportPathQueryService.execute()); + + CompletableFuture> desiredTimeFuture = desiredTime.isEmpty() + ? null + : CompletableFuture.supplyAsync(() -> desiredTimeQueryService.execute()); + + CompletableFuture completableFuture = CompletableFuture.allOf(applicantFuture, majorFuture, programmerFuture, pathFuture, desiredTimeFuture) + .thenApply(Void -> AdminQueryResponse.builder() + .applicants(applicantFuture.join()) + .majors(majorFuture.join()) + .programmers(programmerFuture.join()) + .path(pathFuture.join()) + .desiredTime(desiredTimeFuture.join()) + .build()); + + return ResponseEntity.ok().body(completableFuture.get()); } + } diff --git a/src/main/java/com/econovation/third_project/database/Database.java b/src/main/java/com/econovation/third_project/database/Database.java index 33b8710..51f130b 100644 --- a/src/main/java/com/econovation/third_project/database/Database.java +++ b/src/main/java/com/econovation/third_project/database/Database.java @@ -1,8 +1,7 @@ package com.econovation.third_project.database; -import java.util.HashMap; -import java.util.Map; -import java.util.UUID; +import java.util.*; + import org.springframework.stereotype.Component; /** @@ -25,4 +24,33 @@ public void register(Registration registrationRequest) { public Registration getRegistration(String userId) { return registration.get(userId); } + + public List getAllRegistration(){ + return registration.keySet().stream().map( + key -> registration.get(key) + ).toList(); + } + + public List getAllPersonalInformation(){ + return personalInformation.keySet().stream().map( + key -> personalInformation.get(key) + ).toList(); + } + + public List getPersonalInformation(List keys){ + return keys.stream().map(key -> personalInformation.get(key)).toList(); + } + + public List getAllPath(){ + return path.keySet().stream().map( + key -> path.get(key) + ).toList(); + } + + public List getAllDesiredTime(){ + return desiredTime.keySet().stream().map( + key -> desiredTime.get(key) + ).toList(); + } + } \ No newline at end of file diff --git a/src/main/java/com/econovation/third_project/database/DesiredTime.java b/src/main/java/com/econovation/third_project/database/DesiredTime.java index 2d7a140..61a6cac 100644 --- a/src/main/java/com/econovation/third_project/database/DesiredTime.java +++ b/src/main/java/com/econovation/third_project/database/DesiredTime.java @@ -1,6 +1,8 @@ package com.econovation.third_project.database; import java.util.List; + +import com.econovation.third_project.domain.Table; import lombok.AllArgsConstructor; import lombok.Getter; @@ -8,6 +10,8 @@ @Getter public class DesiredTime { String registrationId; + private String personalInfoId; // 희망 시간 (11 * 3)의 테이블 형태를 준수합니다. - private List desiredTime; + private List desiredTime; + } diff --git a/src/main/java/com/econovation/third_project/database/Path.java b/src/main/java/com/econovation/third_project/database/Path.java index 727433c..b530f27 100644 --- a/src/main/java/com/econovation/third_project/database/Path.java +++ b/src/main/java/com/econovation/third_project/database/Path.java @@ -1,5 +1,6 @@ package com.econovation.third_project.database; +import com.econovation.third_project.domain.SupportPath; import lombok.AllArgsConstructor; import lombok.Getter; @@ -8,5 +9,5 @@ public class Path { String registrationId; // 지원 경로 - private String supportPath; + private SupportPath supportPath; } diff --git a/src/main/java/com/econovation/third_project/database/PersonalInformation.java b/src/main/java/com/econovation/third_project/database/PersonalInformation.java index 8a17b8a..ff39d15 100644 --- a/src/main/java/com/econovation/third_project/database/PersonalInformation.java +++ b/src/main/java/com/econovation/third_project/database/PersonalInformation.java @@ -1,5 +1,6 @@ package com.econovation.third_project.database; +import com.econovation.third_project.domain.Major; import lombok.AllArgsConstructor; import lombok.Getter; @@ -24,12 +25,12 @@ public class PersonalInformation { private Integer semester; // 전공 - private String major; + private Major major; // 복수전공 - private String doubleMajor; + private Major doubleMajor; // 부전공 - private String minor; + private Major minor; diff --git a/src/main/java/com/econovation/third_project/database/Registration.java b/src/main/java/com/econovation/third_project/database/Registration.java index be42739..dade61d 100644 --- a/src/main/java/com/econovation/third_project/database/Registration.java +++ b/src/main/java/com/econovation/third_project/database/Registration.java @@ -1,21 +1,25 @@ package com.econovation.third_project.database; +import com.econovation.third_project.domain.HopeField; +import com.econovation.third_project.domain.ProgrammerField; import lombok.Getter; @Getter public class Registration { + + private Long registrationId; // 희망분야 - private String hopeField; + private HopeField hopeField; // 1지망 - private String firstPriority; + private ProgrammerField firstPriority; // 2지망 - private String secondPriority; + private ProgrammerField secondPriority; public Registration(String hopeField, String firstPriority, String secondPriority) { - this.hopeField = hopeField; - this.firstPriority = firstPriority; - this.secondPriority = secondPriority; + this.hopeField = HopeField.valueOf(hopeField); + this.firstPriority = ProgrammerField.valueOf(firstPriority); + this.secondPriority = ProgrammerField.valueOf(secondPriority); } } diff --git a/src/main/java/com/econovation/third_project/domain/HopeField.java b/src/main/java/com/econovation/third_project/domain/HopeField.java new file mode 100644 index 0000000..165a5e5 --- /dev/null +++ b/src/main/java/com/econovation/third_project/domain/HopeField.java @@ -0,0 +1,10 @@ +package com.econovation.third_project.domain; + +public enum HopeField { + + 개발자,기획자,디자이너; + + public Boolean isProgrammer(HopeField hopeField){ + return hopeField.name().equals(HopeField.개발자); + } +} diff --git a/src/main/java/com/econovation/third_project/domain/Major.java b/src/main/java/com/econovation/third_project/domain/Major.java new file mode 100644 index 0000000..3369371 --- /dev/null +++ b/src/main/java/com/econovation/third_project/domain/Major.java @@ -0,0 +1,5 @@ +package com.econovation.third_project.domain; + +public enum Major { + 산업공학과,소프트웨어공학과,컴퓨터정보통신공학과,Iot인공지능융합전공,디자인학과 +} diff --git a/src/main/java/com/econovation/third_project/domain/ProgrammerField.java b/src/main/java/com/econovation/third_project/domain/ProgrammerField.java new file mode 100644 index 0000000..ed87f00 --- /dev/null +++ b/src/main/java/com/econovation/third_project/domain/ProgrammerField.java @@ -0,0 +1,5 @@ +package com.econovation.third_project.domain; + +public enum ProgrammerField { + WEB,APP,AI,GAME,IoT,AR_VR +} diff --git a/src/main/java/com/econovation/third_project/domain/SupportPath.java b/src/main/java/com/econovation/third_project/domain/SupportPath.java new file mode 100644 index 0000000..1ba4d6b --- /dev/null +++ b/src/main/java/com/econovation/third_project/domain/SupportPath.java @@ -0,0 +1,5 @@ +package com.econovation.third_project.domain; + +public enum SupportPath { + 홍보_포스터,학교_공지사항,지인소개,인스타그램,에브리타임 +} diff --git a/src/main/java/com/econovation/third_project/domain/Table.java b/src/main/java/com/econovation/third_project/domain/Table.java new file mode 100644 index 0000000..28951dc --- /dev/null +++ b/src/main/java/com/econovation/third_project/domain/Table.java @@ -0,0 +1,24 @@ +package com.econovation.third_project.domain; + +import lombok.Getter; + +@Getter +public enum Table { + zerozero(0,0),zeroone(0,1),zerotwo(0,2),zerothree(0,3),zerofour(0,4),zerofive(0,5),zerosix(0,6),zeroseven(0,7),zeroeight(0,8),zeronine(0,9),zeroten(0,10), + onezero(1,0),oneone(1,1),onetwo(1,2),onethree(1,3),onefour(1,4),onefive(1,5),onesix(1,6),oneseven(1,7),oneeight(1,8),onenine(1,9),oneten(1,10), + twozero(2,0),twoone(2,1),twotwo(2,2),twothree(2,3),twofour(2,4),twofive(2,5),twosix(2,6),twoseven(2,7),twoeight(2,8),twonine(2,9),twoten(10,10), + ; + + private Integer row; + private Integer column; + + + Table(Integer row, Integer column) { + this.row = row; + this.column = column; + } + + public int[] toArray(){ + return new int[]{this.getRow(), this.getColumn()}; + } +} diff --git a/src/main/java/com/econovation/third_project/dto/AdminQueryResponse.java b/src/main/java/com/econovation/third_project/dto/AdminQueryResponse.java new file mode 100644 index 0000000..f8af654 --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/AdminQueryResponse.java @@ -0,0 +1,20 @@ +package com.econovation.third_project.dto; + +import lombok.Builder; + +import java.util.List; + +public record AdminQueryResponse( + List applicants, + List majors, + List programmers, + List path, + List desiredTime +) { + + @Builder + public AdminQueryResponse { + } + + +} diff --git a/src/main/java/com/econovation/third_project/dto/ApplicantDTO.java b/src/main/java/com/econovation/third_project/dto/ApplicantDTO.java new file mode 100644 index 0000000..544dd10 --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/ApplicantDTO.java @@ -0,0 +1,19 @@ +package com.econovation.third_project.dto; + +import lombok.Builder; + +public record ApplicantDTO( + String hopeField, + Integer count +) { + @Builder + public ApplicantDTO { + } + + public static ApplicantDTO of(String type, Integer count){ + return ApplicantDTO.builder() + .hopeField(type) + .count(count) + .build(); + } +} diff --git a/src/main/java/com/econovation/third_project/dto/DesiredTimeDTO.java b/src/main/java/com/econovation/third_project/dto/DesiredTimeDTO.java new file mode 100644 index 0000000..ca2487b --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/DesiredTimeDTO.java @@ -0,0 +1,24 @@ +package com.econovation.third_project.dto; + +import com.econovation.third_project.database.PersonalInformation; +import com.econovation.third_project.domain.Table; +import lombok.Builder; +import java.util.List; + +public record DesiredTimeDTO( + int[] table, + Integer countOfTime, + List personalInformations +) { + @Builder + public DesiredTimeDTO { + } + + public static DesiredTimeDTO of(Table table, Integer countOfTime, List personalInformations){ + return DesiredTimeDTO.builder() + .table(table.toArray()) + .countOfTime(countOfTime) + .personalInformations(personalInformations) + .build(); + } +} diff --git a/src/main/java/com/econovation/third_project/dto/MajorDTO.java b/src/main/java/com/econovation/third_project/dto/MajorDTO.java new file mode 100644 index 0000000..cf8b0e8 --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/MajorDTO.java @@ -0,0 +1,19 @@ +package com.econovation.third_project.dto; + +import lombok.Builder; + +public record MajorDTO( + String major, + Integer count +) { + @Builder + public MajorDTO { + } + + public static MajorDTO of(String major, Integer count){ + return MajorDTO.builder() + .count(count) + .major(major) + .build(); + } +} diff --git a/src/main/java/com/econovation/third_project/dto/PathDTO.java b/src/main/java/com/econovation/third_project/dto/PathDTO.java new file mode 100644 index 0000000..724caf3 --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/PathDTO.java @@ -0,0 +1,20 @@ +package com.econovation.third_project.dto; + +import lombok.Builder; + +public record PathDTO( + String pathName, + Integer count +) { + + @Builder + public PathDTO { + } + + public static PathDTO of(String pathName, Integer count){ + return PathDTO.builder() + .pathName(pathName) + .count(count) + .build(); + } +} diff --git a/src/main/java/com/econovation/third_project/dto/ProgrammerFieldDTO.java b/src/main/java/com/econovation/third_project/dto/ProgrammerFieldDTO.java new file mode 100644 index 0000000..062dcf5 --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/ProgrammerFieldDTO.java @@ -0,0 +1,22 @@ +package com.econovation.third_project.dto; + +import lombok.Builder; + +public record ProgrammerFieldDTO( + String field, + Integer firstPriorityCount, + Integer secondPriorityCount +) { + + @Builder + public ProgrammerFieldDTO { + } + + public static ProgrammerFieldDTO of(String field, Integer firstPriorityCount, Integer secondPriorityCount){ + return ProgrammerFieldDTO.builder() + .field(field) + .firstPriorityCount(firstPriorityCount) + .secondPriorityCount(secondPriorityCount) + .build(); + } +} diff --git a/src/main/java/com/econovation/third_project/dto/TimeTable.java b/src/main/java/com/econovation/third_project/dto/TimeTable.java new file mode 100644 index 0000000..6c93458 --- /dev/null +++ b/src/main/java/com/econovation/third_project/dto/TimeTable.java @@ -0,0 +1,23 @@ +package com.econovation.third_project.dto; + +import com.econovation.third_project.database.DesiredTime; +import com.econovation.third_project.domain.Table; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.List; + +@Getter +@AllArgsConstructor +public class TimeTable { + + private String personalInfoId; + private Table desiredTime; + + public static List from(DesiredTime desiredTime){ + return desiredTime.getDesiredTime().stream() + .map(dt -> new TimeTable(desiredTime.getPersonalInfoId(),dt)) + .toList(); + } + +} diff --git a/src/main/java/com/econovation/third_project/service/ApplicantQueryService.java b/src/main/java/com/econovation/third_project/service/ApplicantQueryService.java new file mode 100644 index 0000000..eb685f6 --- /dev/null +++ b/src/main/java/com/econovation/third_project/service/ApplicantQueryService.java @@ -0,0 +1,25 @@ +package com.econovation.third_project.service; + +import com.econovation.third_project.database.Database; +import com.econovation.third_project.database.Registration; +import com.econovation.third_project.domain.HopeField; +import com.econovation.third_project.dto.ApplicantDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import static java.util.stream.Collectors.groupingBy; + +@Service +@RequiredArgsConstructor +public class ApplicantQueryService { + + private final Database database; + + public List execute(){ + List allRegistration = database.getAllRegistration(); + Map> hopeFieldListMap = allRegistration.stream().collect(groupingBy(Registration::getHopeField)); + return hopeFieldListMap.keySet().stream() + .map(hopeField -> ApplicantDTO.of(hopeField.name(), hopeFieldListMap.get(hopeField).size())).toList(); + } +} diff --git a/src/main/java/com/econovation/third_project/service/DesiredTimeQueryService.java b/src/main/java/com/econovation/third_project/service/DesiredTimeQueryService.java new file mode 100644 index 0000000..3ac8c8e --- /dev/null +++ b/src/main/java/com/econovation/third_project/service/DesiredTimeQueryService.java @@ -0,0 +1,42 @@ +package com.econovation.third_project.service; + +import com.econovation.third_project.database.Database; +import com.econovation.third_project.database.DesiredTime; +import com.econovation.third_project.domain.Table; +import com.econovation.third_project.dto.DesiredTimeDTO; +import com.econovation.third_project.dto.TimeTable; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +import static java.util.stream.Collectors.groupingBy; + +@Service +@RequiredArgsConstructor +public class DesiredTimeQueryService { + + private final Database database; + + public List execute(){ + List allDesiredTime = database.getAllDesiredTime(); + + List timeTables = allDesiredTime.stream() + .flatMap(adt -> TimeTable.from(adt).stream()) + .toList(); + + Map> tableListMap = timeTables.stream().collect(groupingBy(TimeTable::getDesiredTime)); + List desiredTimeDTOS = tableListMap.keySet().stream() + .map(table -> + DesiredTimeDTO.of( + table, + tableListMap.get(table).size(), + database.getPersonalInformation( + tableListMap.get(table).stream() + .map(timeTable -> timeTable.getPersonalInfoId()).toList())) + ).toList(); + + return desiredTimeDTOS; + } +} diff --git a/src/main/java/com/econovation/third_project/service/HopeFieldQueryService.java b/src/main/java/com/econovation/third_project/service/HopeFieldQueryService.java new file mode 100644 index 0000000..03074aa --- /dev/null +++ b/src/main/java/com/econovation/third_project/service/HopeFieldQueryService.java @@ -0,0 +1,35 @@ +package com.econovation.third_project.service; + +import com.econovation.third_project.database.Database; +import com.econovation.third_project.database.Registration; +import com.econovation.third_project.domain.HopeField; +import com.econovation.third_project.domain.ProgrammerField; +import com.econovation.third_project.dto.ProgrammerFieldDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import static java.util.stream.Collectors.groupingBy; + +@Service +@RequiredArgsConstructor +public class HopeFieldQueryService { + + private final Database database; + + public List execute(){ + List allRegistration = database.getAllRegistration(); + Map> hopeFieldListMap = allRegistration.stream().collect(groupingBy(Registration::getHopeField)); + List registrations = hopeFieldListMap.keySet().stream() + .filter(hopeField -> hopeField.isProgrammer(hopeField)) + .flatMap(hopeField -> hopeFieldListMap.get(hopeField).stream()) + .toList(); + // 프로그래머만 존재 + + Map> firstPriorityMap = registrations.stream().collect(groupingBy(Registration::getFirstPriority)); + Map> secondPriorityMap = registrations.stream().collect(groupingBy(Registration::getSecondPriority)); + + return firstPriorityMap.keySet().stream() + .map(programmerField -> ProgrammerFieldDTO.of(programmerField.name(), firstPriorityMap.get(programmerField).size(),secondPriorityMap.get(programmerField).size())).toList(); + } +} diff --git a/src/main/java/com/econovation/third_project/service/MajorQueryService.java b/src/main/java/com/econovation/third_project/service/MajorQueryService.java new file mode 100644 index 0000000..95b4870 --- /dev/null +++ b/src/main/java/com/econovation/third_project/service/MajorQueryService.java @@ -0,0 +1,31 @@ +package com.econovation.third_project.service; + + +import com.econovation.third_project.database.Database; +import com.econovation.third_project.database.PersonalInformation; +import com.econovation.third_project.database.Registration; +import com.econovation.third_project.domain.HopeField; +import com.econovation.third_project.domain.Major; +import com.econovation.third_project.dto.ApplicantDTO; +import com.econovation.third_project.dto.MajorDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class MajorQueryService { + + private final Database database; + + public List execute(){ + List allPersonalInformation = database.getAllPersonalInformation(); + Map> majorListMap = allPersonalInformation.stream().collect(Collectors.groupingBy(PersonalInformation::getMajor)); + Map> doubleMajorListMap = allPersonalInformation.stream().collect(Collectors.groupingBy(PersonalInformation::getDoubleMajor)); + return majorListMap.keySet().stream() + .map(major -> MajorDTO.of(major.name(), majorListMap.get(major).size() + doubleMajorListMap.get(major).size())).toList(); + } +} diff --git a/src/main/java/com/econovation/third_project/service/SupportPathQueryService.java b/src/main/java/com/econovation/third_project/service/SupportPathQueryService.java new file mode 100644 index 0000000..c719cc2 --- /dev/null +++ b/src/main/java/com/econovation/third_project/service/SupportPathQueryService.java @@ -0,0 +1,27 @@ +package com.econovation.third_project.service; + +import com.econovation.third_project.database.Database; +import com.econovation.third_project.database.Path; +import com.econovation.third_project.domain.SupportPath; +import com.econovation.third_project.dto.PathDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +import static java.util.stream.Collectors.groupingBy; + +@Service +@RequiredArgsConstructor +public class SupportPathQueryService { + + private final Database database; + + public List execute(){ + List allPath = database.getAllPath(); + Map> pathListMap = allPath.stream().collect(groupingBy(Path::getSupportPath)); + return pathListMap.keySet().stream() + .map(path -> PathDTO.of(path.name(),pathListMap.get(path).size())).toList(); + } +}