diff --git a/src/main/java/com/hid_web/be/controller/exhibit/ExhibitController.java b/src/main/java/com/hid_web/be/controller/exhibit/ExhibitController.java index 3a4299a..ddfdc24 100644 --- a/src/main/java/com/hid_web/be/controller/exhibit/ExhibitController.java +++ b/src/main/java/com/hid_web/be/controller/exhibit/ExhibitController.java @@ -24,6 +24,8 @@ @RequiredArgsConstructor @RequestMapping("/exhibits") public class ExhibitController { + + private final ExhibitService exhibitService; /* @GetMapping("/previews") // findAllExhibitPreview -> findExhibitPreviewsByYearAndMajor, findExhibitPreviewsByYearAndClub 임시 @@ -79,12 +81,6 @@ public ResponseEntity createExhibit(@Valid @ModelAttribute Crea } } - @DeleteMapping("/admin/{exhibitId}") - public ResponseEntity deleteExhibit(@PathVariable Long exhibitId) { - exhibitService.deleteExhibit(exhibitId); - return ResponseEntity.noContent().build(); - } - @PutMapping("/admin/{exhibitId}") public ResponseEntity updateExhibit(@Valid @PathVariable Long exhibitId, @ModelAttribute UpdateExhibitRequest updateExhibitRequest) { try { @@ -100,6 +96,11 @@ public ResponseEntity updateExhibit(@Valid @PathVariable Long e return ResponseEntity.internalServerError().build(); } } + @DeleteMapping("/admin/{exhibitId}") + public ResponseEntity deleteExhibit(@PathVariable Long exhibitId) { + exhibitService.deleteExhibit(exhibitId); + return ResponseEntity.noContent().build(); + } @GetMapping("/search") public ResponseEntity> searchExhibits( diff --git a/src/main/java/com/hid_web/be/controller/professor/ProfessorController.java b/src/main/java/com/hid_web/be/controller/professor/ProfessorController.java index 9764b7c..eea18a6 100644 --- a/src/main/java/com/hid_web/be/controller/professor/ProfessorController.java +++ b/src/main/java/com/hid_web/be/controller/professor/ProfessorController.java @@ -1,6 +1,9 @@ package com.hid_web.be.controller.professor; import com.hid_web.be.controller.professor.request.CreateProfessorRequest; +import com.hid_web.be.controller.professor.request.UpdateProfessorRequest; +import com.hid_web.be.controller.professor.response.ProfessorDetailResponse; +import com.hid_web.be.controller.professor.response.ProfessorPreviewResponse; import com.hid_web.be.controller.professor.response.ProfessorResponse; import com.hid_web.be.domain.professor.ProfessorService; import com.hid_web.be.storage.professor.ProfessorEntity; @@ -8,24 +11,28 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ModelAttribute; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.net.URI; +import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping("/professors") @RequiredArgsConstructor public class ProfessorController { + + private static final Logger logger = LoggerFactory.getLogger(ProfessorController.class); + private final ProfessorService professorService; - @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE) //삽입 public ResponseEntity createProfessor( @Valid @ModelAttribute CreateProfessorRequest createProfessorRequest ) { @@ -40,6 +47,85 @@ public ResponseEntity createProfessor( .build(); } } + @PutMapping("/admin/{uuid}") //수정 + public ResponseEntity updateProfessor( + @Valid @PathVariable String uuid, @Valid @ModelAttribute UpdateProfessorRequest updateProfessorRequest + ) { + try { + ProfessorEntity professorEntity = professorService.updateProfessor(uuid, updateProfessorRequest); + + ProfessorResponse response = ProfessorResponse.of(professorEntity); + + URI location = URI.create("/professors/" + uuid); + + + return ResponseEntity.created(location).body(response); + } catch (Exception e) { + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .build(); + } + } + + @PostMapping("/test") + public ResponseEntity a( + @Valid @ModelAttribute CreateProfessorRequest createProfessorRequest + ) { + try { + logger.debug("aaaaaaaaaaa"+"try"); + + ProfessorEntity professorEntity = professorService.test(createProfessorRequest); + ProfessorResponse response = ProfessorResponse.of(professorEntity); + URI location = URI.create("/professors/" + professorEntity.getUuid()); + return ResponseEntity.created(location).body(response); + + } catch (Exception e) { + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .build(); + } + } + @GetMapping("/detail/{uuid}") //교수 상세정보 + public ResponseEntity getProfessorDetail(@PathVariable String uuid){ + try{ + ProfessorDetailResponse professorDetailResponse = professorService.getProfessorDetail(uuid); + return ResponseEntity.ok(professorDetailResponse); + }catch(Exception e){ + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .build(); + } + } + + @GetMapping("/{department}") //학과별 교수진 + public ResponseEntity> getProfessors(@PathVariable String department){ + + try { + List professorPreviewList=professorService.getProfessorByDepartment(department); + + return ResponseEntity.ok(professorPreviewList); + }catch (Exception e){ + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .build(); + } + } + + @DeleteMapping("/admin/{uuid}") //삭제 + public ResponseEntity deleteProfessor(@PathVariable String uuid){ + + try{ + professorService.deleteProfessor(uuid); + return ResponseEntity.noContent().build(); + } + catch(Exception e){ + return ResponseEntity + .status(HttpStatus.INTERNAL_SERVER_ERROR) + .build(); + } + } + + @Data @AllArgsConstructor diff --git a/src/main/java/com/hid_web/be/controller/professor/request/UpdateAwardRequest.java b/src/main/java/com/hid_web/be/controller/professor/request/UpdateAwardRequest.java new file mode 100644 index 0000000..941ec22 --- /dev/null +++ b/src/main/java/com/hid_web/be/controller/professor/request/UpdateAwardRequest.java @@ -0,0 +1,9 @@ +package com.hid_web.be.controller.professor.request; + +import lombok.Data; + +@Data +public class UpdateAwardRequest { + private String year; + private String title; +} diff --git a/src/main/java/com/hid_web/be/controller/professor/request/UpdateBiographyRequest.java b/src/main/java/com/hid_web/be/controller/professor/request/UpdateBiographyRequest.java new file mode 100644 index 0000000..59da375 --- /dev/null +++ b/src/main/java/com/hid_web/be/controller/professor/request/UpdateBiographyRequest.java @@ -0,0 +1,9 @@ +package com.hid_web.be.controller.professor.request; + +import lombok.Data; + +@Data +public class UpdateBiographyRequest { + private String year; + private String description; +} diff --git a/src/main/java/com/hid_web/be/controller/professor/request/UpdateProfessorRequest.java b/src/main/java/com/hid_web/be/controller/professor/request/UpdateProfessorRequest.java new file mode 100644 index 0000000..9bca680 --- /dev/null +++ b/src/main/java/com/hid_web/be/controller/professor/request/UpdateProfessorRequest.java @@ -0,0 +1,56 @@ +package com.hid_web.be.controller.professor.request; + +import com.hid_web.be.domain.professor.Award; +import com.hid_web.be.domain.professor.Biography; +import com.hid_web.be.domain.professor.Work; +import jakarta.validation.Valid; + +import lombok.Getter; +import lombok.Setter; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; +import java.util.stream.Collectors; + +@Getter +@Setter +public class UpdateProfessorRequest { + + private MultipartFile image; + + private String name; + private String position; + private String department; + private String detailInfo; + private String email; + private String major; + + + @Valid + private List biographyEntries; + + @Valid + private List awards; + + @Valid + private List works; + + // 엔티티 변환 메서드들 + public List toBiographyList() { + return biographyEntries.stream() + .map(dto -> new Biography(null, dto.getYear(), dto.getDescription())) + .collect(Collectors.toList()); + } + + public List toAwardList() { + return awards.stream() + .map(dto -> new Award(null, dto.getYear(), dto.getTitle())) + .collect(Collectors.toList()); + } + + public List toWorkList() { + return works.stream() + .map(dto -> new Work(null, dto.getYear(), dto.getTitle())) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/hid_web/be/controller/professor/request/UpdateWorkRequest.java b/src/main/java/com/hid_web/be/controller/professor/request/UpdateWorkRequest.java new file mode 100644 index 0000000..533ec8b --- /dev/null +++ b/src/main/java/com/hid_web/be/controller/professor/request/UpdateWorkRequest.java @@ -0,0 +1,9 @@ +package com.hid_web.be.controller.professor.request; + +import lombok.Data; + +@Data +public class UpdateWorkRequest { + private String year; + private String title; +} diff --git a/src/main/java/com/hid_web/be/controller/professor/response/ProfessorDetailResponse.java b/src/main/java/com/hid_web/be/controller/professor/response/ProfessorDetailResponse.java new file mode 100644 index 0000000..22c5eb1 --- /dev/null +++ b/src/main/java/com/hid_web/be/controller/professor/response/ProfessorDetailResponse.java @@ -0,0 +1,51 @@ +package com.hid_web.be.controller.professor.response; + + +import com.hid_web.be.domain.s3.S3UrlConverter; +import com.hid_web.be.storage.professor.ProfessorEntity; +import lombok.*; + +import java.util.List; + +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public class ProfessorDetailResponse { + + private String uuid; + private String name; + private String position; + private String department; + private String detailInfo; + private String email; + private String major; + private String imgUrl; + + private List biographyEntries; + private List awards; + private List works; + + public static ProfessorDetailResponse of(ProfessorEntity professor) { + return ProfessorDetailResponse.builder() + .uuid(professor.getUuid()) + .name(professor.getName()) + .position(professor.getPosition()) + .department(professor.getDepartment()) + .detailInfo(professor.getDetailInfo()) + .email(professor.getEmail()) + .major(professor.getMajor()) + .imgUrl(S3UrlConverter.convertCloudfrontUrlFromObjectKey(professor.getImgObjectKey())) + .biographyEntries(professor.getBiographyEntries().stream() + .map(BiographyEntryResponse::of) + .toList()) + .awards(professor.getAwards().stream() + .map(AwardResponse::of) + .toList()) + .works(professor.getWorks().stream() + .map(WorkResponse::of) + .toList()) + .build(); + } + +} diff --git a/src/main/java/com/hid_web/be/controller/professor/response/ProfessorPreviewResponse.java b/src/main/java/com/hid_web/be/controller/professor/response/ProfessorPreviewResponse.java new file mode 100644 index 0000000..da2f3d6 --- /dev/null +++ b/src/main/java/com/hid_web/be/controller/professor/response/ProfessorPreviewResponse.java @@ -0,0 +1,20 @@ +package com.hid_web.be.controller.professor.response; + + +import lombok.*; + +@Getter +@Builder +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PROTECTED) +public class ProfessorPreviewResponse { + private String uuid; + + private String name; + + private String department; + + private String imgUrl; + + +} diff --git a/src/main/java/com/hid_web/be/domain/professor/ProfessorService.java b/src/main/java/com/hid_web/be/domain/professor/ProfessorService.java index 34184a6..994dfc4 100644 --- a/src/main/java/com/hid_web/be/domain/professor/ProfessorService.java +++ b/src/main/java/com/hid_web/be/domain/professor/ProfessorService.java @@ -1,20 +1,43 @@ package com.hid_web.be.domain.professor; +import com.hid_web.be.controller.professor.ProfessorController; import com.hid_web.be.controller.professor.request.CreateProfessorRequest; +import com.hid_web.be.controller.professor.request.UpdateProfessorRequest; +import com.hid_web.be.controller.professor.response.ProfessorDetailResponse; +import com.hid_web.be.controller.professor.response.ProfessorPreviewResponse; +import com.hid_web.be.controller.professor.response.ProfessorResponse; +import com.hid_web.be.domain.s3.S3UrlConverter; import com.hid_web.be.domain.s3.S3Writer; import com.hid_web.be.storage.professor.ProfessorEntity; +import com.hid_web.be.storage.professor.ProfessorRepository; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; +import java.util.Comparator; +import java.util.List; +import java.util.Optional; import java.util.UUID; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor public class ProfessorService { + + private static final Logger logger = LoggerFactory.getLogger(ProfessorController.class); + private final ProfessorWriter professorWriter; private final S3Writer s3Writer; + private final ProfessorRepository professorRepository; + + private static final List SORT_POSITION= + List.of("교수", "부교수", "조교수", "초빙교수", "겸임교수", + "외래교수", "강사"); //정렬 순서 @Transactional public ProfessorEntity createProfessor(CreateProfessorRequest createProfessorRequest) throws IOException { @@ -24,7 +47,121 @@ public ProfessorEntity createProfessor(CreateProfessorRequest createProfessorReq // S3에 프로필 이미지 업로드 String imgObjectKey = s3Writer.writeFile(createProfessorRequest.getImage(), professorUUID + "/profile-image"); + int sortOrder=calculateSortOrder(createProfessorRequest.getName(), createProfessorRequest.getPosition()); + + updateSortOrder(sortOrder); + + // 교수 기본 정보 저장 + return professorWriter.createProfessor(professorUUID, imgObjectKey, createProfessorRequest, sortOrder); + } + + @Transactional + public ProfessorEntity updateProfessor(String uuid, UpdateProfessorRequest updateProfessorRequest) throws IOException { + + // 교수 UUID 생성 + + // S3에 프로필 이미지 업로드 + String imgObjectKey = s3Writer.writeFile(updateProfessorRequest.getImage(), uuid + "/profile-image"); + + int sortOrder=calculateSortOrder(updateProfessorRequest.getName(), updateProfessorRequest.getPosition()); + + updateSortOrder(sortOrder); + // 교수 기본 정보 저장 - return professorWriter.createProfessor(professorUUID, imgObjectKey, createProfessorRequest); + return professorWriter.updateProfessor(uuid, imgObjectKey, updateProfessorRequest, sortOrder); } + + @Transactional + public ProfessorEntity test(CreateProfessorRequest createProfessorRequest) throws IOException { + // 교수 UUID 생성 + String professorUUID = UUID.randomUUID().toString(); + + // S3에 프로필 이미지 업로드 + String imgObjectKey = "TestUrl"; + + int sortOrder=calculateSortOrder(createProfessorRequest.getName(), createProfessorRequest.getPosition()); + + updateSortOrder(sortOrder); + + // 교수 기본 정보 저장 + return professorWriter.createProfessor(professorUUID, imgObjectKey, createProfessorRequest, sortOrder); + } + + public List getProfessorByDepartment(String department){ + + List professors; + if("all".equals(department)){ + professors=professorRepository.getAll(); + }else{ + + professors= professorRepository.getByDepartment(department); + } + return professors.stream() + .map(professor -> ProfessorPreviewResponse.builder() + .uuid(professor.getUuid()) + .name(professor.getName()) + .department(professor.getDepartment()) + .imgUrl(S3UrlConverter.convertCloudfrontUrlFromObjectKey(professor.getImgObjectKey())) + .build()) + .collect(Collectors.toList()); + } + + public ProfessorDetailResponse getProfessorDetail(String uuid){ + + ProfessorDetailResponse professorDetailResponse= ProfessorDetailResponse.of(professorRepository.findByUuid(uuid)); + return professorDetailResponse; + } + + @Transactional + public void deleteProfessor(String uuid){ + + ProfessorEntity professorEntity=professorRepository.findByUuid(uuid); + if(professorEntity!=null){ + logger.debug("data found"); + professorRepository.delete(professorEntity); + + try{ + s3Writer.deleteObjects(professorEntity.getImgObjectKey()); //수정 필요 + }catch(RuntimeException e){ + + throw e; + } + + }else{ //삭제할 데이터가 없음 + + logger.debug("no data found"); + + throw new IllegalArgumentException("no data found"); + } + + } + + private int calculateSortOrder(String name, String position){ + + Optional result= professorRepository.getSortOrderByPositionAndName(position, name); + + if(result.isPresent()){ //예시 데이터 존재 + return result.get(); + }else {//예시 데이터 존재안함 + + int i=SORT_POSITION.indexOf(position); + if(i!=-1) { // SORT_POSITION 에 등록되어 있다면 + Optional prevResult; + for (i--; i >= 0; i--) { + prevResult = professorRepository.getMaxSortOrderByPositon(SORT_POSITION.get(i)); + if (prevResult.isPresent()) { + return prevResult.get() + 1; //다음 인덱스부터 시작 + } + } + return 0; //sortorder는 0부터 시작 + }else{ //등록되어 있지 않다면 마지막에 넣음 + int num= (int)professorRepository.count();//마지막 값 가져오기 + return num;//맨 뒤에 놓기 + } + } + } + private void updateSortOrder(int sortOrder){ //sortorder보다 같거나 큰 값을 1올림 + professorRepository.updateSortOrder(sortOrder); + } + } diff --git a/src/main/java/com/hid_web/be/domain/professor/ProfessorWriter.java b/src/main/java/com/hid_web/be/domain/professor/ProfessorWriter.java index 0bf2216..0685f85 100644 --- a/src/main/java/com/hid_web/be/domain/professor/ProfessorWriter.java +++ b/src/main/java/com/hid_web/be/domain/professor/ProfessorWriter.java @@ -1,11 +1,13 @@ package com.hid_web.be.domain.professor; import com.hid_web.be.controller.professor.request.CreateProfessorRequest; +import com.hid_web.be.controller.professor.request.UpdateProfessorRequest; import com.hid_web.be.storage.professor.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Component @@ -13,7 +15,7 @@ public class ProfessorWriter { private final ProfessorRepository professorRepository; - public ProfessorEntity createProfessor(String professorUUID, String imgObjectKey, CreateProfessorRequest request) { + public ProfessorEntity createProfessor(String professorUUID, String imgObjectKey, CreateProfessorRequest request, int sortOrder) { ProfessorEntity professorEntity = new ProfessorEntity(); professorEntity.setUuid(professorUUID); professorEntity.setName(request.getName()); @@ -23,7 +25,7 @@ public ProfessorEntity createProfessor(String professorUUID, String imgObjectKey professorEntity.setEmail(request.getEmail()); professorEntity.setMajor(request.getMajor()); professorEntity.setImgObjectKey(imgObjectKey); - + professorEntity.setSortOrder(sortOrder); // Biography 변환 및 저장 List biographyEntities = request.toBiographyList().stream().map(bio -> { BiographyEntryEntity entity = new BiographyEntryEntity(); @@ -57,4 +59,47 @@ public ProfessorEntity createProfessor(String professorUUID, String imgObjectKey return professorRepository.save(professorEntity); } + public ProfessorEntity updateProfessor(String professorUUID, String imgObjectKey, UpdateProfessorRequest request, int sortOrder) { + ProfessorEntity professorEntity = new ProfessorEntity(); + professorEntity.setUuid(professorUUID); + professorEntity.setName(request.getName()); + professorEntity.setPosition(request.getPosition()); + professorEntity.setDepartment(request.getDepartment()); + professorEntity.setDetailInfo(request.getDetailInfo()); + professorEntity.setEmail(request.getEmail()); + professorEntity.setMajor(request.getMajor()); + professorEntity.setImgObjectKey(imgObjectKey); + professorEntity.setSortOrder(sortOrder); + // Biography 변환 및 저장 + List biographyEntities = request.toBiographyList().stream().map(bio -> { + BiographyEntryEntity entity = new BiographyEntryEntity(); + entity.setProfessor(professorEntity); + entity.setYear(bio.getYear()); + entity.setDescription(bio.getDescription()); + return entity; + }).collect(Collectors.toList()); + professorEntity.setBiographyEntries(biographyEntities); + + // Award 변환 및 저장 + List awardEntities = request.toAwardList().stream().map(award -> { + AwardEntity entity = new AwardEntity(); + entity.setProfessor(professorEntity); + entity.setYear(award.getYear()); + entity.setTitle(award.getTitle()); + return entity; + }).collect(Collectors.toList()); + professorEntity.setAwards(awardEntities); + + // Work 변환 및 저장 + List workEntities = request.toWorkList().stream().map(work -> { + WorkEntity entity = new WorkEntity(); + entity.setProfessor(professorEntity); + entity.setYear(work.getYear()); + entity.setTitle(work.getTitle()); + return entity; + }).collect(Collectors.toList()); + professorEntity.setWorks(workEntities); + + return professorRepository.save(professorEntity); + } } diff --git a/src/main/java/com/hid_web/be/domain/s3/S3Writer.java b/src/main/java/com/hid_web/be/domain/s3/S3Writer.java index e3e1071..d4e8589 100644 --- a/src/main/java/com/hid_web/be/domain/s3/S3Writer.java +++ b/src/main/java/com/hid_web/be/domain/s3/S3Writer.java @@ -15,6 +15,7 @@ @Component @RequiredArgsConstructor public class S3Writer { + private final S3Operations s3Operations; @Value("${spring.cloud.aws.s3.bucket}") diff --git a/src/main/java/com/hid_web/be/storage/professor/ProfessorEntity.java b/src/main/java/com/hid_web/be/storage/professor/ProfessorEntity.java index bf38faa..d87c6cc 100644 --- a/src/main/java/com/hid_web/be/storage/professor/ProfessorEntity.java +++ b/src/main/java/com/hid_web/be/storage/professor/ProfessorEntity.java @@ -4,6 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.GenericGenerator; import java.util.List; @@ -14,6 +15,11 @@ @AllArgsConstructor public class ProfessorEntity { + /* + @GeneratedValue(generator = "uuid") + @GenericGenerator(name= "uuid", strategy = "uuid2") //uuid4 자동 생성 + @Column(columnDefinition = "BINARY(16)") + */ @Id private String uuid; @@ -37,6 +43,9 @@ public class ProfessorEntity { private String imgObjectKey; + @Column + private int sortOrder; //정렬 방식 + // 관계 설정 @OneToMany(mappedBy = "professor", cascade = CascadeType.ALL, orphanRemoval = true) private List biographyEntries; diff --git a/src/main/java/com/hid_web/be/storage/professor/ProfessorRepository.java b/src/main/java/com/hid_web/be/storage/professor/ProfessorRepository.java index debb0ea..eb428c4 100644 --- a/src/main/java/com/hid_web/be/storage/professor/ProfessorRepository.java +++ b/src/main/java/com/hid_web/be/storage/professor/ProfessorRepository.java @@ -1,6 +1,52 @@ package com.hid_web.be.storage.professor; +import jakarta.transaction.Transactional; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +public interface ProfessorRepository extends JpaRepository { + + @Query("SELECT p "+ + "FROM ProfessorEntity p "+ + "WHERE department = :department "+ + "ORDER BY sortOrder ASC") + List getByDepartment(@Param("department") String department); + + @Query("SELECT p "+ + "FROM ProfessorEntity p "+ + "ORDER BY sortOrder ASC") + List getAll(); + + + ProfessorEntity findByUuid(String uuid); + + long count(); + + @Query("SELECT p.sortOrder + 1 "+ + "FROM ProfessorEntity p "+ + "WHERE p.position = :position AND p.name <= :name "+ + "ORDER BY p.sortOrder DESC "+ + "FETCH FIRST 1 ROW ONLY") + Optional getSortOrderByPositionAndName(@Param("position") String position, //값이 삽입될 떄 들어갈 sortorder + @Param("name") String name); + @Query("SELECT MAX(p.sortOrder) " + + "FROM ProfessorEntity p "+ + "WHERE position = :position") + Optional getMaxSortOrderByPositon(@Param("position") String position); + + @Modifying + @Transactional + @Query("UPDATE ProfessorEntity p "+ + "SET p.sortOrder=p.sortOrder + 1 "+ + "WHERE p.sortOrder >= :threshold") + void updateSortOrder(@Param("threshold") int threshold); + //List + -public interface ProfessorRepository extends JpaRepository { }