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/admin 관리자 페이지 구현 step2 #10

Merged
merged 13 commits into from
Feb 4, 2025
6 changes: 6 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,12 @@ dependencies {

// aws s3
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

// Spring boot 3.x이상에서 QueryDsl 패키지를 정의하는 방법
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:5.0.0:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
}

tasks.named('test') {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package com.yedu.backend.admin.application.dto.req;

public record TeacherIssueRequest(String issue) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.yedu.backend.admin.application.dto.req;

import com.yedu.backend.domain.parents.domain.entity.constant.ClassType;
import com.yedu.backend.domain.teacher.domain.entity.constant.TeacherGender;

import java.util.List;

public record TeacherSearchRequest(
List<String> districts,
List<ClassType> subjects,
List<String> universities,
List<TeacherGender> genders,
String search
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.yedu.backend.admin.application.dto.res;

import com.yedu.backend.domain.parents.domain.entity.constant.ClassType;
import com.yedu.backend.domain.teacher.domain.entity.constant.District;
import com.yedu.backend.domain.teacher.domain.entity.constant.TeacherStatus;

import java.util.List;

public record AllFilteringTeacher(
List<FilteringTeacher> filteringTeachers
) {
public record FilteringTeacher (
long teacherId,
String nickName,
List<ClassType> classTypes,
String name,
TeacherStatus status,
int accept,
int total,
String university,
List<District> districts,
String issue
){}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,19 @@

import com.yedu.backend.admin.application.dto.res.AllAlarmTalkResponse.AlarmTalkResponse;
import com.yedu.backend.admin.application.dto.res.AllApplicationResponse.ApplicationResponse;
import com.yedu.backend.admin.application.dto.res.AllFilteringTeacher.FilteringTeacher;
import com.yedu.backend.admin.application.dto.res.ClassDetailsResponse;
import com.yedu.backend.admin.application.dto.res.CommonParentsResponse;
import com.yedu.backend.domain.matching.domain.entity.ClassMatching;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.parents.domain.entity.Goal;
import com.yedu.backend.domain.parents.domain.entity.Parents;
import com.yedu.backend.domain.parents.domain.entity.constant.ClassType;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;
import com.yedu.backend.domain.teacher.domain.entity.TeacherClassInfo;
import com.yedu.backend.domain.teacher.domain.entity.TeacherInfo;
import com.yedu.backend.domain.teacher.domain.entity.constant.District;

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

Expand Down Expand Up @@ -48,7 +53,7 @@ public static AlarmTalkResponse mapToAlarmTalkResponse(ClassMatching classMatchi
Teacher teacher = classMatching.getTeacher();
String refuseReason = Optional.ofNullable(classMatching.getRefuseReason()).orElse(null);
return new AlarmTalkResponse(
classMatching.getClassMatching(),
classMatching.getClassMatchingId(),
classMatching.getMatchStatus(),
teacher.getTeacherInfo().getNickName(),
teacher.getTeacherInfo().getName(),
Expand Down Expand Up @@ -91,10 +96,33 @@ else if (count.equals("주 4회"))
applicationForm.getWantedSubject(),
applicationForm.getOnline(),
applicationForm.getFavoriteGender(),
applicationForm.getParents().getDistrict(),
applicationForm.getParents().getDong(),
applicationForm.getDistrict(),
applicationForm.getDong(),
goals,
applicationForm.getFavoriteStyle()
);
}

public static FilteringTeacher mapToAllFilteringTeacherResponse(Teacher teacher, List<District> districts) {
TeacherInfo teacherInfo = teacher.getTeacherInfo();
TeacherClassInfo classInfo = teacher.getTeacherClassInfo();
List<ClassType> classTypes = new ArrayList<>();
if (classInfo.isEnglishPossible())
classTypes.add(ClassType.영어);
if (classInfo.isMathPossible())
classTypes.add(ClassType.수학);

return new FilteringTeacher(
teacher.getTeacherId(),
teacherInfo.getNickName(),
classTypes,
teacherInfo.getName(),
teacher.getStatus(),
0,
0,
teacher.getTeacherSchoolInfo().getUniversity(),
districts,
teacher.getIssue()
);
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,23 @@
package com.yedu.backend.admin.application.usecase;

import com.yedu.backend.admin.application.dto.res.AllAlarmTalkResponse;
import com.yedu.backend.admin.application.dto.req.TeacherSearchRequest;
import com.yedu.backend.admin.application.dto.res.*;
import com.yedu.backend.admin.application.dto.res.AllAlarmTalkResponse.AlarmTalkResponse;
import com.yedu.backend.admin.application.dto.res.AllApplicationResponse;
import com.yedu.backend.admin.application.dto.res.ClassDetailsResponse;
import com.yedu.backend.admin.application.dto.res.CommonParentsResponse;
import com.yedu.backend.admin.application.mapper.AdminMapper;
import com.yedu.backend.admin.domain.service.AdminGetService;
import com.yedu.backend.domain.matching.domain.entity.ClassMatching;
import com.yedu.backend.domain.matching.domain.entity.constant.MatchingStatus;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.parents.domain.entity.Goal;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;
import com.yedu.backend.domain.teacher.domain.entity.TeacherDistrict;
import com.yedu.backend.domain.teacher.domain.entity.constant.District;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.time.Duration;
import java.time.LocalTime;
import java.time.LocalDateTime;
import java.util.List;

import static com.yedu.backend.admin.application.mapper.AdminMapper.*;
Expand Down Expand Up @@ -54,7 +55,7 @@ public AllAlarmTalkResponse getAlarmTalkInfo(String applicationFormId) {
int accept = (int)classMatchings.stream()
.filter(classMatching -> classMatching.getMatchStatus().equals(MatchingStatus.수락) || classMatching.getMatchStatus().equals(MatchingStatus.전송))
.count();
int time = (int)Duration.between(applicationForm.getCreatedAt().toLocalTime(), LocalTime.now())
int time = (int)Duration.between(applicationForm.getCreatedAt(), LocalDateTime.now())
.toMinutes();
return new AllAlarmTalkResponse(accept, classMatchings.size(), time, alarmTalkResponses);
}
Expand All @@ -67,4 +68,17 @@ public ClassDetailsResponse getClassDetails(String applicationFormId) {
.toList();
return mapToClassDetailsResponse(applicationForm, classGoals);
}

public AllFilteringTeacher searchAllTeacher(TeacherSearchRequest request) {
List<Teacher> teachers = adminGetService.allTeacherBySearch(request);
return new AllFilteringTeacher(teachers.stream()
.map(teacher -> {
List<TeacherDistrict> teacherDistricts = adminGetService.allDistrictByTeacher(teacher);
List<District> districts = teacherDistricts.stream()
.map(TeacherDistrict::getDistrict)
.toList();
return mapToAllFilteringTeacherResponse(teacher, districts);
})
.toList());
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
package com.yedu.backend.admin.application.usecase;

import com.yedu.backend.admin.application.dto.req.ParentsKakaoNameRequest;
import com.yedu.backend.admin.application.dto.req.TeacherIssueRequest;
import com.yedu.backend.admin.domain.service.AdminGetService;
import com.yedu.backend.admin.domain.service.AdminUpdateService;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.parents.domain.entity.Parents;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -25,4 +27,9 @@ public void updateProceedStatus(String applicationFormId) {
ApplicationForm applicationForm = adminGetService.applicationFormById(applicationFormId);
adminUpdateService.updateProceedStatus(applicationForm);
}

public void updateTeacherIssue(long teacherId, TeacherIssueRequest request) {
Teacher teacher = adminGetService.teacherById(teacherId);
adminUpdateService.updateTeacherIssue(teacher, request.issue());
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package com.yedu.backend.admin.domain.service;

import com.yedu.backend.admin.application.dto.req.TeacherSearchRequest;
import com.yedu.backend.domain.matching.domain.entity.ClassMatching;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.parents.domain.entity.Goal;
import com.yedu.backend.domain.parents.domain.entity.Parents;
import com.yedu.backend.domain.parents.domain.repository.ApplicationFormRepository;
import com.yedu.backend.domain.parents.domain.repository.ClassMatchingRepository;
import com.yedu.backend.domain.matching.domain.repository.ClassMatchingRepository;
import com.yedu.backend.domain.parents.domain.repository.GoalRepository;
import com.yedu.backend.domain.parents.domain.repository.ParentsRepository;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;
import com.yedu.backend.domain.teacher.domain.entity.TeacherDistrict;
import com.yedu.backend.domain.teacher.domain.repository.TeacherDistrictRepository;
import com.yedu.backend.domain.teacher.domain.repository.TeacherRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
Expand All @@ -21,6 +26,8 @@ public class AdminGetService {
private final ClassMatchingRepository classMatchingRepository;
private final GoalRepository goalRepository;
private final ParentsRepository parentsRepository;
private final TeacherRepository teacherRepository;
private final TeacherDistrictRepository teacherDistrictRepository;

public Parents parentsById(Long parentsId) {
return parentsRepository.findById(parentsId)
Expand All @@ -43,4 +50,17 @@ public ApplicationForm applicationFormById(String applicationFormId) {
public List<Goal> allGoalByApplicationForm(ApplicationForm applicationForm) {
return goalRepository.findAllByApplicationForm(applicationForm);
}

public List<Teacher> allTeacherBySearch(TeacherSearchRequest teacherSearchRequest) {
return teacherRepository.findAllSearchTeacher(teacherSearchRequest);
}

public Teacher teacherById(long teacherId) {
return teacherRepository.findById(teacherId)
.orElseThrow();
}

public List<TeacherDistrict> allDistrictByTeacher(Teacher teacher) {
return teacherDistrictRepository.findAllByTeacher(teacher);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.parents.domain.entity.Parents;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;
import org.springframework.stereotype.Service;

@Service
Expand All @@ -13,4 +14,8 @@ public void updateKakaoName(Parents parents, String kakaoName) {
public void updateProceedStatus(ApplicationForm applicationForm) {
applicationForm.updateProceedStatus();
}

public void updateTeacherIssue(Teacher teacher, String issue) {
teacher.updateIssue(issue);
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package com.yedu.backend.admin.presentation;

import com.yedu.backend.admin.application.dto.req.ParentsKakaoNameRequest;
import com.yedu.backend.admin.application.dto.res.AllAlarmTalkResponse;
import com.yedu.backend.admin.application.dto.res.AllApplicationResponse;
import com.yedu.backend.admin.application.dto.res.ClassDetailsResponse;
import com.yedu.backend.admin.application.dto.res.CommonParentsResponse;
import com.yedu.backend.admin.application.dto.req.TeacherIssueRequest;
import com.yedu.backend.admin.application.dto.req.TeacherSearchRequest;
import com.yedu.backend.admin.application.dto.res.*;
import com.yedu.backend.admin.application.usecase.AdminInfoUseCase;
import com.yedu.backend.admin.application.usecase.AdminManageUseCase;
import com.yedu.backend.domain.parents.domain.entity.constant.ClassType;
import com.yedu.backend.domain.teacher.domain.entity.constant.TeacherGender;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/admin")
Expand All @@ -36,6 +39,12 @@ public ResponseEntity updateProceed(@PathVariable long parentsId, @RequestBody P
return ResponseEntity.ok().build();
}

@PutMapping("/teacher/issue/{teacherId}")
public ResponseEntity updateTeacherIssue(@PathVariable long teacherId, @RequestBody TeacherIssueRequest request) {
adminManageUseCase.updateTeacherIssue(teacherId, request);
return ResponseEntity.ok().build();
}

@GetMapping("/details/matching/parents/{applicationFormId}")
public ResponseEntity<CommonParentsResponse> commonParents(@PathVariable String applicationFormId) {
CommonParentsResponse parentsInfo = adminInfoUseCase.getParentsInfo(applicationFormId);
Expand All @@ -53,4 +62,16 @@ public ResponseEntity<ClassDetailsResponse> classDetails(@PathVariable String ap
ClassDetailsResponse classDetails = adminInfoUseCase.getClassDetails(applicationFormId);
return ResponseEntity.ok(classDetails);
}

@GetMapping("/details/matching/search")
public ResponseEntity<AllFilteringTeacher> searchTeachers(
@RequestParam(required = false) List<String> districts,
@RequestParam(required = false) List<ClassType> subjects,
@RequestParam(required = false) List<String> universities,
@RequestParam(required = false) List<TeacherGender> genders,
@RequestParam(required = false) String search) {
TeacherSearchRequest request = new TeacherSearchRequest(districts, subjects, universities, genders, search);
AllFilteringTeacher allFilteringTeacher = adminInfoUseCase.searchAllTeacher(request);
return ResponseEntity.ok(allFilteringTeacher);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.yedu.backend.domain.matching.application.mapper;

import com.yedu.backend.domain.matching.domain.entity.ClassMatching;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;

public class ClassMatchingMapper {
public static ClassMatching mapToClassMatching(Teacher teacher, ApplicationForm applicationForm) {
return ClassMatching.builder()
.applicationForm(applicationForm)
.teacher(teacher)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.yedu.backend.domain.matching.application.usecase;

import com.yedu.backend.domain.matching.application.mapper.ClassMatchingMapper;
import com.yedu.backend.domain.matching.domain.service.ClassMatchingSaveService;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
import com.yedu.backend.domain.teacher.domain.entity.Teacher;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional
public class ClassMatchingManageUseCase {
private final ClassMatchingSaveService classMatchingSaveService;

public void saveAllClassMatching(List<Teacher> teachers, ApplicationForm applicationForm) {
teachers.stream()
.map(teacher -> ClassMatchingMapper.mapToClassMatching(teacher, applicationForm))
.toList()
.forEach(classMatchingSaveService::save);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
public class ClassMatching extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long classMatching;
private long classMatchingId;
@ManyToOne(fetch = FetchType.LAZY)
private Teacher teacher;
@ManyToOne(fetch = FetchType.LAZY)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.yedu.backend.domain.parents.domain.repository;
package com.yedu.backend.domain.matching.domain.repository;

import com.yedu.backend.domain.matching.domain.entity.ClassMatching;
import com.yedu.backend.domain.parents.domain.entity.ApplicationForm;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.yedu.backend.domain.matching.domain.service;

import com.yedu.backend.domain.matching.domain.entity.ClassMatching;
import com.yedu.backend.domain.matching.domain.repository.ClassMatchingRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ClassMatchingSaveService {
private final ClassMatchingRepository classMatchingRepository;

public void save(ClassMatching classMatching) {
classMatchingRepository.save(classMatching);
}
}
Loading
Loading