diff --git a/.env.example b/.env.example index 8ea5aa0..0c54d74 100644 --- a/.env.example +++ b/.env.example @@ -2,13 +2,21 @@ GOOGLE_BASE_URL=string GOOGLE_CLIENT=string GOOGLE_REDIRECT=string GOOGLE_SECRET=string + JWT_SECRET=string + DB_PORT=number DB_NAME=string DB_USERNAME=string DB_PASSWORD=string DB_ROOT_PASSWORD=string +DB_HOST=string + +REDIS_HOST=string +REDIS_PORT=number +REDIS_PASSWORD=string + BUCKET_NAME=string S3_REGION=string S3_ACCESS_KEY=string -S3_SECRET_KEY=string \ No newline at end of file +S3_SECRET_KEY=string diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index e69de29..b2feb90 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +*.* @soolung/backend \ No newline at end of file diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index ce006bd..729a166 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -65,9 +65,13 @@ jobs: echo DB_USERNAME=${{ secrets.DB_USERNAME }} >> .env echo DB_PASSWORD=${{ secrets.DB_PASSWORD }} >> .env echo DB_ROOT_PASSWORD=${{ secrets.DB_ROOT_PASSWORD }} >> .env + echo DB_HOST=${{ secrets.DB_HOST }} >> .env + echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env + echo DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }} >> .env echo DOCKER_REPO=${{ secrets.DOCKER_REPO }} >> .env + echo GOOGLE_BASE_URL=${{ secrets.GOOGLE_BASE_URL }} >> .env echo GOOGLE_CLIENT=${{ secrets.GOOGLE_CLIENT }} >> .env echo GOOGLE_REDIRECT=${{ secrets.GOOGLE_REDIRECT }} >> .env @@ -77,6 +81,10 @@ jobs: echo S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }} >> .env echo S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }} >> .env + echo REDIS_HOST=${{ secrets.REDIS_HOST }} >> .env + echo REDIS_PORT=${{ secrets.REDIS_PORT }} >> .env + echo REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }} >> .env + docker-compose up -d docker image prune -f diff --git a/.github/workflows/dev.cd.yml b/.github/workflows/dev.cd.yml index dccd09f..b5df0b5 100644 --- a/.github/workflows/dev.cd.yml +++ b/.github/workflows/dev.cd.yml @@ -65,9 +65,13 @@ jobs: echo DB_USERNAME=${{ secrets.DB_USERNAME }} >> .env echo DB_PASSWORD=${{ secrets.DB_PASSWORD }} >> .env echo DB_ROOT_PASSWORD=${{ secrets.DB_ROOT_PASSWORD }} >> .env + echo DB_HOST=${{ secrets.DEV_DB_HOST }} >> .env + echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env + echo DOCKER_USERNAME=${{ secrets.DOCKER_USERNAME }} >> .env echo DOCKER_REPO=${{ secrets.DEV_DOCKER_REPO }} >> .env + echo GOOGLE_BASE_URL=${{ secrets.GOOGLE_BASE_URL }} >> .env echo GOOGLE_CLIENT=${{ secrets.GOOGLE_CLIENT }} >> .env echo GOOGLE_REDIRECT=${{ secrets.GOOGLE_REDIRECT_DEV }} >> .env @@ -77,6 +81,10 @@ jobs: echo S3_ACCESS_KEY=${{ secrets.S3_ACCESS_KEY }} >> .env echo S3_SECRET_KEY=${{ secrets.S3_SECRET_KEY }} >> .env + echo REDIS_HOST=${{ secrets.DEV_REDIS_HOST }} >> .env + echo REDIS_PORT=${{ secrets.REDIS_PORT }} >> .env + echo REDIS_PASSWORD=${{ secrets.REDIS_PASSWORD }} >> .env + docker-compose -f docker-compose.dev.yml up -d docker image prune -f diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index a5f04a9..589b112 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -21,12 +21,14 @@ services: - "--collation-server=utf8mb4_unicode_ci" redis: - image: redis:latest + image: redis:7.0-alpine container_name: soolung_simblue_redis hostname: soolung - command: redis-server --port 6379 + command: /bin/sh -c "redis-server --requirepass $$REDIS_PASSWORD" + env_file: + - .env ports: - - "6379:6379" + - ${REDIS_PORT}:6379 application: image: ${DOCKER_USERNAME}/${DOCKER_REPO} diff --git a/docker-compose.local.yml b/docker-compose.local.yml index 203b138..929dc98 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -20,6 +20,8 @@ services: image: redis:latest container_name: soolung_simblue_redis hostname: soolung - command: redis-server --port 6379 + command: /bin/sh -c "redis-server --requirepass soolung" + env_file: + - .env ports: - "6379:6379" \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 34ba1e2..1c82402 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,12 +35,14 @@ services: - "--collation-server=utf8mb4_unicode_ci" simblue-redis: - image: redis:latest + image: redis:7.0-alpine container_name: soolung_simblue_redis hostname: soolung - command: redis-server --port 6379 + command: /bin/sh -c "redis-server --requirepass $$REDIS_PASSWORD" + env_file: + - .env ports: - - "6379:6379" + - ${REDIS_PORT}:6379 simblue-application: image: ${DOCKER_USERNAME}/${DOCKER_REPO} diff --git a/src/main/java/com/soogung/simblue/domain/application/domain/Application.java b/src/main/java/com/soogung/simblue/domain/application/domain/Application.java index 22c067c..1e9ee6e 100644 --- a/src/main/java/com/soogung/simblue/domain/application/domain/Application.java +++ b/src/main/java/com/soogung/simblue/domain/application/domain/Application.java @@ -34,7 +34,7 @@ public class Application extends BaseTimeEntity { @Column(nullable = false, length = 20) private String title; - @Column(nullable = true, length = 200) + @Column(nullable = true, length = 500) private String description; @Column(nullable = true) diff --git a/src/main/java/com/soogung/simblue/domain/application/domain/Reply.java b/src/main/java/com/soogung/simblue/domain/application/domain/Reply.java index 5ba9337..0826498 100644 --- a/src/main/java/com/soogung/simblue/domain/application/domain/Reply.java +++ b/src/main/java/com/soogung/simblue/domain/application/domain/Reply.java @@ -1,5 +1,7 @@ package com.soogung.simblue.domain.application.domain; +import com.soogung.simblue.domain.application.domain.type.QuestionType; +import com.soogung.simblue.domain.user.facade.UserFacade; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -39,4 +41,12 @@ public void putReplyBlock(ReplyBlock replyBlock) { this.replyBlock = replyBlock; replyBlock.getReplies().add(this); } + + public String getAnswer(UserFacade userFacade) { + if (question.getType() == QuestionType.PEOPLE) { + return userFacade.getName(Long.valueOf(answer)); + } + + return answer; + } } diff --git a/src/main/java/com/soogung/simblue/domain/application/domain/repository/ApplicationRepository.java b/src/main/java/com/soogung/simblue/domain/application/domain/repository/ApplicationRepository.java index df6e3cc..4694308 100644 --- a/src/main/java/com/soogung/simblue/domain/application/domain/repository/ApplicationRepository.java +++ b/src/main/java/com/soogung/simblue/domain/application/domain/repository/ApplicationRepository.java @@ -9,6 +9,6 @@ public interface ApplicationRepository extends JpaRepository, ApplicationRepositoryCustom { - @Query("SELECT a FROM Application a WHERE a.state = 'ALWAYS' OR a.state = 'OPENED'") + @Query("SELECT a FROM Application a WHERE a.state = 'ALWAYS' OR a.state = 'OPENED' ORDER BY a.id DESC") List findAllByOrderByIdDesc(Pageable pageable); } diff --git a/src/main/java/com/soogung/simblue/domain/application/domain/type/QuestionType.java b/src/main/java/com/soogung/simblue/domain/application/domain/type/QuestionType.java index 645764f..8e3cb47 100644 --- a/src/main/java/com/soogung/simblue/domain/application/domain/type/QuestionType.java +++ b/src/main/java/com/soogung/simblue/domain/application/domain/type/QuestionType.java @@ -11,6 +11,7 @@ public enum QuestionType { LINK(false), RADIO(true), CHECKBOX(true), + PEOPLE(false), ; private final boolean hasAnswer; diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java b/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java index 4997010..0980373 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/ApplicationController.java @@ -70,7 +70,7 @@ public ApplicationStatusResponse getMyApplication() { } @GetMapping("/{id}/result") - public ResultBlockResponse getApplicationResult(@PathVariable Long id) { + public ApplicationResultResponse getApplicationResult(@PathVariable Long id) { return queryApplicationResultService.execute(id); } diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/request/ApplicationRequest.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/request/ApplicationRequest.java index 4139bf5..a86f862 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/request/ApplicationRequest.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/request/ApplicationRequest.java @@ -23,6 +23,7 @@ public class ApplicationRequest { private String title; @Nullable + @Size(max = 500) private String description; @Nullable diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationDetailResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationDetailResponse.java index 13638d4..2a1ee38 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationDetailResponse.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationDetailResponse.java @@ -8,7 +8,7 @@ import java.time.LocalDate; import java.util.List; -import java.util.concurrent.atomic.AtomicInteger; +import java.util.Objects; import java.util.stream.Collectors; @Getter @@ -44,9 +44,7 @@ public static ApplicationDetailResponse of(Application application, List noticeList, List replyDetailList) { - AtomicInteger index = new AtomicInteger(); - + public static ApplicationDetailResponse of(Application application, List noticeList, List replyList) { return ApplicationDetailResponse.builder() .id(application.getId()) .title(application.getTitle()) @@ -58,7 +56,11 @@ public static ApplicationDetailResponse of(Application application, List QuestionResponse.of(q, replyDetailList.get(index.getAndIncrement()))) + .map((q) -> QuestionResponse.of(q, + replyList.stream().filter(r -> r.getQuestionId() == q.getId()) + .findFirst() + .orElse(null) + )) .collect(Collectors.toList())) .noticeList(noticeList) .build(); diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ResultBlockResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationResultResponse.java similarity index 71% rename from src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ResultBlockResponse.java rename to src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationResultResponse.java index 9c8d511..d13446f 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ResultBlockResponse.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ApplicationResultResponse.java @@ -8,9 +8,9 @@ @Getter @AllArgsConstructor -public class ResultBlockResponse { +public class ApplicationResultResponse { private ApplicationResponse application; private List noticeList; - private List questionList; - private List resultList; + private List questionList; + private List resultList; } diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/QuestionResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/QuestionResponse.java index c4d951d..530707c 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/QuestionResponse.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/QuestionResponse.java @@ -1,12 +1,12 @@ package com.soogung.simblue.domain.application.presentation.dto.response; import com.soogung.simblue.domain.application.domain.Question; -import com.soogung.simblue.domain.application.domain.Reply; import com.soogung.simblue.domain.application.domain.type.QuestionType; import lombok.Builder; import lombok.Getter; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; @Getter @@ -19,7 +19,7 @@ public class QuestionResponse { private Boolean isRequired; private QuestionType type; private List answerList; - private List replyDetailList; + private List replyList; public static QuestionResponse of(Question question) { return QuestionResponse.builder() @@ -36,7 +36,7 @@ public static QuestionResponse of(Question question) { .build(); } - public static QuestionResponse of(Question question, ReplyDetailResponse replyDetail) { + public static QuestionResponse of(Question question, ReplyListResponse replyList) { return QuestionResponse.builder() .id(question.getId()) .question(question.getQuestion()) @@ -48,7 +48,7 @@ public static QuestionResponse of(Question question, ReplyDetailResponse replyDe question.getAnswerList().stream() .map(AnswerResponse::of) .collect(Collectors.toList()) : null) - .replyDetailList(replyDetail.getReplyDetailList()) + .replyList(Objects.nonNull(replyList) ? replyList.getReplyList() : null) .build(); } } diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ResultResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyBlockResponse.java similarity index 76% rename from src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ResultResponse.java rename to src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyBlockResponse.java index 885684e..68e6984 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ResultResponse.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyBlockResponse.java @@ -7,8 +7,8 @@ @Getter @AllArgsConstructor -public class ResultResponse { +public class ReplyBlockResponse { private String name; private String studentNumber; - private List replyList; + private List replyList; } diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyDetailResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyListResponse.java similarity index 65% rename from src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyDetailResponse.java rename to src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyListResponse.java index 1df3754..710298a 100644 --- a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyDetailResponse.java +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyListResponse.java @@ -7,6 +7,8 @@ @Getter @AllArgsConstructor -public class ReplyDetailResponse { - private List replyDetailList; +public class ReplyListResponse { + + private Long questionId; + private List replyList; } diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyResponse.java new file mode 100644 index 0000000..ad6f518 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/ReplyResponse.java @@ -0,0 +1,12 @@ +package com.soogung.simblue.domain.application.presentation.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class ReplyResponse { + + private Long questionId; + private String reply; +} diff --git a/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/SimpleQuestionResponse.java b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/SimpleQuestionResponse.java new file mode 100644 index 0000000..f0f575e --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/application/presentation/dto/response/SimpleQuestionResponse.java @@ -0,0 +1,23 @@ +package com.soogung.simblue.domain.application.presentation.dto.response; + +import com.soogung.simblue.domain.application.domain.Question; +import com.soogung.simblue.domain.application.domain.type.QuestionType; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class SimpleQuestionResponse { + + private Long id; + private String question; + private QuestionType type; + + public static SimpleQuestionResponse of(Question question) { + return SimpleQuestionResponse.builder() + .id(question.getId()) + .question(question.getQuestion()) + .type(question.getType()) + .build(); + } +} diff --git a/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java b/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java index 11faad2..2a7e233 100644 --- a/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java +++ b/src/main/java/com/soogung/simblue/domain/application/service/QueryApplicationResultService.java @@ -1,32 +1,29 @@ package com.soogung.simblue.domain.application.service; import com.soogung.simblue.domain.application.domain.Application; -import com.soogung.simblue.domain.application.domain.Question; import com.soogung.simblue.domain.application.domain.Reply; import com.soogung.simblue.domain.application.domain.ReplyBlock; -import com.soogung.simblue.domain.application.domain.repository.*; +import com.soogung.simblue.domain.application.domain.repository.OwnerRepository; +import com.soogung.simblue.domain.application.domain.repository.QuestionRepository; +import com.soogung.simblue.domain.application.domain.repository.ReplyBlockRepository; import com.soogung.simblue.domain.application.facade.ApplicationFacade; -import com.soogung.simblue.domain.notice.presentation.dto.response.NoticeResponse; -import com.soogung.simblue.domain.application.presentation.dto.response.ApplicationResponse; -import com.soogung.simblue.domain.application.presentation.dto.response.ResultBlockResponse; -import com.soogung.simblue.domain.application.presentation.dto.response.ResultResponse; +import com.soogung.simblue.domain.application.presentation.dto.response.*; import com.soogung.simblue.domain.notice.domain.repository.NoticeRepository; +import com.soogung.simblue.domain.notice.presentation.dto.response.NoticeResponse; import com.soogung.simblue.domain.user.domain.Student; import com.soogung.simblue.domain.user.domain.Teacher; -import com.soogung.simblue.domain.user.exception.AuthorityMismatchException; import com.soogung.simblue.domain.user.facade.UserFacade; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; import java.util.TreeMap; import java.util.stream.Collectors; @Service @RequiredArgsConstructor -@Slf4j public class QueryApplicationResultService { private final UserFacade userFacade; @@ -37,7 +34,7 @@ public class QueryApplicationResultService { private final ReplyBlockRepository replyBlockRepository; @Transactional(readOnly = true) - public ResultBlockResponse execute(Long id) { + public ApplicationResultResponse execute(Long id) { Teacher teacher = userFacade.getCurrentTeacher(); Application application = applicationFacade.findApplicationById(id); application.validateStatus(); @@ -47,17 +44,17 @@ public ResultBlockResponse execute(Long id) { .stream().map(NoticeResponse::of) .collect(Collectors.toList()); - List questionList = questionRepository.findByApplicationIdOrderById(id).stream() - .map(Question::getQuestion) + List questionList = questionRepository.findByApplicationIdOrderById(id).stream() + .map(SimpleQuestionResponse::of) .collect(Collectors.toList()); - List resultList = replyBlockRepository + List resultList = replyBlockRepository .findApplicationResult(id).stream() - .map(this::createUserDetailList) + .map(this::createReplyList) .collect(Collectors.toList()); - return new ResultBlockResponse( + return new ApplicationResultResponse( ApplicationResponse.of(application), noticeList, questionList, @@ -65,25 +62,28 @@ public ResultBlockResponse execute(Long id) { ); } - private ResultResponse createUserDetailList(ReplyBlock block) { + private ReplyBlockResponse createReplyList(ReplyBlock block) { Student student = block.getStudent(); - List answerList = block.getReplies().stream() + List replyList = new ArrayList<>(); + + block.getReplies().stream() .collect(Collectors.groupingBy(r -> r.getQuestion().getId(), TreeMap>::new, Collectors.toList())) - .values().stream() - .map(this::getResult) - .collect(Collectors.toList()); + .forEach((k, v) -> replyList.add(getResult(k, v))); - return new ResultResponse( + return new ReplyBlockResponse( student.getUser().getName(), student.getStudentNumber(), - answerList + replyList ); } - private String getResult(List request) { - return request.stream() - .map(Reply::getAnswer) - .collect(Collectors.joining(", ")); + private ReplyResponse getResult(Long questionId, List request) { + return new ReplyResponse( + questionId, + request.stream() + .map(r -> r.getAnswer(userFacade)) + .collect(Collectors.joining(", ")) + ); } } diff --git a/src/main/java/com/soogung/simblue/domain/application/service/QueryReplyService.java b/src/main/java/com/soogung/simblue/domain/application/service/QueryReplyService.java index 0bf8f34..cb8c235 100644 --- a/src/main/java/com/soogung/simblue/domain/application/service/QueryReplyService.java +++ b/src/main/java/com/soogung/simblue/domain/application/service/QueryReplyService.java @@ -5,7 +5,7 @@ import com.soogung.simblue.domain.application.domain.ReplyBlock; import com.soogung.simblue.domain.application.facade.ReplyBlockFacade; import com.soogung.simblue.domain.application.presentation.dto.response.ApplicationDetailResponse; -import com.soogung.simblue.domain.application.presentation.dto.response.ReplyDetailResponse; +import com.soogung.simblue.domain.application.presentation.dto.response.ReplyListResponse; import com.soogung.simblue.domain.notice.domain.repository.NoticeRepository; import com.soogung.simblue.domain.notice.presentation.dto.response.NoticeResponse; import com.soogung.simblue.domain.user.domain.Student; @@ -14,6 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.ArrayList; import java.util.List; import java.util.TreeMap; import java.util.stream.Collectors; @@ -34,7 +35,7 @@ public ApplicationDetailResponse execute(Long id) { application.validateStatus(); replyBlock.validatePermission(student); - List replyDetailList = createReplyDetailList(replyBlock); + List replyList = createReplyDetailList(replyBlock); List noticeList = noticeRepository.findAllByApplicationIdOrderByIsPinnedDesc(id) .stream().map(NoticeResponse::of).collect(Collectors.toList()); @@ -42,21 +43,26 @@ public ApplicationDetailResponse execute(Long id) { return ApplicationDetailResponse.of( application, noticeList, - replyDetailList + replyList ); } - private List createReplyDetailList(ReplyBlock block) { - return block.getReplies().stream() + private List createReplyDetailList(ReplyBlock block) { + List replyList = new ArrayList<>(); + + block.getReplies().stream() .collect(Collectors.groupingBy(r -> r.getQuestion().getId(), TreeMap>::new, Collectors.toList())) - .values().stream() - .map(r -> new ReplyDetailResponse(getResult(r))) - .collect(Collectors.toList()); + .forEach((k, v) -> replyList.add(getResult(k, v))); + + return replyList; } - private List getResult(List request) { - return request.stream() - .map(Reply::getAnswer) - .collect(Collectors.toList()); + private ReplyListResponse getResult(Long questionId, List request) { + return new ReplyListResponse( + questionId, + request.stream() + .map(r -> r.getAnswer(userFacade)) + .collect(Collectors.toList()) + ); } } diff --git a/src/main/java/com/soogung/simblue/domain/application/service/ReplyApplicationService.java b/src/main/java/com/soogung/simblue/domain/application/service/ReplyApplicationService.java index 99913a1..c3719d3 100644 --- a/src/main/java/com/soogung/simblue/domain/application/service/ReplyApplicationService.java +++ b/src/main/java/com/soogung/simblue/domain/application/service/ReplyApplicationService.java @@ -7,7 +7,6 @@ import com.soogung.simblue.domain.application.domain.repository.ReplyBlockRepository; import com.soogung.simblue.domain.application.domain.repository.ReplyRepository; import com.soogung.simblue.domain.application.exception.AlreadyReplyException; -import com.soogung.simblue.domain.application.exception.QuestionIsRequiredException; import com.soogung.simblue.domain.application.facade.ApplicationFacade; import com.soogung.simblue.domain.application.presentation.dto.request.ReplyBlockRequest; import com.soogung.simblue.domain.application.presentation.dto.request.ReplyRequest; @@ -19,6 +18,7 @@ import java.util.Collection; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; @Service @@ -66,6 +66,7 @@ private List toReplyFrom( q.validateAnswer(r); return r.getReplyDetailList().stream() .map(a -> createReplyFrom(r, block, q, a)) + .filter(Objects::nonNull) .collect(Collectors.toList()); }) .flatMap(Collection::stream) @@ -79,6 +80,11 @@ private Reply createReplyFrom( String answer ) { question.validateAnswer(answer); + + if (Objects.isNull(answer) || answer.equals("")) { + return null; + } + Reply reply = request.toEntity(question, block, answer); reply.putReplyBlock(block); return reply; diff --git a/src/main/java/com/soogung/simblue/domain/auth/service/GoogleAuthService.java b/src/main/java/com/soogung/simblue/domain/auth/service/GoogleAuthService.java index bb3ca3c..4e6879d 100644 --- a/src/main/java/com/soogung/simblue/domain/auth/service/GoogleAuthService.java +++ b/src/main/java/com/soogung/simblue/domain/auth/service/GoogleAuthService.java @@ -14,6 +14,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Objects; import java.util.Optional; @Service @@ -35,6 +36,7 @@ public TokenResponse execute(String code) { Authority authority = validateEmailAndGetAuthority(email); Optional nowUser = userRepository.findByEmail(email); + if (nowUser.isEmpty()) { isLogin = false; diff --git a/src/main/java/com/soogung/simblue/domain/banner/domain/repository/BannerRepository.java b/src/main/java/com/soogung/simblue/domain/banner/domain/repository/BannerRepository.java index 727622d..604cd7e 100644 --- a/src/main/java/com/soogung/simblue/domain/banner/domain/repository/BannerRepository.java +++ b/src/main/java/com/soogung/simblue/domain/banner/domain/repository/BannerRepository.java @@ -19,6 +19,6 @@ public interface BannerRepository extends CrudRepository { @Query("SELECT b FROM Banner b " + "JOIN FETCH b.teacher " + - "WHERE b.id = :id AND b.state = 'ACTIVE' AND b.endDate >= current_date") + "WHERE b.id = :id AND b.state = 'ACTIVE'") Optional findBannerById(Long id); } diff --git a/src/main/java/com/soogung/simblue/domain/group/domain/Member.java b/src/main/java/com/soogung/simblue/domain/group/domain/Member.java index 6eaf863..c125143 100644 --- a/src/main/java/com/soogung/simblue/domain/group/domain/Member.java +++ b/src/main/java/com/soogung/simblue/domain/group/domain/Member.java @@ -33,4 +33,4 @@ public Member(Student student, Group group) { this.student = student; this.group = group; } -} +} \ No newline at end of file diff --git a/src/main/java/com/soogung/simblue/domain/group/domain/repository/GroupRepository.java b/src/main/java/com/soogung/simblue/domain/group/domain/repository/GroupRepository.java index 3203475..1d29d28 100644 --- a/src/main/java/com/soogung/simblue/domain/group/domain/repository/GroupRepository.java +++ b/src/main/java/com/soogung/simblue/domain/group/domain/repository/GroupRepository.java @@ -1,6 +1,7 @@ package com.soogung.simblue.domain.group.domain.repository; import com.soogung.simblue.domain.group.domain.Group; +import com.soogung.simblue.domain.group.domain.Member; import org.springframework.data.repository.CrudRepository; import java.util.List; diff --git a/src/main/java/com/soogung/simblue/domain/group/domain/repository/MemberRepository.java b/src/main/java/com/soogung/simblue/domain/group/domain/repository/MemberRepository.java index baf3023..3f4b447 100644 --- a/src/main/java/com/soogung/simblue/domain/group/domain/repository/MemberRepository.java +++ b/src/main/java/com/soogung/simblue/domain/group/domain/repository/MemberRepository.java @@ -4,4 +4,6 @@ import org.springframework.data.repository.CrudRepository; public interface MemberRepository extends CrudRepository { + + } diff --git a/src/main/java/com/soogung/simblue/domain/group/exception/GroupNotFoundException.java b/src/main/java/com/soogung/simblue/domain/group/exception/GroupNotFoundException.java new file mode 100644 index 0000000..20a0918 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/exception/GroupNotFoundException.java @@ -0,0 +1,12 @@ +package com.soogung.simblue.domain.group.exception; + + +import com.soogung.simblue.domain.group.exception.error.GroupErrorProperty; +import com.soogung.simblue.domain.user.exception.UserNotFoundException; +import com.soogung.simblue.global.error.exception.SimblueException; + +public class GroupNotFoundException extends SimblueException { + + public final static GroupNotFoundException EXCEPTION = new GroupNotFoundException(); + private GroupNotFoundException() { super(GroupErrorProperty.GROUP_NOT_FOUND); } +} diff --git a/src/main/java/com/soogung/simblue/domain/group/exception/error/GroupErrorProperty.java b/src/main/java/com/soogung/simblue/domain/group/exception/error/GroupErrorProperty.java new file mode 100644 index 0000000..8d40cf9 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/exception/error/GroupErrorProperty.java @@ -0,0 +1,15 @@ +package com.soogung.simblue.domain.group.exception.error; + +import com.soogung.simblue.global.error.exception.ErrorProperty; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum GroupErrorProperty implements ErrorProperty { + + GROUP_NOT_FOUND(404, "그룹이 없습니다."); + + private final int status; + private final String message; +} \ No newline at end of file diff --git a/src/main/java/com/soogung/simblue/domain/group/facade/GroupFacade.java b/src/main/java/com/soogung/simblue/domain/group/facade/GroupFacade.java new file mode 100644 index 0000000..f0b4341 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/facade/GroupFacade.java @@ -0,0 +1,23 @@ +package com.soogung.simblue.domain.group.facade; + +import com.soogung.simblue.domain.application.domain.Application; +import com.soogung.simblue.domain.application.exception.ApplicationNotFoundException; +import com.soogung.simblue.domain.group.domain.Group; +import com.soogung.simblue.domain.group.domain.repository.GroupRepository; +import com.soogung.simblue.domain.group.exception.GroupNotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +@Component +@RequiredArgsConstructor +public class GroupFacade { + + private final GroupRepository groupRepository; + + @Transactional(readOnly = true) + public Group findGroup(Long id) { + return groupRepository.findById(id) + .orElseThrow(() -> GroupNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/com/soogung/simblue/domain/group/presentation/MemberController.java b/src/main/java/com/soogung/simblue/domain/group/presentation/MemberController.java new file mode 100644 index 0000000..72cb243 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/presentation/MemberController.java @@ -0,0 +1,21 @@ +package com.soogung.simblue.domain.group.presentation; + +import com.soogung.simblue.domain.group.presentation.dto.request.AddGroupRequest; +import com.soogung.simblue.domain.group.service.AddGroupService; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; + +@RestController +@RequestMapping("/group") +@RequiredArgsConstructor +public class MemberController { + + private final AddGroupService addGroupService; + + @PostMapping("/{id}/add") + public void addMember(@PathVariable Long id,@RequestBody @Valid AddGroupRequest request) { + addGroupService.execute(id, request); + } +} diff --git a/src/main/java/com/soogung/simblue/domain/group/presentation/dto/request/AddGroupRequest.java b/src/main/java/com/soogung/simblue/domain/group/presentation/dto/request/AddGroupRequest.java new file mode 100644 index 0000000..58da09e --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/presentation/dto/request/AddGroupRequest.java @@ -0,0 +1,13 @@ +package com.soogung.simblue.domain.group.presentation.dto.request; + +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor +public class AddGroupRequest { + + private List memberList; +} diff --git a/src/main/java/com/soogung/simblue/domain/group/presentation/dto/request/MemberRequest.java b/src/main/java/com/soogung/simblue/domain/group/presentation/dto/request/MemberRequest.java new file mode 100644 index 0000000..9aae7ff --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/presentation/dto/request/MemberRequest.java @@ -0,0 +1,14 @@ +package com.soogung.simblue.domain.group.presentation.dto.request; + +import com.sun.istack.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class MemberRequest { + + private Long studentId; +} diff --git a/src/main/java/com/soogung/simblue/domain/group/service/AddGroupService.java b/src/main/java/com/soogung/simblue/domain/group/service/AddGroupService.java new file mode 100644 index 0000000..3f4c7c7 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/group/service/AddGroupService.java @@ -0,0 +1,41 @@ +package com.soogung.simblue.domain.group.service; + +import com.soogung.simblue.domain.group.domain.Group; +import com.soogung.simblue.domain.group.domain.Member; +import com.soogung.simblue.domain.group.domain.repository.GroupRepository; +import com.soogung.simblue.domain.group.domain.repository.MemberRepository; +import com.soogung.simblue.domain.group.facade.GroupFacade; +import com.soogung.simblue.domain.group.presentation.dto.request.AddGroupRequest; +import com.soogung.simblue.domain.user.facade.UserFacade; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import javax.transaction.Transactional; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class AddGroupService { + + private final GroupRepository groupRepository; + private final MemberRepository memberRepository; + private final UserFacade userFacade; + private final GroupFacade groupFacade; + + @Transactional + public void execute(Long id, AddGroupRequest request) { + + Group group = groupFacade.findGroup(id); + + memberRepository.saveAll( + request.getMemberList().stream().map( + (member) -> Member.builder() + .student(userFacade.findStudentById(member.getStudentId())) + .group(group) + .build() + ).collect(Collectors.toList()) + ); + + } + +} diff --git a/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepository.java b/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepository.java index fdb210b..89fd719 100644 --- a/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepository.java +++ b/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepository.java @@ -5,7 +5,7 @@ import java.util.Optional; -public interface UserRepository extends JpaRepository { +public interface UserRepository extends JpaRepository, UserRepositoryCustom { Optional findByEmail(String email); boolean existsByEmail(String email); diff --git a/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepositoryCustom.java b/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepositoryCustom.java new file mode 100644 index 0000000..16f3f34 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepositoryCustom.java @@ -0,0 +1,11 @@ +package com.soogung.simblue.domain.user.domain.repository; + +import com.soogung.simblue.domain.user.domain.repository.vo.SearchUserVO; +import com.soogung.simblue.domain.user.domain.type.Authority; + +import java.util.List; + +public interface UserRepositoryCustom { + + List searchUser(String q, Authority authority); +} diff --git a/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepositoryImpl.java b/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepositoryImpl.java new file mode 100644 index 0000000..024a93c --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/user/domain/repository/UserRepositoryImpl.java @@ -0,0 +1,50 @@ +package com.soogung.simblue.domain.user.domain.repository; + +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.soogung.simblue.domain.user.domain.repository.vo.QSearchUserVO; +import com.soogung.simblue.domain.user.domain.repository.vo.SearchUserVO; +import com.soogung.simblue.domain.user.domain.type.Authority; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Objects; + +import static com.soogung.simblue.domain.user.domain.QStudent.*; +import static com.soogung.simblue.domain.user.domain.QUser.user; + +@Repository +@RequiredArgsConstructor +public class UserRepositoryImpl implements UserRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public List searchUser(String q, Authority authority) { + return queryFactory.select(new QSearchUserVO( + user.id, + user.name, + student.studentNumber, + user.authority + )) + .from(user) + .leftJoin(student).on( + user.authority.eq(Authority.ROLE_STUDENT), + user.eq(student.user) + ).fetchJoin() + .where( + user.name.contains(q), + eqAuthority(authority) + ) + .fetch(); + } + + private BooleanExpression eqAuthority(Authority authority) { + if (Objects.isNull(authority)) { + return null; + } + + return user.authority.eq(authority); + } +} diff --git a/src/main/java/com/soogung/simblue/domain/user/domain/repository/vo/SearchUserVO.java b/src/main/java/com/soogung/simblue/domain/user/domain/repository/vo/SearchUserVO.java new file mode 100644 index 0000000..774e306 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/user/domain/repository/vo/SearchUserVO.java @@ -0,0 +1,22 @@ +package com.soogung.simblue.domain.user.domain.repository.vo; + +import com.querydsl.core.annotations.QueryProjection; +import com.soogung.simblue.domain.user.domain.type.Authority; +import lombok.Getter; + +@Getter +public class SearchUserVO { + + private final Long userId; + private final String name; + private final String studentNumber; + private final Authority authority; + + @QueryProjection + public SearchUserVO(Long userId, String name, String studentNumber, Authority authority) { + this.userId = userId; + this.name = name; + this.studentNumber = studentNumber; + this.authority = authority; + } +} \ No newline at end of file diff --git a/src/main/java/com/soogung/simblue/domain/user/facade/UserFacade.java b/src/main/java/com/soogung/simblue/domain/user/facade/UserFacade.java index 70fe8cf..2b7f4d9 100644 --- a/src/main/java/com/soogung/simblue/domain/user/facade/UserFacade.java +++ b/src/main/java/com/soogung/simblue/domain/user/facade/UserFacade.java @@ -6,6 +6,7 @@ import com.soogung.simblue.domain.user.domain.repository.StudentRepository; import com.soogung.simblue.domain.user.domain.repository.TeacherRepository; import com.soogung.simblue.domain.user.domain.repository.UserRepository; +import com.soogung.simblue.domain.user.domain.type.Authority; import com.soogung.simblue.domain.user.exception.AuthorityMismatchException; import com.soogung.simblue.domain.user.exception.UserAlreadyExistsException; import com.soogung.simblue.domain.user.exception.UserNotFoundException; @@ -29,6 +30,12 @@ public User findUserByEmail(String email) { .orElseThrow(() -> UserNotFoundException.EXCEPTION); } + @Transactional(readOnly = true) + public User getUserById(Long id) { + return userRepository.findById(id) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } + @Transactional(readOnly = true) public void validateExistsByEmail(String email) { if (userRepository.existsByEmail(email)) { @@ -72,4 +79,18 @@ public Teacher findTeacherById(Long id) { return teacherRepository.findById(id) .orElseThrow(() -> UserNotFoundException.EXCEPTION); } + + @Transactional(readOnly = true) + public String getName(Long userId) { + User user = getUserById(userId); + if (user.getAuthority() == Authority.ROLE_TEACHER) { + return user.getName() + " 선생님"; + } + return findStudentByUser(user).getStudentNumber() + " " + user.getName(); + } + + public Student findStudentById(Long id) { + return studentRepository.findById(id) + .orElseThrow(() -> UserNotFoundException.EXCEPTION); + } } diff --git a/src/main/java/com/soogung/simblue/domain/user/presentation/TeacherController.java b/src/main/java/com/soogung/simblue/domain/user/presentation/TeacherController.java index f23f28e..75843a7 100644 --- a/src/main/java/com/soogung/simblue/domain/user/presentation/TeacherController.java +++ b/src/main/java/com/soogung/simblue/domain/user/presentation/TeacherController.java @@ -2,30 +2,21 @@ import com.soogung.simblue.domain.user.presentation.dto.request.TeacherRequest; import com.soogung.simblue.domain.user.presentation.dto.request.UpdateTeacherRequest; -import com.soogung.simblue.domain.user.presentation.dto.response.TeacherResponse; import com.soogung.simblue.domain.user.service.JoinTeacherService; -import com.soogung.simblue.domain.user.service.SearchTeacherService; import com.soogung.simblue.domain.user.service.UpdateTeacherService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; -import java.util.List; @RestController @RequestMapping("/user/teacher") @RequiredArgsConstructor public class TeacherController { - private final SearchTeacherService searchTeacherService; private final JoinTeacherService joinTeacherService; private final UpdateTeacherService updateTeacherService; - @GetMapping("/search") - public List searchTeacher(@RequestParam(name = "q") String q) { - return searchTeacherService.execute(q); - } - @PostMapping public void joinTeacher(@RequestBody @Valid TeacherRequest request) { joinTeacherService.execute(request); diff --git a/src/main/java/com/soogung/simblue/domain/user/presentation/UserController.java b/src/main/java/com/soogung/simblue/domain/user/presentation/UserController.java index 6abaafc..68ab4bf 100644 --- a/src/main/java/com/soogung/simblue/domain/user/presentation/UserController.java +++ b/src/main/java/com/soogung/simblue/domain/user/presentation/UserController.java @@ -1,12 +1,18 @@ package com.soogung.simblue.domain.user.presentation; -import com.soogung.simblue.domain.user.presentation.dto.request.*; +import com.soogung.simblue.domain.user.domain.type.Authority; +import com.soogung.simblue.domain.user.presentation.dto.request.UpdatePasswordRequest; +import com.soogung.simblue.domain.user.presentation.dto.response.SearchUserResponse; import com.soogung.simblue.domain.user.presentation.dto.response.UserResponse; -import com.soogung.simblue.domain.user.service.*; +import com.soogung.simblue.domain.user.service.DeleteUserService; +import com.soogung.simblue.domain.user.service.QueryCurrentUserService; +import com.soogung.simblue.domain.user.service.SearchUserService; +import com.soogung.simblue.domain.user.service.UpdatePasswordService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; import javax.validation.Valid; +import java.util.List; @RestController @RequestMapping("/user") @@ -14,6 +20,7 @@ public class UserController { private final QueryCurrentUserService queryCurrentUserService; + private final SearchUserService searchUserService; private final UpdatePasswordService updatePasswordService; private final DeleteUserService deleteUserService; @@ -22,6 +29,14 @@ public UserResponse getUser() { return queryCurrentUserService.execute(); } + @GetMapping("/search") + public List searchTeacher( + @RequestParam(name = "q") String q, + @RequestParam(name = "authority", required = false) Authority authority + ) { + return searchUserService.execute(q, authority); + } + @PatchMapping("/password") public void updatePassword(@RequestBody @Valid UpdatePasswordRequest request) { updatePasswordService.execute(request); diff --git a/src/main/java/com/soogung/simblue/domain/user/presentation/dto/response/SearchUserResponse.java b/src/main/java/com/soogung/simblue/domain/user/presentation/dto/response/SearchUserResponse.java new file mode 100644 index 0000000..1d869bc --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/user/presentation/dto/response/SearchUserResponse.java @@ -0,0 +1,25 @@ +package com.soogung.simblue.domain.user.presentation.dto.response; + +import com.soogung.simblue.domain.user.domain.repository.vo.SearchUserVO; +import com.soogung.simblue.domain.user.domain.type.Authority; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class SearchUserResponse { + + private Long userId; + private String name; + private String studentNumber; + private Authority authority; + + public static SearchUserResponse of(SearchUserVO vo) { + return SearchUserResponse.builder() + .userId(vo.getUserId()) + .name(vo.getName()) + .studentNumber(vo.getStudentNumber()) + .authority(vo.getAuthority()) + .build(); + } +} diff --git a/src/main/java/com/soogung/simblue/domain/user/presentation/dto/response/TeacherResponse.java b/src/main/java/com/soogung/simblue/domain/user/presentation/dto/response/TeacherResponse.java deleted file mode 100644 index 48b3ec9..0000000 --- a/src/main/java/com/soogung/simblue/domain/user/presentation/dto/response/TeacherResponse.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.soogung.simblue.domain.user.presentation.dto.response; - -import com.soogung.simblue.domain.user.domain.Teacher; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class TeacherResponse { - - private Long teacherId; - private String name; - - public static TeacherResponse of(Teacher teacher) { - return TeacherResponse.builder() - .teacherId(teacher.getId()) - .name(teacher.getUser().getName()) - .build(); - } -} diff --git a/src/main/java/com/soogung/simblue/domain/user/service/QueryCurrentUserService.java b/src/main/java/com/soogung/simblue/domain/user/service/QueryCurrentUserService.java index c007c36..3fa2950 100644 --- a/src/main/java/com/soogung/simblue/domain/user/service/QueryCurrentUserService.java +++ b/src/main/java/com/soogung/simblue/domain/user/service/QueryCurrentUserService.java @@ -1,7 +1,6 @@ package com.soogung.simblue.domain.user.service; import com.soogung.simblue.domain.user.domain.User; -import com.soogung.simblue.domain.user.domain.repository.UserRepository; import com.soogung.simblue.domain.user.domain.type.Authority; import com.soogung.simblue.domain.user.facade.UserFacade; import com.soogung.simblue.domain.user.presentation.dto.response.UserResponse; @@ -9,12 +8,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.util.Objects; + @Service @RequiredArgsConstructor public class QueryCurrentUserService { private final UserFacade userFacade; - private final UserRepository userRepository; @Transactional(readOnly = true) public UserResponse execute() { @@ -29,10 +29,12 @@ public UserResponse execute() { } private Long getRoleId(User user) { - if (user.getAuthority() == Authority.ROLE_STUDENT) { - return userFacade.findStudentByUser(user).getId(); - } else if (user.getAuthority() == Authority.ROLE_TEACHER) { - return userFacade.findTeacherByUser(user).getId(); + if (Objects.nonNull(user.getName()) && user.getName().equals("")) { + if (user.getAuthority() == Authority.ROLE_STUDENT) { + return userFacade.findStudentByUser(user).getId(); + } else if (user.getAuthority() == Authority.ROLE_TEACHER) { + return userFacade.findTeacherByUser(user).getId(); + } } return null; diff --git a/src/main/java/com/soogung/simblue/domain/user/service/SearchTeacherService.java b/src/main/java/com/soogung/simblue/domain/user/service/SearchTeacherService.java deleted file mode 100644 index fbaf059..0000000 --- a/src/main/java/com/soogung/simblue/domain/user/service/SearchTeacherService.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.soogung.simblue.domain.user.service; - -import com.soogung.simblue.domain.user.domain.repository.TeacherRepository; -import com.soogung.simblue.domain.user.presentation.dto.response.TeacherResponse; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class SearchTeacherService { - - private final TeacherRepository teacherRepository; - - public List execute(String q) { - return teacherRepository.searchTeacherByName(q) - .stream().map(TeacherResponse::of) - .collect(Collectors.toList()); - } -} diff --git a/src/main/java/com/soogung/simblue/domain/user/service/SearchUserService.java b/src/main/java/com/soogung/simblue/domain/user/service/SearchUserService.java new file mode 100644 index 0000000..f626d40 --- /dev/null +++ b/src/main/java/com/soogung/simblue/domain/user/service/SearchUserService.java @@ -0,0 +1,24 @@ +package com.soogung.simblue.domain.user.service; + +import com.soogung.simblue.domain.user.domain.repository.UserRepository; +import com.soogung.simblue.domain.user.domain.type.Authority; +import com.soogung.simblue.domain.user.facade.UserFacade; +import com.soogung.simblue.domain.user.presentation.dto.response.SearchUserResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class SearchUserService { + + private final UserRepository userRepository; + + public List execute(String q, Authority authority) { + return userRepository.searchUser(q, authority) + .stream().map(SearchUserResponse::of) + .collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/soogung/simblue/global/config/RedisConfig.java b/src/main/java/com/soogung/simblue/global/config/RedisConfig.java index 7ee66e7..9d9cadc 100644 --- a/src/main/java/com/soogung/simblue/global/config/RedisConfig.java +++ b/src/main/java/com/soogung/simblue/global/config/RedisConfig.java @@ -4,6 +4,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.repository.configuration.EnableRedisRepositories; @@ -19,9 +20,16 @@ public class RedisConfig { @Value("${spring.redis.port}") private int port; + @Value("${spring.redis.password}") + private String password; + @Bean public RedisConnectionFactory redisConnectionFactory() { - return new LettuceConnectionFactory(host, port); + RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); + redisStandaloneConfiguration.setHostName(host); + redisStandaloneConfiguration.setPort(port); + redisStandaloneConfiguration.setPassword(password); + return new LettuceConnectionFactory(redisStandaloneConfiguration); } @Bean diff --git a/src/main/java/com/soogung/simblue/global/security/SecurityConfig.java b/src/main/java/com/soogung/simblue/global/security/SecurityConfig.java index 2605746..7e0de0d 100644 --- a/src/main/java/com/soogung/simblue/global/security/SecurityConfig.java +++ b/src/main/java/com/soogung/simblue/global/security/SecurityConfig.java @@ -60,6 +60,7 @@ public SecurityFilterChain configure(HttpSecurity http) throws Exception { .antMatchers(HttpMethod.GET, "/application/{\\d+}/form").hasRole(Authority.ROLE_TEACHER.getRole()) .antMatchers(HttpMethod.GET, "/application/{\\d+}/result").hasRole(Authority.ROLE_TEACHER.getRole()) .antMatchers(HttpMethod.POST, "/application").hasRole(Authority.ROLE_TEACHER.getRole()) + .antMatchers(HttpMethod.POST, "/group/{\\d+}/add").hasRole(Authority.ROLE_TEACHER.getRole()) .antMatchers(HttpMethod.GET, "/application/**").permitAll() .antMatchers(HttpMethod.GET, "/banner").permitAll() .anyRequest().authenticated() diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index fa6e64e..1ee00f2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -18,6 +18,17 @@ spring: hibernate: ddl-auto: update + datasource: + url: jdbc:mysql://${DB_HOST}:${DB_PORT}/${DB_NAME} + driver-class-name: com.mysql.cj.jdbc.Driver + username: ${DB_USERNAME} + password: ${DB_PASSWORD} + + redis: + host: ${REDIS_HOST} + port: 6379 + password: ${REDIS_PASSWORD} + cache: type: redis @@ -55,55 +66,35 @@ cloud: spring: config: activate: - on-profile: local - - datasource: - url: jdbc:mysql://127.0.0.1:3307/soolung_simblue - driver-class-name: com.mysql.cj.jdbc.Driver - username: soolung - password: soolung - - redis: - host: localhost - port: 6379 - -server: - port: 9090 + on-profile: dev debug: true --- spring: config: activate: - on-profile: dev - - datasource: - url: jdbc:mysql://mysql:${DB_PORT}/${DB_NAME} - driver-class-name: com.mysql.cj.jdbc.Driver - username: ${DB_USERNAME} - password: ${DB_PASSWORD} - - redis: - host: redis - port: 6379 + on-profile: prod -debug: true + jpa: + hibernate: + ddl-auto: validate --- spring: config: activate: - on-profile: prod + on-profile: local datasource: - url: jdbc:mysql://simblue-database:${DB_PORT}/${DB_NAME} + url: jdbc:mysql://127.0.0.1:3307/soolung_simblue driver-class-name: com.mysql.cj.jdbc.Driver - username: ${DB_USERNAME} - password: ${DB_PASSWORD} + username: soolung + password: soolung redis: - host: simblue-redis - port: 6379 + host: localhost + password: soolung - jpa: - hibernate: - ddl-auto: validate \ No newline at end of file +server: + port: 9090 + +debug: true \ No newline at end of file