diff --git a/README.md b/README.md index b34f5858..0d412b5e 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,29 @@ # Potato Backend -![Generic badge](https://img.shields.io/badge/version-0.3.1-orange.svg) +![Generic badge](https://img.shields.io/badge/version-0.3.2-orange.svg) [![codecov](https://codecov.io/gh/steamed-potatoes/potato-backend/branch/develop/graph/badge.svg?token=ACoWRzqGBl)](https://codecov.io/gh/steamed-potatoes/potato-backend) +## Test Server +- 기능 테스트는 이곳에서 하실 수 있습니다. (실제 UI와 관련 X) + +https://potato-front.netlify.app/ + +## Introduction +### 동아리의 다양한 일정들을 한 곳에서 관리하는 웹 서비스 +동아리와 관련된 신입 모집, 행사, 이벤트 등을 한 곳에서 관리하고 볼 수 있는 웹 서비스. +### 동아리 운영진은요...! +- 새로운 동아리를 등록하고, 관리할 수 있어요. +- 동아리에서 신규 모집, 행사, 이벤트 등 홍보를 언제든 할 수 있어요. +- 동아리원들의 가입 신청을 받고, 동아리원들을 관리할 수 있어요. + +### 동아리에 들어가고 싶은 학우들은요...! +- 인기 있는 동아리는 무엇인지, 어떤 동아리들이 있는지 한눈에 확인할 수 있어요. +- 더이상 여러 곳에서 신규 모집 등 이정을 일일이 확인할 필요 없이 동아리에서 업로드한 홍보글들을 한 곳에서 확인할 수 있어요! +- 누구든지 해당 게시글에서 댓글을 통해 커뮤니케이션 할 수 있어요. +- 내가 참여하고 있는 동아리의 일정, 행사 등을 한곳에서 확인할 수 있어요. +- 내가 관심있어하는 동아리를 팔로우해두고, 신입 모집 게시글이 올라오면 쉽게 확인할 수 있어요. + + --- ## Development Server @@ -32,11 +53,13 @@ ### Infra (Development Server) - AWS EC2 - AWS RDS (MariaDB 10.4), flyway 6.4 +- Redis (Session) - Docker-compose - Nginx ### Infra (Local) -- H2 InMemory DB +- H2 Inmemory DB +- Redis Embedded DB (Session) ### CI/CD - GitHub Action CI/CD diff --git a/deploy/docker-compose.blue.yml b/deploy/docker-compose.blue.yml index f743db8c..df0d8c17 100644 --- a/deploy/docker-compose.blue.yml +++ b/deploy/docker-compose.blue.yml @@ -6,6 +6,8 @@ services: - 8081:8080 environment: - "SPRING_PROFILES_ACTIVE=dev" + volumes: + - ~/logs/api:/logs/api links: - "db:redis" admin: @@ -14,6 +16,8 @@ services: - 9001:9000 environment: - "SPRING_PROFILES_ACTIVE=dev" + volumes: + - ~/logs/admin:/logs/admin links: - "db:redis" db: diff --git a/deploy/docker-compose.green.yml b/deploy/docker-compose.green.yml index 8da545b4..2359e6f1 100644 --- a/deploy/docker-compose.green.yml +++ b/deploy/docker-compose.green.yml @@ -6,6 +6,8 @@ services: - 8082:8080 environment: - "SPRING_PROFILES_ACTIVE=dev" + volumes: + - ~/logs/api:/logs/api links: - "db:redis" admin: @@ -14,6 +16,8 @@ services: - 9002:9000 environment: - "SPRING_PROFILES_ACTIVE=dev" + volumes: + - ~/logs/admin:/logs/admin links: - "db:redis" db: diff --git a/deploy/run.sh b/deploy/run.sh index 4d757bb4..434415e0 100644 --- a/deploy/run.sh +++ b/deploy/run.sh @@ -10,16 +10,43 @@ if [ -z "$EXIST_BLUE" ]; then echo "Blue Up" docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml up -d --build - sleep 60 - - echo "Green Down" - docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down + i=0 + while [ $i -le 30 ] + do + STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8081/ping) + if [ $STATUS -eq 200 ]; then + echo "Server is Running.....!" + + docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml down + echo "Green Down" + + break + else + echo "Waiting........." + sleep 10 + i=$(($i+1)) + fi + done else echo "Green Up" docker-compose -p ${DOCKER_APP_NAME}-green -f docker-compose.green.yml up -d --build - sleep 60 - - echo "Blue Down" - docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down + i=0 + while [ $i -le 30 ] + do + STATUS=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8082/ping) + if [ $STATUS -eq 200 ]; then + echo "Server is Running.....!" + + docker-compose -p ${DOCKER_APP_NAME}-blue -f docker-compose.blue.yml down + echo "Blue Down" + + break + else + echo "Waiting........." + sleep 10 + i=$(($i+1)) + fi + done fi + diff --git a/potato-admin/http/board/adminBoard.http b/potato-admin/http/board/adminBoard.http index 09e32ff6..8e266583 100644 --- a/potato-admin/http/board/adminBoard.http +++ b/potato-admin/http/board/adminBoard.http @@ -22,8 +22,3 @@ Authorization: Bearer {{AUTHORIZATION}} "startDateTime": "2021-03-01T00:00:00", "endDateTime": "2021-03-08T11:59:59" } - -### 관리자가 게시글 삭제 -DELETE {{host_admin}}/admin/v1/board/admin/1 -Content-Type: application/json -Authorization: Bearer {{AUTHORIZATION}} diff --git a/potato-admin/http/organization/organization.http b/potato-admin/http/organization/organization.http index cbbc4ad1..fa7f38bf 100644 --- a/potato-admin/http/organization/organization.http +++ b/potato-admin/http/organization/organization.http @@ -2,7 +2,7 @@ GET {{host_admin}}/admin/v1/organization/list Authorization: Bearer {{AUTHORIZATION}} ### 비인준_동아리를_인준동아리로(현재 category 넘겨주기) -PATCH {{host_admin}}/admin/v1/organization/potato/category +PUT {{host_admin}}/admin/v1/organization/potato/category Content-Type: application/json Authorization: Bearer {{AUTHORIZATION}} diff --git a/potato-admin/src/main/java/com/potato/config/WebConfig.java b/potato-admin/src/main/java/com/potato/config/WebConfig.java index ff64d2d1..cec27411 100644 --- a/potato-admin/src/main/java/com/potato/config/WebConfig.java +++ b/potato-admin/src/main/java/com/potato/config/WebConfig.java @@ -1,7 +1,7 @@ package com.potato.config; import com.potato.config.interceptor.AuthInterceptor; -import com.potato.config.resolver.MemberIdResolver; +import com.potato.config.resolver.AdminIdResolver; import lombok.RequiredArgsConstructor; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; @@ -16,7 +16,7 @@ public class WebConfig implements WebMvcConfigurer { private final AuthInterceptor authInterceptor; - private final MemberIdResolver memberIdResolver; + private final AdminIdResolver adminIdResolver; @Override public void addCorsMappings(CorsRegistry registry) { @@ -34,7 +34,7 @@ public void addInterceptors(InterceptorRegistry registry) { @Override public void addArgumentResolvers(List resolvers) { - resolvers.add(memberIdResolver); + resolvers.add(adminIdResolver); } } diff --git a/potato-admin/src/main/java/com/potato/config/interceptor/AuthAdminComponent.java b/potato-admin/src/main/java/com/potato/config/interceptor/AuthAdminComponent.java index bcae1599..0630e9d4 100644 --- a/potato-admin/src/main/java/com/potato/config/interceptor/AuthAdminComponent.java +++ b/potato-admin/src/main/java/com/potato/config/interceptor/AuthAdminComponent.java @@ -1,6 +1,6 @@ package com.potato.config.interceptor; -import com.potato.config.session.AdminMemberSession; +import com.potato.config.session.AdminSession; import com.potato.config.session.SessionConstants; import com.potato.domain.administrator.AdministratorRepository; import com.potato.exception.model.UnAuthorizedException; @@ -23,12 +23,12 @@ public class AuthAdminComponent { private final AdministratorRepository administratorRepository; public Long getAdminMemberId(HttpServletRequest request) { - Long memberId = getAdminMemberSession(request).getMemberId(); + Long memberId = getAdminMemberSession(request).getAdminId(); AdminAuthServiceUtils.validateExistAdminMember(administratorRepository, memberId); return memberId; } - private AdminMemberSession getAdminMemberSession(HttpServletRequest request) { + private AdminSession getAdminMemberSession(HttpServletRequest request) { String header = request.getHeader(HttpHeaders.AUTHORIZATION); Session session = extractSessionFromHeader(header); return session.getAttribute(SessionConstants.AUTH_SESSION); diff --git a/potato-admin/src/main/java/com/potato/config/resolver/MemberId.java b/potato-admin/src/main/java/com/potato/config/resolver/AdminId.java similarity index 90% rename from potato-admin/src/main/java/com/potato/config/resolver/MemberId.java rename to potato-admin/src/main/java/com/potato/config/resolver/AdminId.java index 31655358..6ad5d5a9 100644 --- a/potato-admin/src/main/java/com/potato/config/resolver/MemberId.java +++ b/potato-admin/src/main/java/com/potato/config/resolver/AdminId.java @@ -7,5 +7,5 @@ @Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) -public @interface MemberId { +public @interface AdminId { } diff --git a/potato-admin/src/main/java/com/potato/config/resolver/MemberIdResolver.java b/potato-admin/src/main/java/com/potato/config/resolver/AdminIdResolver.java similarity index 92% rename from potato-admin/src/main/java/com/potato/config/resolver/MemberIdResolver.java rename to potato-admin/src/main/java/com/potato/config/resolver/AdminIdResolver.java index b49fa5e5..891cb241 100644 --- a/potato-admin/src/main/java/com/potato/config/resolver/MemberIdResolver.java +++ b/potato-admin/src/main/java/com/potato/config/resolver/AdminIdResolver.java @@ -9,11 +9,11 @@ import org.springframework.web.method.support.ModelAndViewContainer; @Component -public class MemberIdResolver implements HandlerMethodArgumentResolver { +public class AdminIdResolver implements HandlerMethodArgumentResolver { @Override public boolean supportsParameter(MethodParameter parameter) { - boolean hasAnnotation = parameter.getParameterAnnotation(MemberId.class) != null; + boolean hasAnnotation = parameter.getParameterAnnotation(AdminId.class) != null; boolean isMatchType = parameter.getParameterType().equals(Long.class); if (hasAnnotation && parameter.getMethodAnnotation(Auth.class) == null) { throw new IllegalArgumentException("인증이 필요한 컨트롤러 입니다. Auth 어노테이션을 붙여주세요."); diff --git a/potato-admin/src/main/java/com/potato/config/session/AdminMemberSession.java b/potato-admin/src/main/java/com/potato/config/session/AdminSession.java similarity index 53% rename from potato-admin/src/main/java/com/potato/config/session/AdminMemberSession.java rename to potato-admin/src/main/java/com/potato/config/session/AdminSession.java index a96de6c9..8762e931 100644 --- a/potato-admin/src/main/java/com/potato/config/session/AdminMemberSession.java +++ b/potato-admin/src/main/java/com/potato/config/session/AdminSession.java @@ -8,12 +8,12 @@ @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) -public class AdminMemberSession implements Serializable { +public class AdminSession implements Serializable { - private final Long memberId; + private final Long adminId; - public static AdminMemberSession of(Long memberId) { - return new AdminMemberSession(memberId); + public static AdminSession of(Long memberId) { + return new AdminSession(memberId); } } diff --git a/potato-admin/src/main/java/com/potato/config/session/RedisSessionConfig.java b/potato-admin/src/main/java/com/potato/config/session/RedisSessionConfig.java index 12dfdc81..47ff1605 100644 --- a/potato-admin/src/main/java/com/potato/config/session/RedisSessionConfig.java +++ b/potato-admin/src/main/java/com/potato/config/session/RedisSessionConfig.java @@ -12,7 +12,7 @@ @Profile("!local") @RequiredArgsConstructor @Configuration -@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 60 * 24 * 30) +@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 60 * 60 * 24) // 1일 public class RedisSessionConfig { private final RedisProperties redisProperties; diff --git a/potato-admin/src/main/java/com/potato/controller/LocalController.java b/potato-admin/src/main/java/com/potato/controller/LocalController.java index 352ef6cb..32ad4c00 100644 --- a/potato-admin/src/main/java/com/potato/controller/LocalController.java +++ b/potato-admin/src/main/java/com/potato/controller/LocalController.java @@ -1,6 +1,6 @@ package com.potato.controller; -import com.potato.config.session.AdminMemberSession; +import com.potato.config.session.AdminSession; import com.potato.domain.administrator.Administrator; import com.potato.domain.administrator.AdministratorCreator; import com.potato.domain.administrator.AdministratorRepository; @@ -24,7 +24,7 @@ public class LocalController { @GetMapping("/test-session") public ApiResponse getSession() { Administrator administrator = administratorRepository.save(AdministratorCreator.create("admin.test@gmail.com", "테스트 관리자")); - httpSession.setAttribute(AUTH_SESSION, AdminMemberSession.of(administrator.getId())); + httpSession.setAttribute(AUTH_SESSION, AdminSession.of(administrator.getId())); return ApiResponse.success(httpSession.getId()); } diff --git a/potato-admin/src/main/java/com/potato/controller/board/AdminBoardController.java b/potato-admin/src/main/java/com/potato/controller/board/AdminBoardController.java index e1bd8c74..abdc4a2a 100644 --- a/potato-admin/src/main/java/com/potato/controller/board/AdminBoardController.java +++ b/potato-admin/src/main/java/com/potato/controller/board/AdminBoardController.java @@ -1,7 +1,7 @@ package com.potato.controller.board; import com.potato.config.interceptor.Auth; -import com.potato.config.resolver.MemberId; +import com.potato.config.resolver.AdminId; import com.potato.controller.ApiResponse; import com.potato.service.board.AdminBoardService; import com.potato.service.board.dto.request.CreateAdminBoardRequest; @@ -21,27 +21,20 @@ public class AdminBoardController { @Auth @PostMapping("/admin/v1/board/admin") - public ApiResponse createAdminBoard(@Valid @RequestBody CreateAdminBoardRequest request, @MemberId Long adminMemberId) { + public ApiResponse createAdminBoard(@Valid @RequestBody CreateAdminBoardRequest request, @AdminId Long adminMemberId) { return ApiResponse.success(adminBoardService.createAdminBoard(request, adminMemberId)); } @Auth @PutMapping("/admin/v1/board/admin") public ApiResponse updateAdminBoard(@Valid @RequestBody UpdateAdminBoardRequest request) { - return ApiResponse.success(adminBoardService.updateAdminBoard(request)); - } - - @Auth - @DeleteMapping("/admin/v1/board/admin/{adminBoardId}") - public ApiResponse deleteAdminBoard(@PathVariable Long adminBoardId, @MemberId Long adminMemberId) { - adminBoardService.deleteAdminBoard(adminBoardId, adminMemberId); - return ApiResponse.OK; + return ApiResponse.success(adminBoardService.updateAdminBoard(request)); } @Auth @DeleteMapping("/admin/v1/board/organization/{subDomain}") - public ApiResponse deleteOrganizationBoard(@PathVariable String subDomain, @MemberId Long adminMemberId, DeleteOrganizationBoardRequest request) { - adminBoardService.deleteOrganizationBoard(subDomain, adminMemberId, request.getOrganizationBoardId()); + public ApiResponse deleteOrganizationBoard(@PathVariable String subDomain, @Valid DeleteOrganizationBoardRequest request, @AdminId Long adminMemberId) { + adminBoardService.deleteOrganizationBoard(subDomain, request.getOrganizationBoardId(), adminMemberId); return ApiResponse.OK; } diff --git a/potato-admin/src/main/java/com/potato/service/auth/AdminAuthService.java b/potato-admin/src/main/java/com/potato/service/auth/AdminAuthService.java index 11f824e7..4d3cf655 100644 --- a/potato-admin/src/main/java/com/potato/service/auth/AdminAuthService.java +++ b/potato-admin/src/main/java/com/potato/service/auth/AdminAuthService.java @@ -6,7 +6,7 @@ import com.potato.external.google.dto.response.GoogleAccessTokenResponse; import com.potato.external.google.dto.response.GoogleUserInfoResponse; import com.potato.service.auth.dto.request.GoogleAuthRequest; -import com.potato.config.session.AdminMemberSession; +import com.potato.config.session.AdminSession; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -28,7 +28,7 @@ public String handleGoogleAuthentication(GoogleAuthRequest request) { Administrator administrator = AdminAuthServiceUtils.findAdminMemberByEmail(administratorRepository, googleAdminProfileInfo.getEmail()); - httpSession.setAttribute(AUTH_SESSION, AdminMemberSession.of(administrator.getId())); + httpSession.setAttribute(AUTH_SESSION, AdminSession.of(administrator.getId())); return httpSession.getId(); } diff --git a/potato-admin/src/main/java/com/potato/service/auth/dto/request/GoogleAuthRequest.java b/potato-admin/src/main/java/com/potato/service/auth/dto/request/GoogleAuthRequest.java index 4b207907..e620648c 100644 --- a/potato-admin/src/main/java/com/potato/service/auth/dto/request/GoogleAuthRequest.java +++ b/potato-admin/src/main/java/com/potato/service/auth/dto/request/GoogleAuthRequest.java @@ -1,12 +1,12 @@ package com.potato.service.auth.dto.request; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import javax.validation.constraints.NotBlank; +@ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class GoogleAuthRequest { @@ -16,11 +16,6 @@ public class GoogleAuthRequest { @NotBlank private String redirectUri; - private GoogleAuthRequest(@NotBlank String code, @NotBlank String redirectUri) { - this.code = code; - this.redirectUri = redirectUri; - } - public static GoogleAuthRequest testInstance(String code, String redirectUri) { return new GoogleAuthRequest(code, redirectUri); } diff --git a/potato-admin/src/main/java/com/potato/service/board/AdminBoardService.java b/potato-admin/src/main/java/com/potato/service/board/AdminBoardService.java index 4e60210f..4f7224ca 100644 --- a/potato-admin/src/main/java/com/potato/service/board/AdminBoardService.java +++ b/potato-admin/src/main/java/com/potato/service/board/AdminBoardService.java @@ -2,7 +2,6 @@ import com.potato.domain.board.admin.AdminBoard; import com.potato.domain.board.admin.AdminBoardRepository; -import com.potato.domain.board.admin.DeleteAdminBoardRepository; import com.potato.domain.board.organization.DeleteOrganizationBoardRepository; import com.potato.domain.board.organization.OrganizationBoard; import com.potato.domain.board.organization.OrganizationBoardRepository; @@ -19,8 +18,6 @@ public class AdminBoardService { private final AdminBoardRepository adminBoardRepository; - private final DeleteAdminBoardRepository deleteAdminBoardRepository; - private final OrganizationBoardRepository organizationBoardRepository; private final DeleteOrganizationBoardRepository deleteOrganizationBoardRepository; @@ -33,21 +30,15 @@ public AdminBoardInfoResponse createAdminBoard(CreateAdminBoardRequest request, @Transactional public AdminBoardInfoResponse updateAdminBoard(UpdateAdminBoardRequest request) { AdminBoard adminBoard = AdminBoardServiceUtils.findAdminBoardById(adminBoardRepository, request.getAdminBoardId()); - adminBoard.updateInfo(request.getTitle(), request.getContent(), request.getStartDateTime(), request.getEndDateTime()); + adminBoard.updateInfo(request.getTitle(), request.getContent(), request.getImageUrl(), request.getStartDateTime(), request.getEndDateTime()); return AdminBoardInfoResponse.of(adminBoard); } @Transactional - public void deleteAdminBoard(Long adminBoardId, Long adminMemberId) { - AdminBoard adminBoard = AdminBoardServiceUtils.findAdminBoardById(adminBoardRepository, adminBoardId); - deleteAdminBoardRepository.save(adminBoard.delete(adminMemberId)); - adminBoardRepository.delete(adminBoard); - } - - @Transactional - public void deleteOrganizationBoard(String subDomain, Long adminMemberId, Long organizationBoardId) { + public void deleteOrganizationBoard(String subDomain, Long organizationBoardId, Long adminMemberId) { OrganizationBoard organizationBoard = OrganizationBoardServiceUtils.findOrganizationBoardBySubDomainAndId(organizationBoardRepository, subDomain, organizationBoardId); deleteOrganizationBoardRepository.save(organizationBoard.deleteByAdmin(adminMemberId)); organizationBoardRepository.delete(organizationBoard); } + } diff --git a/potato-admin/src/main/java/com/potato/service/board/dto/request/CreateAdminBoardRequest.java b/potato-admin/src/main/java/com/potato/service/board/dto/request/CreateAdminBoardRequest.java index d7b97fcb..366ff857 100644 --- a/potato-admin/src/main/java/com/potato/service/board/dto/request/CreateAdminBoardRequest.java +++ b/potato-admin/src/main/java/com/potato/service/board/dto/request/CreateAdminBoardRequest.java @@ -18,6 +18,8 @@ public class CreateAdminBoardRequest { private String content; + private String imageUrl; + @NotNull @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime startDateTime; @@ -27,9 +29,10 @@ public class CreateAdminBoardRequest { private LocalDateTime endDateTime; @Builder(builderMethodName = "testBuilder") - public CreateAdminBoardRequest(@NotBlank String title, @NotBlank String content, @NotBlank LocalDateTime startDateTime, @NotBlank LocalDateTime endDateTime) { + public CreateAdminBoardRequest(@NotBlank String title, @NotBlank String content, String imageUrl, @NotBlank LocalDateTime startDateTime, @NotBlank LocalDateTime endDateTime) { this.title = title; this.content = content; + this.imageUrl = imageUrl; this.startDateTime = startDateTime; this.endDateTime = endDateTime; } @@ -39,6 +42,7 @@ public AdminBoard toEntity(Long administratorId) { .administratorId(administratorId) .title(title) .content(content) + .imageUrl(imageUrl) .startDateTime(startDateTime) .endDateTime(endDateTime) .build(); diff --git a/potato-admin/src/main/java/com/potato/service/board/dto/request/DeleteOrganizationBoardRequest.java b/potato-admin/src/main/java/com/potato/service/board/dto/request/DeleteOrganizationBoardRequest.java index 73d4ead6..c0ab9f4e 100644 --- a/potato-admin/src/main/java/com/potato/service/board/dto/request/DeleteOrganizationBoardRequest.java +++ b/potato-admin/src/main/java/com/potato/service/board/dto/request/DeleteOrganizationBoardRequest.java @@ -1,14 +1,12 @@ package com.potato.service.board.dto.request; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import javax.validation.constraints.NotNull; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DeleteOrganizationBoardRequest { diff --git a/potato-admin/src/main/java/com/potato/service/board/dto/request/UpdateAdminBoardRequest.java b/potato-admin/src/main/java/com/potato/service/board/dto/request/UpdateAdminBoardRequest.java index 975dfe5d..45bda0ca 100644 --- a/potato-admin/src/main/java/com/potato/service/board/dto/request/UpdateAdminBoardRequest.java +++ b/potato-admin/src/main/java/com/potato/service/board/dto/request/UpdateAdminBoardRequest.java @@ -20,6 +20,8 @@ public class UpdateAdminBoardRequest { private String content; + private String imageUrl; + @NotNull @DateTimeFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") private LocalDateTime startDateTime; @@ -29,10 +31,11 @@ public class UpdateAdminBoardRequest { private LocalDateTime endDateTime; @Builder(builderMethodName = "testBuilder") - public UpdateAdminBoardRequest(@NotNull Long adminBoardId, @NotBlank String title, String content, @NotNull LocalDateTime startDateTime, @NotNull LocalDateTime endDateTime) { + public UpdateAdminBoardRequest(@NotNull Long adminBoardId, @NotBlank String title, String content, String imageUrl, @NotNull LocalDateTime startDateTime, @NotNull LocalDateTime endDateTime) { this.adminBoardId = adminBoardId; this.title = title; this.content = content; + this.imageUrl = imageUrl; this.startDateTime = startDateTime; this.endDateTime = endDateTime; } diff --git a/potato-admin/src/main/java/com/potato/service/board/dto/response/AdminBoardInfoResponse.java b/potato-admin/src/main/java/com/potato/service/board/dto/response/AdminBoardInfoResponse.java index cc7a99e4..78737242 100644 --- a/potato-admin/src/main/java/com/potato/service/board/dto/response/AdminBoardInfoResponse.java +++ b/potato-admin/src/main/java/com/potato/service/board/dto/response/AdminBoardInfoResponse.java @@ -10,19 +10,22 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class AdminBoardInfoResponse { + private Long id; private String title; + private String content; + + private String imageUrl; + private LocalDateTime startDateTime; private LocalDateTime endDateTime; - private String content; - public static AdminBoardInfoResponse of(AdminBoard adminBoard) { - return new AdminBoardInfoResponse(adminBoard.getId(), adminBoard.getTitle(), - adminBoard.getStartDateTime(), adminBoard.getEndDateTime(), adminBoard.getContent()); + return new AdminBoardInfoResponse(adminBoard.getId(), adminBoard.getTitle(), adminBoard.getContent(), adminBoard.getImageUrl(), + adminBoard.getStartDateTime(), adminBoard.getEndDateTime()); } } diff --git a/potato-admin/src/main/java/com/potato/service/member/dto/response/MemberInfoResponse.java b/potato-admin/src/main/java/com/potato/service/member/dto/response/MemberInfoResponse.java index d3944485..590cef6b 100644 --- a/potato-admin/src/main/java/com/potato/service/member/dto/response/MemberInfoResponse.java +++ b/potato-admin/src/main/java/com/potato/service/member/dto/response/MemberInfoResponse.java @@ -5,7 +5,9 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; +@ToString @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class MemberInfoResponse { diff --git a/potato-admin/src/main/java/com/potato/service/organization/dto/request/UpdateCategoryRequest.java b/potato-admin/src/main/java/com/potato/service/organization/dto/request/UpdateCategoryRequest.java index 30705b48..5529db84 100644 --- a/potato-admin/src/main/java/com/potato/service/organization/dto/request/UpdateCategoryRequest.java +++ b/potato-admin/src/main/java/com/potato/service/organization/dto/request/UpdateCategoryRequest.java @@ -1,24 +1,18 @@ package com.potato.service.organization.dto.request; import com.potato.domain.organization.OrganizationCategory; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import javax.validation.constraints.NotNull; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class UpdateCategoryRequest { @NotNull - OrganizationCategory category; - - private UpdateCategoryRequest(@NotNull OrganizationCategory category) { - this.category = category; - } + private OrganizationCategory category; public static UpdateCategoryRequest testInstance(OrganizationCategory category) { return new UpdateCategoryRequest(category); diff --git a/potato-admin/src/main/java/com/potato/service/organization/dto/response/OrganizationInfoResponse.java b/potato-admin/src/main/java/com/potato/service/organization/dto/response/OrganizationInfoResponse.java index 77c4ae6d..6f6feb8c 100644 --- a/potato-admin/src/main/java/com/potato/service/organization/dto/response/OrganizationInfoResponse.java +++ b/potato-admin/src/main/java/com/potato/service/organization/dto/response/OrganizationInfoResponse.java @@ -5,7 +5,9 @@ import lombok.AccessLevel; import lombok.Getter; import lombok.RequiredArgsConstructor; +import lombok.ToString; +@ToString @Getter @RequiredArgsConstructor(access = AccessLevel.PRIVATE) public class OrganizationInfoResponse { diff --git a/potato-admin/src/test/java/com/potato/controller/board/AdminBoardControllerTest.java b/potato-admin/src/test/java/com/potato/controller/board/AdminBoardControllerTest.java index b4770827..836ade37 100644 --- a/potato-admin/src/test/java/com/potato/controller/board/AdminBoardControllerTest.java +++ b/potato-admin/src/test/java/com/potato/controller/board/AdminBoardControllerTest.java @@ -46,21 +46,23 @@ void cleanUp() { String title = "title"; String content = "content"; + String imageUrl = "http://image.com"; LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 1, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 3, 0, 0); CreateAdminBoardRequest request = CreateAdminBoardRequest.testBuilder() + .title(title) .content(content) + .imageUrl(imageUrl) .startDateTime(startDateTime) .endDateTime(endDateTime) - .title(title) .build(); // when ApiResponse response = adminBoardMockMvc.createAdminBoard(request, token, 200); // then - assertAdminBoardResponse(response.getData(), title, content, startDateTime, endDateTime); + assertAdminBoardResponse(response.getData(), title, content, imageUrl, startDateTime, endDateTime); } @Test @@ -68,7 +70,6 @@ void cleanUp() { // given CreateAdminBoardRequest request = CreateAdminBoardRequest.testBuilder() .title("title") - .content("content") .startDateTime(LocalDateTime.of(2020, 3, 5, 0, 0)) .endDateTime(LocalDateTime.of(2020, 3, 6, 0, 0)) .build(); @@ -95,12 +96,14 @@ void cleanUp() { String title = "updateTitle"; String content = "content"; + String imageUrl = "http://image.com"; LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 1, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 3, 0, 0); UpdateAdminBoardRequest request = UpdateAdminBoardRequest.testBuilder() .title(title) .content(content) + .imageUrl(imageUrl) .adminBoardId(adminBoard.getId()) .startDateTime(startDateTime) .endDateTime(endDateTime) @@ -110,7 +113,7 @@ void cleanUp() { ApiResponse response = adminBoardMockMvc.updateAdminBoard(request, token, 200); // then - assertAdminBoardResponse(response.getData(), title, content, startDateTime, endDateTime); + assertAdminBoardResponse(response.getData(), title, content, imageUrl, startDateTime, endDateTime); } @Test @@ -130,9 +133,10 @@ void cleanUp() { assertThat(response.getCode()).isEqualTo(ErrorCode.UNAUTHORIZED_EXCEPTION.getCode()); } - private void assertAdminBoardResponse(AdminBoardInfoResponse response, String title, String content, LocalDateTime startDateTime, LocalDateTime endDateTime) { + private void assertAdminBoardResponse(AdminBoardInfoResponse response, String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime) { assertThat(response.getTitle()).isEqualTo(title); assertThat(response.getContent()).isEqualTo(content); + assertThat(response.getImageUrl()).isEqualTo(imageUrl); assertThat(response.getStartDateTime()).isEqualTo(startDateTime); assertThat(response.getEndDateTime()).isEqualTo(endDateTime); } diff --git a/potato-admin/src/test/java/com/potato/service/board/AdminBoardServiceTest.java b/potato-admin/src/test/java/com/potato/service/board/AdminBoardServiceTest.java index f73498cd..ac77210f 100644 --- a/potato-admin/src/test/java/com/potato/service/board/AdminBoardServiceTest.java +++ b/potato-admin/src/test/java/com/potato/service/board/AdminBoardServiceTest.java @@ -1,13 +1,7 @@ package com.potato.service.board; -import com.potato.domain.board.Board; -import com.potato.domain.board.BoardRepository; -import com.potato.domain.board.DeleteBoard; -import com.potato.domain.board.DeleteBoardRepository; import com.potato.domain.board.admin.AdminBoard; import com.potato.domain.board.admin.AdminBoardRepository; -import com.potato.domain.board.admin.DeleteAdminBoard; -import com.potato.domain.board.admin.DeleteAdminBoardRepository; import com.potato.domain.board.organization.*; import com.potato.exception.model.NotFoundException; import com.potato.service.AdminSetupTest; @@ -33,15 +27,6 @@ public class AdminBoardServiceTest extends AdminSetupTest { @Autowired private AdminBoardService adminBoardService; - @Autowired - private BoardRepository boardRepository; - - @Autowired - private DeleteAdminBoardRepository deleteAdminBoardRepository; - - @Autowired - private DeleteBoardRepository deleteBoardRepository; - @Autowired private OrganizationBoardRepository organizationBoardRepository; @@ -52,11 +37,8 @@ public class AdminBoardServiceTest extends AdminSetupTest { void cleanup() { super.cleanUp(); adminBoardRepository.deleteAllInBatch(); - boardRepository.deleteAllInBatch(); organizationBoardRepository.deleteAllInBatch(); - deleteAdminBoardRepository.deleteAllInBatch(); deleteOrganizationBoardRepository.deleteAllInBatch(); - deleteBoardRepository.deleteAllInBatch(); } @Test @@ -64,11 +46,13 @@ void cleanup() { // given String content = "content"; String title = "title"; + String imageUrl = "http://image.com"; LocalDateTime startDateTime = LocalDateTime.of(2021, 9, 3, 12, 12); LocalDateTime endDateTime = LocalDateTime.of(2021, 9, 5, 12, 12); CreateAdminBoardRequest request = CreateAdminBoardRequest.testBuilder() - .content(content) .title(title) + .content(content) + .imageUrl(imageUrl) .startDateTime(startDateTime) .endDateTime(endDateTime) .build(); @@ -79,36 +63,32 @@ void cleanup() { // then List adminBoardList = adminBoardRepository.findAll(); assertThat(adminBoardList).hasSize(1); - assertThat(adminBoardList.get(0).getContent()).isEqualTo(content); - assertThat(adminBoardList.get(0).getAdministratorId()).isEqualTo(adminMemberId); - - List boardList = boardRepository.findAll(); - assertThat(boardList).hasSize(1); - assertThat(boardList.get(0).getTitle()).isEqualTo(title); - assertThat(boardList.get(0).getStartDateTime()).isEqualTo(startDateTime); - assertThat(boardList.get(0).getEndDateTime()).isEqualTo(endDateTime); + assertAdminBoard(adminBoardList.get(0), title, content, imageUrl, startDateTime, endDateTime, adminMemberId); } @Test void 관리자가_게시글을_수정한다() { // given - LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 1, 0, 0); - LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 3, 0, 0); AdminBoard adminBoard = AdminBoard.builder() .administratorId(adminMemberId) .title("학사") .content("학사행정입니다.") - .startDateTime(LocalDateTime.of(2020,3,30,0, 0)) - .endDateTime(LocalDateTime.of(2020,4,30,0, 0)) + .startDateTime(LocalDateTime.of(2020, 3, 30, 0, 0)) + .endDateTime(LocalDateTime.of(2020, 4, 30, 0, 0)) .build(); adminBoardRepository.save(adminBoard); String title = "학사행정"; String content = "내용"; + String imageUrl = "imageUrl"; + LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 1, 0, 0); + LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 3, 0, 0); + UpdateAdminBoardRequest request = UpdateAdminBoardRequest.testBuilder() .adminBoardId(adminBoard.getId()) .title(title) .content(content) + .imageUrl(imageUrl) .startDateTime(startDateTime) .endDateTime(endDateTime) .build(); @@ -119,14 +99,7 @@ void cleanup() { // then List adminBoardList = adminBoardRepository.findAll(); assertThat(adminBoardList).hasSize(1); - assertThat(adminBoardList.get(0).getContent()).isEqualTo(content); - assertThat(adminBoardList.get(0).getAdministratorId()).isEqualTo(adminMemberId); - - List boardList = boardRepository.findAll(); - assertThat(boardList).hasSize(1); - assertThat(boardList.get(0).getTitle()).isEqualTo(title); - assertThat(boardList.get(0).getStartDateTime()).isEqualTo(startDateTime); - assertThat(boardList.get(0).getEndDateTime()).isEqualTo(endDateTime); + assertAdminBoard(adminBoardList.get(0), title, content, imageUrl, startDateTime, endDateTime, adminMemberId); } @Test @@ -141,77 +114,55 @@ void cleanup() { assertThatThrownBy(() -> adminBoardService.updateAdminBoard(request)).isInstanceOf(NotFoundException.class); } - @Test - void 관리자가_게시글을_삭제하면_백업되고_삭제한다() { - // given - String title = "학사"; - String content = "학사행정입니다."; - AdminBoard adminBoard = AdminBoard.builder() - .administratorId(adminMemberId) - .title(title) - .content(content) - .startDateTime(LocalDateTime.of(2021, 4, 1, 0, 0)) - .endDateTime(LocalDateTime.of(2021, 4, 3, 0, 0)) - .build(); - adminBoardRepository.save(adminBoard); - - // when - adminBoardService.deleteAdminBoard(adminBoard.getId(), adminMemberId); - - // then - List deleteAdminBoardList = deleteAdminBoardRepository.findAll(); - assertThat(deleteAdminBoardList).hasSize(1); - assertDeleteAdminBoard(deleteAdminBoardList.get(0), content, adminMemberId, adminBoard.getId()); - - List adminBoardList = adminBoardRepository.findAll(); - assertThat(adminBoardList).isEmpty(); - - List deleteBoardList = deleteBoardRepository.findAll(); - assertThat(deleteBoardList).hasSize(1); - assertDeleteBoard(deleteBoardList.get(0), title, adminMemberId); - } - - @Test - void 관리자_게시물을_삭제할때_해당하는_게시물이_없는경우_에러가_발생한다() { - // when & then - assertThatThrownBy(() -> adminBoardService.deleteAdminBoard(999L, adminMemberId)).isInstanceOf(NotFoundException.class); - } - @Test public void 관리자가_일반유저들의_게시글을_삭제한다() { //given String subDomain = "subDomain"; - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 1L, "title", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 1L, "title", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); //when - adminBoardService.deleteOrganizationBoard(subDomain, 2L, organizationBoard.getId()); + adminBoardService.deleteOrganizationBoard(subDomain, organizationBoard.getId(), adminMemberId); //then List deleteOrganizationBoardList = deleteOrganizationBoardRepository.findAll(); - List deleteBoardList = deleteBoardRepository.findAll(); - assertThat(deleteBoardList).hasSize(1); assertThat(deleteOrganizationBoardList).hasSize(1); + assertDeleteOrganizationBoard(deleteOrganizationBoardList.get(0), organizationBoard, adminMemberId); assertThat(deleteOrganizationBoardList.get(0).getSubDomain()).isEqualTo(subDomain); + assertDeleteInfo(deleteOrganizationBoardList.get(0), adminMemberId); } @Test public void 그룹게시물이_없을_경우에_관리자가_삭제하려고_하면_애러가_발생한다() { // when & then assertThatThrownBy( - () -> adminBoardService.deleteOrganizationBoard("subDomain", 1L, 1L) + () -> adminBoardService.deleteOrganizationBoard("subDomain", 1L, adminMemberId) ).isInstanceOf(NotFoundException.class); } - private void assertDeleteAdminBoard(DeleteAdminBoard deleteAdminBoard, String content, Long adminMemberId, Long adminBoardId) { - assertThat(deleteAdminBoard.getContent()).isEqualTo(content); - assertThat(deleteAdminBoard.getBackUpId()).isEqualTo(adminBoardId); - assertThat(deleteAdminBoard.getDeleteAdministratorId()).isEqualTo(adminMemberId); + private void assertAdminBoard(AdminBoard adminBoard, String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, Long adminMemberId) { + assertThat(adminBoard.getAdministratorId()).isEqualTo(adminMemberId); + assertThat(adminBoard.getTitle()).isEqualTo(title); + assertThat(adminBoard.getContent()).isEqualTo(content); + assertThat(adminBoard.getImageUrl()).isEqualTo(imageUrl); + assertThat(adminBoard.getStartDateTime()).isEqualTo(startDateTime); + assertThat(adminBoard.getEndDateTime()).isEqualTo(endDateTime); + } + + private void assertDeleteInfo(DeleteOrganizationBoard deleteOrganizationBoard, Long adminMemberId) { + assertThat(deleteOrganizationBoard.getDeletedMemberId()).isNull(); + assertThat(deleteOrganizationBoard.getDeletedAdminMemberId()).isEqualTo(adminMemberId); } - private void assertDeleteBoard(DeleteBoard deleteBoard, String title, Long adminMemberId) { - assertThat(deleteBoard.getTitle()).isEqualTo(title); - assertThat(deleteBoard.getMemberId()).isEqualTo(adminMemberId); + private void assertDeleteOrganizationBoard(DeleteOrganizationBoard deleteOrganizationBoard, OrganizationBoard organizationBoard, Long adminMemberId) { + assertThat(deleteOrganizationBoard.getSubDomain()).isEqualTo(organizationBoard.getSubDomain()); + assertThat(deleteOrganizationBoard.getMemberId()).isEqualTo(organizationBoard.getMemberId()); + assertThat(deleteOrganizationBoard.getCategory()).isEqualTo(organizationBoard.getCategory()); + assertThat(deleteOrganizationBoard.getTitle()).isEqualTo(organizationBoard.getTitle()); + assertThat(deleteOrganizationBoard.getContent()).isEqualTo(organizationBoard.getContent()); + assertThat(deleteOrganizationBoard.getImageUrl()).isEqualTo(organizationBoard.getImageUrl()); + assertThat(deleteOrganizationBoard.getLikesCount()).isEqualTo(organizationBoard.getLikesCount()); + assertThat(deleteOrganizationBoard.getBackUpId()).isEqualTo(organizationBoard.getId()); } } diff --git a/potato-api/http/board/board-comment.http b/potato-api/http/board/board-comment.http index be869153..d4214874 100644 --- a/potato-api/http/board/board-comment.http +++ b/potato-api/http/board/board-comment.http @@ -34,3 +34,18 @@ Authorization: Bearer {{AUTHORIZATION}} ### 해당 게시물의 댓글 리스트를 불러옵니다 GET {{host_api}}/api/v2/board/comment/list?type=ORGANIZATION_BOARD&boardId=1 Authorization: Bearer {{AUTHORIZATION}} + + +### 게시물의 댓글에 좋아요를 한다 +POST {{host_api}}/api/v2/board/comment/like +Content-Type: application/json +Authorization: Bearer {{AUTHORIZATION}} + +{ + "boardCommentId": 1 +} + +### 게시물의 댓글에 좋아요를 취소한다 +DELETE {{host_api}}/api/v2/board/comment/like?boardCommentId=1 +Authorization: Bearer {{AUTHORIZATION}} + diff --git a/potato-api/http/board/board.http b/potato-api/http/board/board.http index 36439e91..52e5393e 100644 --- a/potato-api/http/board/board.http +++ b/potato-api/http/board/board.http @@ -4,12 +4,12 @@ Content-Type: application/json Authorization: Bearer {{AUTHORIZATION}} { - "title": "감자 신규 회원 모집", - "content": "감지 동아리에서 신규 회원을 모집합니다", - "startDateTime": "2021-03-01T00:00:00", - "endDateTime": "2021-03-08T11:59:59", - "imageUrl": "http://image.url", - "type": "RECRUIT" + "title": "감자 모각코 이벤트", + "content": "감자 모각코", + "startDateTime": "2021-05-01T00:00:00", + "endDateTime": "2021-05-08T11:59:59", + "imageUrl": "https://avatars.githubusercontent.com/u/48153675?v=4", + "type": "EVENT" } ### 특정 그룹의 게시물을 조회하는 API diff --git a/potato-api/http/member/member.http b/potato-api/http/member/member.http index 9925db77..e70c5497 100644 --- a/potato-api/http/member/member.http +++ b/potato-api/http/member/member.http @@ -5,9 +5,9 @@ Content-Type: application/json { "email": "will.seungho@gmail.com", "name": "강승호", - "profileUrl": "http://profile.com", - "major": "IT_COMPUTER", - "classNumber": 201610323 + "profileUrl": "https://avatars.githubusercontent.com/u/48153675?v=4", + "major": "IT_ICT", + "classNumber": 201610302 } > {% client.global.set("AUTHORIZATION", response.body["data"]) @@ -16,7 +16,6 @@ client.global.set("AUTHORIZATION", response.body["data"]) ### 내 정보를 가져오는 API GET {{host_api}}/api/v1/member -Content-Type: application/json Authorization: Bearer {{AUTHORIZATION}} @@ -34,5 +33,5 @@ Authorization: Bearer {{AUTHORIZATION}} ### 특정 회원의 정보를 불러오는 API -GET {{host_api}}/api/v1/member/2 +GET {{host_api}}/api/v1/member/1 Authorization: Bearer {{AUTHORIZATION}} diff --git a/potato-api/http/organization/organization.http b/potato-api/http/organization/organization.http index 1a45bc30..0360dce0 100644 --- a/potato-api/http/organization/organization.http +++ b/potato-api/http/organization/organization.http @@ -5,42 +5,48 @@ Authorization: Bearer {{AUTHORIZATION}} { "subDomain": "potato", - "name": "감자팀", - "description": "테스트2 그룹입니다.", + "name": "감자", + "description": "개발의 감을 잡자", "profileUrl": "https://avatars.githubusercontent.com/u/48153675?v=4" } -### 조직 조회 API +### 특정 동아리 상세 조회 API GET {{host_api}}/api/v1/organization/potato -### 조직 리스트 조회 API +### 동아리 리스트 조회 API GET {{host_api}}/api/v1/organization/list?size=5&lastOrganizationId=0 -### 조직 리스트 조회 API +### 내가 속한 동아리 리스트 조회 API GET {{host_api}}/api/v1/organization/my Authorization: Bearer {{AUTHORIZATION}} -### 조직에 가입 신청을 하는 API +### 동아리에 가입 신청을 하는 API POST {{host_api}}/api/v1/organization/join/apply/potato Content-Type: application/json Authorization: Bearer {{AUTHORIZATION}} -### 그룹 가입 신청을 취소하는 API +### 동아리 가입 신청을 취소하는 API PUT {{host_api}}/api/v1/organization/join/cancel/potato Content-Type: application/json Authorization: Bearer {{AUTHORIZATION}} -### 조직에서 탈퇴하는 API +### 동아리에서 탈퇴하는 API DELETE {{host_api}}/api/v1/organization/leave/potato Authorization: Bearer {{AUTHORIZATION}} + + +### 동아리 팔로우 하기 +POST {{host_api}}/api/v1/organization/follow/potato +Content-Type: application/json +Authorization: Bearer {{AUTHORIZATION}} diff --git a/potato-api/src/main/java/com/potato/controller/comment/BoardCommentController.java b/potato-api/src/main/java/com/potato/controller/comment/BoardCommentController.java index a6500200..3b1575c1 100644 --- a/potato-api/src/main/java/com/potato/controller/comment/BoardCommentController.java +++ b/potato-api/src/main/java/com/potato/controller/comment/BoardCommentController.java @@ -3,9 +3,10 @@ import com.potato.config.argumentResolver.MemberId; import com.potato.config.interceptor.auth.Auth; import com.potato.controller.ApiResponse; -import com.potato.domain.comment.BoardCommentType; +import com.potato.domain.board.BoardType; import com.potato.service.comment.BoardCommentService; import com.potato.service.comment.dto.request.AddBoardCommentRequest; +import com.potato.service.comment.dto.request.LikeBoardCommentRequest; import com.potato.service.comment.dto.response.BoardCommentResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.security.SecurityRequirement; @@ -32,7 +33,7 @@ public ApiResponse addBoardComment(@Valid @RequestBody AddBoardCommentRe @Operation(summary = "게시물의 댓글 리스트를 조회합니다.") @GetMapping("/api/v2/board/comment/list") - public ApiResponse> retrieveBoardComments(@RequestParam BoardCommentType type, @RequestParam Long boardId) { + public ApiResponse> retrieveBoardComments(@RequestParam BoardType type, @RequestParam Long boardId) { return ApiResponse.success(boardCommentService.retrieveBoardCommentList(type, boardId)); } @@ -44,4 +45,20 @@ public ApiResponse deleteBoardComment(@RequestParam Long boardCommentId, return ApiResponse.OK; } + @Operation(summary = "댓글에 좋아요를 합니다.", security = {@SecurityRequirement(name = "BearerKey")}) + @Auth + @PostMapping("/api/v2/board/comment/like") + public ApiResponse likeBoardComment(@Valid @RequestBody LikeBoardCommentRequest request, @MemberId Long memberId) { + boardCommentService.likeBoardComment(request.getBoardCommentId(), memberId); + return ApiResponse.OK; + } + + @Operation(summary = "댓글에 좋아요를 취소합니다.", security = {@SecurityRequirement(name = "BearerKey")}) + @Auth + @DeleteMapping("/api/v2/board/comment/like") + public ApiResponse unlikeBoardComment(@Valid LikeBoardCommentRequest request, @MemberId Long memberId) { + boardCommentService.unLikeBoardComment(request.getBoardCommentId(), memberId); + return ApiResponse.OK; + } + } diff --git a/potato-api/src/main/java/com/potato/service/auth/dto/request/AuthRequest.java b/potato-api/src/main/java/com/potato/service/auth/dto/request/AuthRequest.java index 2d5ee274..99421052 100644 --- a/potato-api/src/main/java/com/potato/service/auth/dto/request/AuthRequest.java +++ b/potato-api/src/main/java/com/potato/service/auth/dto/request/AuthRequest.java @@ -1,14 +1,12 @@ package com.potato.service.auth.dto.request; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import javax.validation.constraints.NotBlank; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AuthRequest { @@ -18,11 +16,6 @@ public class AuthRequest { @NotBlank private String redirectUri; - private AuthRequest(@NotBlank String code, @NotBlank String redirectUri) { - this.code = code; - this.redirectUri = redirectUri; - } - public static AuthRequest testInstance(String code, String redirectUri) { return new AuthRequest(code, redirectUri); } diff --git a/potato-api/src/main/java/com/potato/service/board/organization/OrganizationBoardRetrieveService.java b/potato-api/src/main/java/com/potato/service/board/organization/OrganizationBoardRetrieveService.java index 58b3849d..28c0e498 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/OrganizationBoardRetrieveService.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/OrganizationBoardRetrieveService.java @@ -2,7 +2,7 @@ import com.potato.domain.board.organization.OrganizationBoard; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.board.organization.repository.dto.BoardWithOrganizationDto; import com.potato.domain.member.Member; import com.potato.domain.member.MemberRepository; @@ -37,7 +37,7 @@ public OrganizationBoardWithCreatorInfoResponse retrieveBoardWithOrganizationAnd } @Transactional(readOnly = true) - public List retrieveBoardsWithPagination(OrganizationBoardType type, long lastOrganizationBoardId, int size) { + public List retrieveBoardsWithPagination(OrganizationBoardCategory type, long lastOrganizationBoardId, int size) { return organizationBoardRepository.findAllWithOrganizationByTypeLessThanOrderByIdDescLimit(type, lastOrganizationBoardId, size); } diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/CreateOrganizationBoardRequest.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/CreateOrganizationBoardRequest.java index 8f0dc9a3..113fe618 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/CreateOrganizationBoardRequest.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/CreateOrganizationBoardRequest.java @@ -1,7 +1,7 @@ package com.potato.service.board.organization.dto.request; import com.potato.domain.board.organization.OrganizationBoard; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import lombok.*; import org.springframework.format.annotation.DateTimeFormat; @@ -31,10 +31,10 @@ public class CreateOrganizationBoardRequest { private LocalDateTime endDateTime; @NotNull - private OrganizationBoardType type; + private OrganizationBoardCategory type; @Builder(builderMethodName = "testBuilder") - public CreateOrganizationBoardRequest(String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardType type) { + public CreateOrganizationBoardRequest(String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardCategory type) { this.title = title; this.content = content; this.imageUrl = imageUrl; @@ -52,7 +52,7 @@ public OrganizationBoard toEntity(String subDomain, Long memberId) { .imageUrl(imageUrl) .startDateTime(startDateTime) .endDateTime(endDateTime) - .type(type) + .category(type) .build(); } diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/DeleteOrganizationBoardRequest.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/DeleteOrganizationBoardRequest.java index 3065e585..f640c002 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/DeleteOrganizationBoardRequest.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/DeleteOrganizationBoardRequest.java @@ -1,14 +1,12 @@ package com.potato.service.board.organization.dto.request; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import javax.validation.constraints.NotNull; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DeleteOrganizationBoardRequest { diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/LikeOrganizationBoardRequest.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/LikeOrganizationBoardRequest.java index aa2ea50c..2fdd5444 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/LikeOrganizationBoardRequest.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/LikeOrganizationBoardRequest.java @@ -1,24 +1,18 @@ package com.potato.service.board.organization.dto.request; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import javax.validation.constraints.Min; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class LikeOrganizationBoardRequest { @Min(0) private long organizationBoardId; - private LikeOrganizationBoardRequest(long organizationBoardId) { - this.organizationBoardId = organizationBoardId; - } - public static LikeOrganizationBoardRequest testInstance(Long organizationBoardId) { return new LikeOrganizationBoardRequest(organizationBoardId); } diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveImminentBoardsRequest.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveImminentBoardsRequest.java index 6f7bd603..d354eaab 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveImminentBoardsRequest.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveImminentBoardsRequest.java @@ -1,15 +1,13 @@ package com.potato.service.board.organization.dto.request; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.springframework.format.annotation.DateTimeFormat; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; +@ToString @Getter @AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveLatestBoardsRequest.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveLatestBoardsRequest.java index 9034bea3..d6829f8a 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveLatestBoardsRequest.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/RetrieveLatestBoardsRequest.java @@ -1,15 +1,13 @@ package com.potato.service.board.organization.dto.request; -import com.potato.domain.board.organization.OrganizationBoardType; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import com.potato.domain.board.organization.OrganizationBoardCategory; +import lombok.*; import javax.validation.constraints.Min; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RetrieveLatestBoardsRequest { @@ -19,6 +17,6 @@ public class RetrieveLatestBoardsRequest { @Min(1) private int size; - private OrganizationBoardType type; + private OrganizationBoardCategory type; } diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/UpdateOrganizationBoardRequest.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/UpdateOrganizationBoardRequest.java index cca0d228..40d90897 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/request/UpdateOrganizationBoardRequest.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/request/UpdateOrganizationBoardRequest.java @@ -1,6 +1,6 @@ package com.potato.service.board.organization.dto.request; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import lombok.*; import org.springframework.format.annotation.DateTimeFormat; @@ -32,10 +32,10 @@ public class UpdateOrganizationBoardRequest { private LocalDateTime endDateTime; @NotNull - private OrganizationBoardType type; + private OrganizationBoardCategory type; @Builder(builderMethodName = "testBuilder") - public UpdateOrganizationBoardRequest(Long organizationBoardId, String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardType type) { + public UpdateOrganizationBoardRequest(Long organizationBoardId, String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardCategory type) { this.organizationBoardId = organizationBoardId; this.title = title; this.content = content; diff --git a/potato-api/src/main/java/com/potato/service/board/organization/dto/response/OrganizationBoardInfoResponse.java b/potato-api/src/main/java/com/potato/service/board/organization/dto/response/OrganizationBoardInfoResponse.java index 51beab4e..e4b666b9 100644 --- a/potato-api/src/main/java/com/potato/service/board/organization/dto/response/OrganizationBoardInfoResponse.java +++ b/potato-api/src/main/java/com/potato/service/board/organization/dto/response/OrganizationBoardInfoResponse.java @@ -1,7 +1,7 @@ package com.potato.service.board.organization.dto.response; import com.potato.domain.board.organization.OrganizationBoard; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import lombok.*; import java.time.LocalDateTime; @@ -28,12 +28,12 @@ public class OrganizationBoardInfoResponse { private int likesCount; - private OrganizationBoardType type; + private OrganizationBoardCategory type; public static OrganizationBoardInfoResponse of(OrganizationBoard organizationBoard) { return new OrganizationBoardInfoResponse(organizationBoard.getId(), organizationBoard.getSubDomain(), organizationBoard.getTitle(), organizationBoard.getStartDateTime(), organizationBoard.getEndDateTime(), organizationBoard.getContent(), - organizationBoard.getImageUrl(), organizationBoard.getLikesCount(), organizationBoard.getType()); + organizationBoard.getImageUrl(), organizationBoard.getLikesCount(), organizationBoard.getCategory()); } } diff --git a/potato-api/src/main/java/com/potato/service/comment/BoardCommentService.java b/potato-api/src/main/java/com/potato/service/comment/BoardCommentService.java index 619a521e..f0c90e19 100644 --- a/potato-api/src/main/java/com/potato/service/comment/BoardCommentService.java +++ b/potato-api/src/main/java/com/potato/service/comment/BoardCommentService.java @@ -4,7 +4,7 @@ import com.potato.domain.board.organization.OrganizationBoardRepository; import com.potato.domain.comment.BoardComment; import com.potato.domain.comment.BoardCommentRepository; -import com.potato.domain.comment.BoardCommentType; +import com.potato.domain.board.BoardType; import com.potato.service.comment.dto.request.AddBoardCommentRequest; import com.potato.service.comment.dto.response.BoardCommentResponse; import lombok.RequiredArgsConstructor; @@ -34,7 +34,7 @@ public void addBoardComment(AddBoardCommentRequest request, Long memberId) { } @Transactional(readOnly = true) - public List retrieveBoardCommentList(BoardCommentType type, Long boardId) { + public List retrieveBoardCommentList(BoardType type, Long boardId) { BoardCommentServiceUtils.validateExistBoard(organizationBoardRepository, adminBoardRepository, type, boardId); List rootComments = boardCommentRepository.findRootCommentByTypeAndBoardId(type, boardId); return rootComments.stream() @@ -48,4 +48,16 @@ public void deleteBoardComment(Long boardCommentId, Long memberId) { comment.delete(); } + @Transactional + public void likeBoardComment(Long boardCommentId, Long memberId) { + BoardComment boardComment = BoardCommentServiceUtils.findBoardCommentById(boardCommentRepository, boardCommentId); + boardComment.addLike(memberId); + } + + @Transactional + public void unLikeBoardComment(Long boardCommentId, Long memberId) { + BoardComment boardComment = BoardCommentServiceUtils.findBoardCommentById(boardCommentRepository, boardCommentId); + boardComment.deleteLike(memberId); + } + } diff --git a/potato-api/src/main/java/com/potato/service/comment/BoardCommentServiceUtils.java b/potato-api/src/main/java/com/potato/service/comment/BoardCommentServiceUtils.java index 8eb4457a..5130c551 100644 --- a/potato-api/src/main/java/com/potato/service/comment/BoardCommentServiceUtils.java +++ b/potato-api/src/main/java/com/potato/service/comment/BoardCommentServiceUtils.java @@ -1,10 +1,10 @@ package com.potato.service.comment; +import com.potato.domain.board.BoardType; import com.potato.domain.board.admin.AdminBoardRepository; import com.potato.domain.board.organization.OrganizationBoardRepository; import com.potato.domain.comment.BoardComment; import com.potato.domain.comment.BoardCommentRepository; -import com.potato.domain.comment.BoardCommentType; import com.potato.exception.model.NotFoundException; import com.potato.service.board.admin.AdminBoardServiceUtils; import com.potato.service.board.organization.OrganizationBoardServiceUtils; @@ -30,10 +30,10 @@ static BoardComment findBoardCommentByIdAndMemberId(BoardCommentRepository board return boardComment; } - static void validateExistBoard(OrganizationBoardRepository organizationBoardRepository, AdminBoardRepository adminBoardRepository, BoardCommentType type, Long boardId) { - if (type.equals(BoardCommentType.ORGANIZATION_BOARD)) { + static void validateExistBoard(OrganizationBoardRepository organizationBoardRepository, AdminBoardRepository adminBoardRepository, BoardType type, Long boardId) { + if (type.equals(BoardType.ORGANIZATION_BOARD)) { OrganizationBoardServiceUtils.validateExistsBoard(organizationBoardRepository, boardId); - } else if (type.equals(BoardCommentType.ADMIN_BOARD)) { + } else if (type.equals(BoardType.ADMIN_BOARD)) { AdminBoardServiceUtils.validateExistBoard(adminBoardRepository, boardId); } } diff --git a/potato-api/src/main/java/com/potato/service/comment/dto/request/AddBoardCommentRequest.java b/potato-api/src/main/java/com/potato/service/comment/dto/request/AddBoardCommentRequest.java index 1be8d97c..fdc105a8 100644 --- a/potato-api/src/main/java/com/potato/service/comment/dto/request/AddBoardCommentRequest.java +++ b/potato-api/src/main/java/com/potato/service/comment/dto/request/AddBoardCommentRequest.java @@ -1,21 +1,19 @@ package com.potato.service.comment.dto.request; -import com.potato.domain.comment.BoardCommentType; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import com.potato.domain.board.BoardType; +import lombok.*; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AddBoardCommentRequest { @NotNull - private BoardCommentType type; + private BoardType type; @NotNull private Long boardId; @@ -25,19 +23,14 @@ public class AddBoardCommentRequest { @NotBlank private String content; - private AddBoardCommentRequest(BoardCommentType type, Long boardId, Long parentCommentId, String content) { - this.type = type; - this.boardId = boardId; - this.parentCommentId = parentCommentId; - this.content = content; + public boolean hasParentComment() { + return this.parentCommentId == null; } - public static AddBoardCommentRequest testInstance(BoardCommentType type, Long boardId, Long parentCommentId, String content) { + + public static AddBoardCommentRequest testInstance(BoardType type, Long boardId, Long parentCommentId, String content) { return new AddBoardCommentRequest(type, boardId, parentCommentId, content); } - public boolean hasParentComment() { - return this.parentCommentId == null; - } } diff --git a/potato-api/src/main/java/com/potato/service/comment/dto/request/LikeBoardCommentRequest.java b/potato-api/src/main/java/com/potato/service/comment/dto/request/LikeBoardCommentRequest.java new file mode 100644 index 00000000..2cc60cd2 --- /dev/null +++ b/potato-api/src/main/java/com/potato/service/comment/dto/request/LikeBoardCommentRequest.java @@ -0,0 +1,16 @@ +package com.potato.service.comment.dto.request; + +import lombok.*; + +import javax.validation.constraints.NotNull; + +@Getter +@ToString +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor(access = AccessLevel.PRIVATE) +public class LikeBoardCommentRequest { + + @NotNull + private Long boardCommentId; + +} diff --git a/potato-api/src/main/java/com/potato/service/comment/dto/response/BoardCommentResponse.java b/potato-api/src/main/java/com/potato/service/comment/dto/response/BoardCommentResponse.java index 83c30bac..274368e1 100644 --- a/potato-api/src/main/java/com/potato/service/comment/dto/response/BoardCommentResponse.java +++ b/potato-api/src/main/java/com/potato/service/comment/dto/response/BoardCommentResponse.java @@ -1,7 +1,7 @@ package com.potato.service.comment.dto.response; +import com.potato.domain.board.BoardType; import com.potato.domain.comment.BoardComment; -import com.potato.domain.comment.BoardCommentType; import lombok.*; import java.util.ArrayList; @@ -16,7 +16,7 @@ public class BoardCommentResponse { private Long id; - private BoardCommentType type; + private BoardType type; private Long boardId; @@ -24,6 +24,8 @@ public class BoardCommentResponse { private String content; + private int boardCommentLikeCounts; + private final List children = new ArrayList<>(); public static BoardCommentResponse of(BoardComment comment) { @@ -43,11 +45,11 @@ private static BoardCommentResponse activeOrInActiveComment(BoardComment comment } private static BoardCommentResponse inActiveComment(BoardComment comment) { - return new BoardCommentResponse(comment.getId(), comment.getType(), comment.getBoardId(), null, "삭제된 메시지입니다"); + return new BoardCommentResponse(comment.getId(), comment.getType(), comment.getBoardId(), null, "삭제된 메시지입니다", 0); } private static BoardCommentResponse activeComment(BoardComment comment) { - return new BoardCommentResponse(comment.getId(), comment.getType(), comment.getBoardId(), comment.getMemberId(), comment.getContent()); + return new BoardCommentResponse(comment.getId(), comment.getType(), comment.getBoardId(), comment.getMemberId(), comment.getContent(), comment.getCommentLikeCounts()); } } diff --git a/potato-api/src/main/java/com/potato/service/member/dto/response/MajorInfoResponse.java b/potato-api/src/main/java/com/potato/service/member/dto/response/MajorInfoResponse.java index b42539db..19124501 100644 --- a/potato-api/src/main/java/com/potato/service/member/dto/response/MajorInfoResponse.java +++ b/potato-api/src/main/java/com/potato/service/member/dto/response/MajorInfoResponse.java @@ -1,11 +1,9 @@ package com.potato.service.member.dto.response; import com.potato.domain.member.MemberMajor; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; +@ToString @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) diff --git a/potato-api/src/main/java/com/potato/service/schedule/dto/request/ScheduleRequest.java b/potato-api/src/main/java/com/potato/service/schedule/dto/request/ScheduleRequest.java index 3fa52d35..cdc09aef 100644 --- a/potato-api/src/main/java/com/potato/service/schedule/dto/request/ScheduleRequest.java +++ b/potato-api/src/main/java/com/potato/service/schedule/dto/request/ScheduleRequest.java @@ -1,15 +1,13 @@ package com.potato.service.schedule.dto.request; -import lombok.AccessLevel; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.ToString; +import lombok.*; import org.springframework.format.annotation.DateTimeFormat; import java.time.LocalDate; @ToString @Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ScheduleRequest { @@ -19,11 +17,6 @@ public class ScheduleRequest { @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) private LocalDate endDate; - private ScheduleRequest(LocalDate startDate, LocalDate endDate) { - this.startDate = startDate; - this.endDate = endDate; - } - public static ScheduleRequest testInstance(LocalDate startDate, LocalDate endDate) { return new ScheduleRequest(startDate, endDate); } diff --git a/potato-api/src/test/java/com/potato/controller/board/OrganizationBoardControllerTest.java b/potato-api/src/test/java/com/potato/controller/board/OrganizationBoardControllerTest.java index e51c71e6..400ac2f2 100644 --- a/potato-api/src/test/java/com/potato/controller/board/OrganizationBoardControllerTest.java +++ b/potato-api/src/test/java/com/potato/controller/board/OrganizationBoardControllerTest.java @@ -3,9 +3,9 @@ import com.potato.controller.ApiResponse; import com.potato.controller.ControllerTestUtils; import com.potato.domain.board.organization.OrganizationBoard; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.board.organization.OrganizationBoardCreator; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; import com.potato.domain.board.organization.repository.dto.BoardWithOrganizationDto; import com.potato.domain.member.Member; import com.potato.domain.organization.Organization; @@ -74,7 +74,7 @@ void cleanUp() { .content(content) .startDateTime(startTime) .endDateTime(endTime) - .type(OrganizationBoardType.RECRUIT) + .type(OrganizationBoardCategory.RECRUIT) .build(); //when @@ -85,7 +85,7 @@ void cleanUp() { assertThat(response.getData().getContent()).isEqualTo(content); assertThat(response.getData().getStartDateTime()).isEqualTo(startTime); assertThat(response.getData().getEndDateTime()).isEqualTo(endTime); - assertThat(response.getData().getType()).isEqualTo(OrganizationBoardType.RECRUIT); + assertThat(response.getData().getType()).isEqualTo(OrganizationBoardCategory.RECRUIT); } @Test @@ -97,7 +97,7 @@ void cleanUp() { organizationRepository.save(organization); String title = "title"; - OrganizationBoard board = OrganizationBoardCreator.create(subDomain, testMember.getId(), title, OrganizationBoardType.RECRUIT); + OrganizationBoard board = OrganizationBoardCreator.create(subDomain, testMember.getId(), title, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(board); //when @@ -120,9 +120,9 @@ void cleanUp() { String title1 = "title1"; String title2 = "title2"; String title3 = "title3"; - OrganizationBoard board1 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title1, OrganizationBoardType.RECRUIT); - OrganizationBoard board2 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title2, OrganizationBoardType.RECRUIT); - OrganizationBoard board3 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title3, OrganizationBoardType.RECRUIT); + OrganizationBoard board1 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title1, OrganizationBoardCategory.RECRUIT); + OrganizationBoard board2 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title2, OrganizationBoardCategory.RECRUIT); + OrganizationBoard board3 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title3, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(board1, board2, board3)); //when @@ -145,9 +145,9 @@ void cleanUp() { String title1 = "title1"; String title2 = "title2"; String title3 = "title3"; - OrganizationBoard board1 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title1, OrganizationBoardType.RECRUIT); - OrganizationBoard board2 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title2, OrganizationBoardType.RECRUIT); - OrganizationBoard board3 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title3, OrganizationBoardType.RECRUIT); + OrganizationBoard board1 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title1, OrganizationBoardCategory.RECRUIT); + OrganizationBoard board2 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title2, OrganizationBoardCategory.RECRUIT); + OrganizationBoard board3 = OrganizationBoardCreator.create(subDomain, testMember.getId(), title3, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(board1, board2, board3)); //when @@ -182,7 +182,7 @@ void cleanUp() { organizationRepository.save(organization); String title = "title"; - OrganizationBoard board = OrganizationBoardCreator.create(subDomain, testMember.getId(), title, OrganizationBoardType.RECRUIT); + OrganizationBoard board = OrganizationBoardCreator.create(subDomain, testMember.getId(), title, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(board); String updateTitle = "updateTitle"; @@ -191,7 +191,7 @@ void cleanUp() { .title(updateTitle) .startDateTime(LocalDateTime.of(2021, 3, 30, 0, 0)) .endDateTime(LocalDateTime.of(2021, 3, 31, 0, 0)) - .type(OrganizationBoardType.RECRUIT) + .type(OrganizationBoardCategory.RECRUIT) .build(); //when @@ -205,14 +205,14 @@ void cleanUp() { void 인기있는_게시글_5개를_가져오는_경우() throws Exception { //given String subDomain = "potato"; - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, 1L, "title1", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, 1L, "title1", OrganizationBoardCategory.RECRUIT); organizationBoard1.addLike(2L); organizationBoard1.addLike(3L); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, 1L, "title2", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, 1L, "title2", OrganizationBoardCategory.RECRUIT); organizationBoard2.addLike(2L); - OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, 1L, "title3", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard4 = OrganizationBoardCreator.create(subDomain, 1L, "title4", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard5 = OrganizationBoardCreator.create(subDomain, 1L, "title5", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, 1L, "title3", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard4 = OrganizationBoardCreator.create(subDomain, 1L, "title4", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard5 = OrganizationBoardCreator.create(subDomain, 1L, "title5", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2, organizationBoard3, organizationBoard4, organizationBoard5)); diff --git a/potato-api/src/test/java/com/potato/controller/comment/BoardCommentControllerTest.java b/potato-api/src/test/java/com/potato/controller/comment/BoardCommentControllerTest.java index 4ba4b296..598b1e04 100644 --- a/potato-api/src/test/java/com/potato/controller/comment/BoardCommentControllerTest.java +++ b/potato-api/src/test/java/com/potato/controller/comment/BoardCommentControllerTest.java @@ -2,15 +2,15 @@ import com.potato.controller.ApiResponse; import com.potato.controller.ControllerTestUtils; +import com.potato.domain.board.BoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.exception.ErrorCode; import com.potato.domain.board.organization.OrganizationBoard; import com.potato.domain.board.organization.OrganizationBoardCreator; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; import com.potato.domain.comment.BoardComment; import com.potato.domain.comment.BoardCommentCreator; import com.potato.domain.comment.BoardCommentRepository; -import com.potato.domain.comment.BoardCommentType; import com.potato.service.comment.dto.request.AddBoardCommentRequest; import com.potato.service.comment.dto.response.BoardCommentResponse; import org.junit.jupiter.api.AfterEach; @@ -52,10 +52,10 @@ void cleanUp() { @Test void 게시물의_댓글을_조회한다() throws Exception { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; BoardComment rootComment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), testMember.getId(), "루트 댓글1"); rootComment.addChildComment(testMember.getId(), "대댓글1"); rootComment.addChildComment(testMember.getId(), "대댓글2"); @@ -76,7 +76,7 @@ void cleanUp() { @Test void 존재하지_않는_게시물의_댓글을_조회하면_404에러가_발생() throws Exception { // when - ApiResponse> response = boardCommentMockMvc.retrieveBoardComments(BoardCommentType.ADMIN_BOARD, 999L, 404); + ApiResponse> response = boardCommentMockMvc.retrieveBoardComments(BoardType.ADMIN_BOARD, 999L, 404); // then assertThat(response.getCode()).isEqualTo(ErrorCode.NOT_FOUND_EXCEPTION.getCode()); @@ -85,10 +85,10 @@ void cleanUp() { @Test void 삭제된_댓글을_조회시_삭제되었다고_표시된다() throws Exception { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; BoardComment rootComment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), testMember.getId(), "루트 댓글1"); rootComment.delete(); boardCommentRepository.save(rootComment); @@ -104,10 +104,10 @@ void cleanUp() { @Test void 로그인하지_않은_유저가_댓글을_추가하려하면_401_에러발생() throws Exception { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); - AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardCommentType.ADMIN_BOARD, organizationBoard.getId(), null, "로그인 하지 않은 유저가 댓글을 달 경우"); + AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardType.ADMIN_BOARD, organizationBoard.getId(), null, "로그인 하지 않은 유저가 댓글을 달 경우"); // when ApiResponse response = boardCommentMockMvc.addBoardComment(request, "wrong token", 401); @@ -121,10 +121,10 @@ void cleanUp() { // given String token = memberMockMvc.getMockMemberToken(); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", testMember.getId(), "123", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); - AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardCommentType.ORGANIZATION_BOARD, organizationBoard.getId(), null, "댓글"); + AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardType.ORGANIZATION_BOARD, organizationBoard.getId(), null, "댓글"); // when ApiResponse response = boardCommentMockMvc.addBoardComment(request, token, 200); @@ -138,7 +138,7 @@ void cleanUp() { // given String token = memberMockMvc.getMockMemberToken(); - AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardCommentType.ORGANIZATION_BOARD, 999L, null, "댓글"); + AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardType.ORGANIZATION_BOARD, 999L, null, "댓글"); // when ApiResponse response = boardCommentMockMvc.addBoardComment(request, token, 404); @@ -147,7 +147,7 @@ void cleanUp() { assertThat(response.getCode()).isEqualTo(ErrorCode.NOT_FOUND_EXCEPTION.getCode()); } - private void assertBoardCommentResponse(BoardCommentResponse boardCommentResponse, BoardCommentType type, Long organizationBoardId, String content, Long memberId) { + private void assertBoardCommentResponse(BoardCommentResponse boardCommentResponse, BoardType type, Long organizationBoardId, String content, Long memberId) { assertThat(boardCommentResponse.getBoardId()).isEqualTo(organizationBoardId); assertThat(boardCommentResponse.getType()).isEqualTo(type); assertThat(boardCommentResponse.getContent()).isEqualTo(content); diff --git a/potato-api/src/test/java/com/potato/controller/comment/BoardCommentMockMvc.java b/potato-api/src/test/java/com/potato/controller/comment/BoardCommentMockMvc.java index c4a37489..81a88faa 100644 --- a/potato-api/src/test/java/com/potato/controller/comment/BoardCommentMockMvc.java +++ b/potato-api/src/test/java/com/potato/controller/comment/BoardCommentMockMvc.java @@ -3,7 +3,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.potato.controller.ApiResponse; -import com.potato.domain.comment.BoardCommentType; +import com.potato.domain.board.BoardType; import com.potato.service.comment.dto.request.AddBoardCommentRequest; import com.potato.service.comment.dto.response.BoardCommentResponse; import org.springframework.http.HttpHeaders; @@ -28,7 +28,7 @@ public BoardCommentMockMvc(MockMvc mockMvc, ObjectMapper objectMapper) { this.objectMapper = objectMapper; } - public ApiResponse> retrieveBoardComments(BoardCommentType type, Long boardId, int expectedStatus) throws Exception { + public ApiResponse> retrieveBoardComments(BoardType type, Long boardId, int expectedStatus) throws Exception { MockHttpServletRequestBuilder builder = get("/api/v2/board/comment/list") .param("type", String.valueOf(type)) .param("boardId", String.valueOf(boardId)); diff --git a/potato-api/src/test/java/com/potato/controller/schedule/ScheduleControllerTest.java b/potato-api/src/test/java/com/potato/controller/schedule/ScheduleControllerTest.java index a7c23405..3fa461e9 100644 --- a/potato-api/src/test/java/com/potato/controller/schedule/ScheduleControllerTest.java +++ b/potato-api/src/test/java/com/potato/controller/schedule/ScheduleControllerTest.java @@ -6,7 +6,7 @@ import com.potato.domain.board.admin.AdminBoardRepository; import com.potato.domain.board.organization.OrganizationBoard; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.service.schedule.dto.request.ScheduleRequest; import com.potato.service.schedule.dto.response.ScheduleResponse; import org.junit.jupiter.api.AfterEach; @@ -86,7 +86,7 @@ void cleanUp() { .subDomain(subDomain) .startDateTime(startDateTime) .endDateTime(endDateTime) - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .memberId(testMember.getId()) .build(); organizationBoardRepository.save(organizationBoard); diff --git a/potato-api/src/test/java/com/potato/service/board/OrganizationBoardRetrieveServiceTest.java b/potato-api/src/test/java/com/potato/service/board/OrganizationBoardRetrieveServiceTest.java index 27b9690a..d291e68a 100644 --- a/potato-api/src/test/java/com/potato/service/board/OrganizationBoardRetrieveServiceTest.java +++ b/potato-api/src/test/java/com/potato/service/board/OrganizationBoardRetrieveServiceTest.java @@ -41,9 +41,9 @@ void cleanUp() { @Test void 게시물_조회시_카테고리가_정해지지_않으면_전체_카테고리에서_조회한다() { //given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardType.EVENT); - OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardCategory.EVENT); + OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2, organizationBoard3)); @@ -61,8 +61,8 @@ void cleanUp() { @Test void 게시물_조회시_마지막_게시물의_PK_가_0으로_지정되면_가장_최신의_게시물을_조회한다() { //given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardType.EVENT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardCategory.EVENT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2)); @@ -87,9 +87,9 @@ void cleanUp() { @Test void 게시물_조회시_마지막_게시물의_PK_이전의_게시물_N개가_조회된다() { //given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2, organizationBoard3)); @@ -104,14 +104,14 @@ void cleanUp() { @Test void 게시물_조회시_마지막_게시물의_PK_이전의_해당하는_카테고리의_게시물_N개가_조회된다() { //given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardType.EVENT); - OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardCategory.EVENT); + OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2, organizationBoard3)); //when - List responses = organizationBoardService.retrieveBoardsWithPagination(OrganizationBoardType.RECRUIT, organizationBoard3.getId(), 1); + List responses = organizationBoardService.retrieveBoardsWithPagination(OrganizationBoardCategory.RECRUIT, organizationBoard3.getId(), 1); //then assertThat(responses).hasSize(1); @@ -121,7 +121,7 @@ void cleanUp() { @Test void 게시물_스크롤_페이지네이션하는데_더이상_게시물이_존재하지_않을경우() { //given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title1", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard1); //when @@ -135,7 +135,7 @@ void cleanUp() { @ParameterizedTest void 얼마남지_않은_게시물_조회시_아직_시작하지_않고_일주일_이전에_종료되는_그룹_게시물들이_포함된다(LocalDateTime startDateTime, LocalDateTime endDateTime, String title) { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, title, startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, title, startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); RetrieveImminentBoardsRequest request = RetrieveImminentBoardsRequest.testInstance(LocalDateTime.of(2021, 4, 23, 0, 0), 3); @@ -159,7 +159,7 @@ void cleanUp() { @ParameterizedTest void 얼마남지_않은_게시물_조회시_아직_시작하지_않고_일주일_이후로_종료되는_그룹_게시물들이_포함되지_않는다(LocalDateTime startDateTime, LocalDateTime endDateTime) { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); RetrieveImminentBoardsRequest request = RetrieveImminentBoardsRequest.testInstance(LocalDateTime.of(2021, 4, 23, 0, 0), 3); @@ -182,7 +182,7 @@ void cleanUp() { @ParameterizedTest void 얼마남지_않은_게시물_조회시_이미_시작하였고_일주일_이전에_종료되는_그룹_게시물들이_포함된다(LocalDateTime startDateTime, LocalDateTime endDateTime, String title) { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, title, startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, title, startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); RetrieveImminentBoardsRequest request = RetrieveImminentBoardsRequest.testInstance(LocalDateTime.of(2021, 4, 23, 0, 0), 3); @@ -206,7 +206,7 @@ void cleanUp() { @ParameterizedTest void 얼마남지_않은_게시물_조회시_이미_끝난경우_조회되지_않는다(LocalDateTime startDateTime, LocalDateTime endDateTime) { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); RetrieveImminentBoardsRequest request = RetrieveImminentBoardsRequest.testInstance(LocalDateTime.of(2021, 4, 23, 0, 0), 3); @@ -227,9 +227,9 @@ void cleanUp() { @Test void 인기있는_게시물_조회시_좋아요가_많은_순으로_조회한다() { // given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "title2", OrganizationBoardCategory.RECRUIT); organizationBoard1.addLike(2L); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "title3", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2)); @@ -245,8 +245,8 @@ void cleanUp() { @Test void 인기있는_게시물_조회시_좋아요수가_같으면_최신순부터_조회한다() { // given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "더 오래된 게시물", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "더 최신의 게시물", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "더 오래된 게시물", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "더 최신의 게시물", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2)); @@ -262,9 +262,9 @@ void cleanUp() { @Test void 인기있는_게시물_조회시_SIZE_로_넘어온_수만큼_조회된다() { // given - OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "게시물1", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "게시물2", OrganizationBoardType.RECRUIT); - OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "게시물3", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard1 = OrganizationBoardCreator.create(subDomain, memberId, "게시물1", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard2 = OrganizationBoardCreator.create(subDomain, memberId, "게시물2", OrganizationBoardCategory.RECRUIT); + OrganizationBoard organizationBoard3 = OrganizationBoardCreator.create(subDomain, memberId, "게시물3", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.saveAll(Arrays.asList(organizationBoard1, organizationBoard2, organizationBoard3)); @@ -283,7 +283,7 @@ private void assertOrganizationBoardWithCreatorInfo(BoardWithOrganizationDto boa assertThat(boardWithOrganizationDto.getBoardTitle()).isEqualTo(organizationBoard.getTitle()); assertThat(boardWithOrganizationDto.getBoardStartDateTime()).isEqualTo(organizationBoard.getStartDateTime()); assertThat(boardWithOrganizationDto.getBoardEndDateTime()).isEqualTo(organizationBoard.getEndDateTime()); - assertThat(boardWithOrganizationDto.getBoardType()).isEqualTo(organizationBoard.getType()); + assertThat(boardWithOrganizationDto.getBoardCategory()).isEqualTo(organizationBoard.getCategory()); } private void assertOrganizationBoardInfo(OrganizationBoardInfoResponse organizationBoardInfoResponse, OrganizationBoard organizationBoard) { @@ -292,7 +292,7 @@ private void assertOrganizationBoardInfo(OrganizationBoardInfoResponse organizat assertThat(organizationBoardInfoResponse.getTitle()).isEqualTo(organizationBoard.getTitle()); assertThat(organizationBoardInfoResponse.getStartDateTime()).isEqualTo(organizationBoard.getStartDateTime()); assertThat(organizationBoardInfoResponse.getEndDateTime()).isEqualTo(organizationBoard.getEndDateTime()); - assertThat(organizationBoardInfoResponse.getType()).isEqualTo(organizationBoard.getType()); + assertThat(organizationBoardInfoResponse.getType()).isEqualTo(organizationBoard.getCategory()); } } diff --git a/potato-api/src/test/java/com/potato/service/board/OrganizationBoardServiceTest.java b/potato-api/src/test/java/com/potato/service/board/OrganizationBoardServiceTest.java index 44b19013..3c4a2284 100644 --- a/potato-api/src/test/java/com/potato/service/board/OrganizationBoardServiceTest.java +++ b/potato-api/src/test/java/com/potato/service/board/OrganizationBoardServiceTest.java @@ -1,9 +1,5 @@ package com.potato.service.board; -import com.potato.domain.board.Board; -import com.potato.domain.board.BoardRepository; -import com.potato.domain.board.DeleteBoard; -import com.potato.domain.board.DeleteBoardRepository; import com.potato.domain.board.organization.*; import com.potato.exception.model.ConflictException; import com.potato.exception.model.NotFoundException; @@ -29,9 +25,6 @@ class OrganizationBoardServiceTest extends OrganizationMemberSetUpTest { @Autowired private OrganizationBoardService organizationBoardService; - @Autowired - private BoardRepository boardRepository; - @Autowired private OrganizationBoardRepository organizationBoardRepository; @@ -41,17 +34,12 @@ class OrganizationBoardServiceTest extends OrganizationMemberSetUpTest { @Autowired private DeleteOrganizationBoardRepository deleteOrganizationBoardRepository; - @Autowired - private DeleteBoardRepository deleteBoardRepository; - @AfterEach void cleanUp() { super.cleanup(); organizationBoardLikeRepository.deleteAllInBatch(); organizationBoardRepository.deleteAllInBatch(); - boardRepository.deleteAllInBatch(); deleteOrganizationBoardRepository.deleteAll(); - deleteBoardRepository.deleteAll(); } @Test @@ -61,7 +49,7 @@ void cleanUp() { String content = "감자 동아리에서 신입 회원을 모집합니다"; LocalDateTime startDateTime = LocalDateTime.of(2021, 3, 1, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 3, 5, 0, 0); - OrganizationBoardType type = OrganizationBoardType.RECRUIT; + OrganizationBoardCategory type = OrganizationBoardCategory.RECRUIT; CreateOrganizationBoardRequest request = CreateOrganizationBoardRequest.testBuilder() .title(title) @@ -78,11 +66,7 @@ void cleanUp() { List organizationBoardList = organizationBoardRepository.findAll(); assertThat(organizationBoardList).hasSize(1); assertThat(organizationBoardList.get(0).getLikesCount()).isEqualTo(0); - assertOrganizationBoard(organizationBoardList.get(0), content, type, subDomain, memberId); - - List board = boardRepository.findAll(); - assertThat(board).hasSize(1); - assertBoard(board.get(0), title, startDateTime, endDateTime); + assertOrganizationBoard(organizationBoardList.get(0), title, content, type, startDateTime, endDateTime, subDomain, memberId); } @Test @@ -92,9 +76,9 @@ void cleanUp() { String content = "변경 이후의 내용"; LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 1, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 7, 0, 0); - OrganizationBoardType type = OrganizationBoardType.EVENT; + OrganizationBoardCategory type = OrganizationBoardCategory.EVENT; - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "이전의 게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "이전의 게시글", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); UpdateOrganizationBoardRequest request = UpdateOrganizationBoardRequest.testBuilder() @@ -112,17 +96,13 @@ void cleanUp() { // then List organizationBoardList = organizationBoardRepository.findAll(); assertThat(organizationBoardList).hasSize(1); - assertOrganizationBoard(organizationBoardList.get(0), content, type, subDomain, memberId); - - List board = boardRepository.findAll(); - assertThat(board).hasSize(1); - assertBoard(board.get(0), title, startDateTime, endDateTime); + assertOrganizationBoard(organizationBoardList.get(0), title, content, type, startDateTime, endDateTime, subDomain, memberId); } @Test void 게시글을_수정하면_수정을_요청한_사람으로_게시글_작성자가_변경된다() { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); UpdateOrganizationBoardRequest request = UpdateOrganizationBoardRequest.testBuilder() @@ -131,7 +111,7 @@ void cleanUp() { .content("변경 이후의 내용") .startDateTime(LocalDateTime.of(2021, 4, 1, 0, 0)) .endDateTime(LocalDateTime.of(2021, 4, 7, 0, 0)) - .type(OrganizationBoardType.EVENT) + .type(OrganizationBoardCategory.EVENT) .build(); // when @@ -146,7 +126,7 @@ void cleanUp() { @Test void 그룹_게시물을_좋아요하면_게시물_좋아요_테이블에_새로운_컬럼이_추가된다() { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); LikeOrganizationBoardRequest request = LikeOrganizationBoardRequest.testInstance(organizationBoard.getId()); @@ -167,7 +147,7 @@ void cleanUp() { @Test void 이미_해당_게시물에_좋아요를_누른경우_또_누를수_없다() { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardCategory.RECRUIT); organizationBoard.addLike(memberId); organizationBoardRepository.save(organizationBoard); @@ -186,7 +166,7 @@ void cleanUp() { @Test void 그룹_게시물_좋아요를_취소요청하면_기존의_좋아요_컬럼이_사라진다() { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardCategory.RECRUIT); organizationBoard.addLike(memberId); organizationBoardRepository.save(organizationBoard); @@ -207,7 +187,7 @@ void cleanUp() { @Test void 그룹_게시물_좋아요를_취소_요청시_좋아요를_누르지_않은경우_에러가_발생한다() { // given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, 999L, "이전의 게시글", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); LikeOrganizationBoardRequest request = LikeOrganizationBoardRequest.testInstance(organizationBoard.getId()); @@ -219,7 +199,7 @@ void cleanUp() { @Test void 게시물을_삭제하면_백업이_되고_삭제된다() { //given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시글", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시글", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); //when @@ -231,17 +211,14 @@ void cleanUp() { List deleteOrganizationBoardList = deleteOrganizationBoardRepository.findAll(); assertThat(deleteOrganizationBoardList).hasSize(1); - assertDeletedBoardOrganization(deleteOrganizationBoardList.get(0), organizationBoard.getId(), organizationBoard.getSubDomain(), organizationBoard.getType()); - - List deleteBoardList = deleteBoardRepository.findAll(); - assertThat(deleteBoardList).hasSize(1); - assertDeletedBoard(deleteBoardList.get(0), organizationBoard.getTitle(), organizationBoard.getMemberId(), organizationBoard.getStartDateTime(), organizationBoard.getEndDateTime()); + assertDeletedBoardOrganization(deleteOrganizationBoardList.get(0), organizationBoard.getId(), organizationBoard.getSubDomain(), organizationBoard.getCategory(), organizationBoard.getMemberId(), + organizationBoard.getTitle(), organizationBoard.getStartDateTime(), organizationBoard.getEndDateTime()); } @Test void 게시물을_삭제할때_해당_그룹의_게시물이_아닌경우_에러가_발생한다() { //given - OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "title", OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "title", OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); //when & then @@ -263,31 +240,25 @@ private void assertOrganizationBoardLike(OrganizationBoardLike organizationBoard assertThat(organizationBoardLike.getMemberId()).isEqualTo(memberId); } - private void assertBoard(Board board, String title, LocalDateTime startDateTime, LocalDateTime endDateTime) { - assertThat(board.getTitle()).isEqualTo(title); - assertThat(board.getStartDateTime()).isEqualTo(startDateTime); - assertThat(board.getEndDateTime()).isEqualTo(endDateTime); - } - - private void assertDeletedBoard(DeleteBoard deleteBoard, String title, Long memberId, LocalDateTime startDateTime, LocalDateTime endDateTime) { - assertThat(deleteBoard.getTitle()).isEqualTo(title); - assertThat(deleteBoard.getMemberId()).isEqualTo(memberId); - assertThat(deleteBoard.getStartDateTime()).isEqualTo(startDateTime); - assertThat(deleteBoard.getEndDateTime()).isEqualTo(endDateTime); - } - - private void assertOrganizationBoard(OrganizationBoard organizationBoard, String content, OrganizationBoardType type, String subDomain, Long memberId) { + private void assertOrganizationBoard(OrganizationBoard organizationBoard, String title, String content, OrganizationBoardCategory type, LocalDateTime startDateTime, LocalDateTime endDateTime, String subDomain, Long memberId) { + assertThat(organizationBoard.getTitle()).isEqualTo(title); assertThat(organizationBoard.getContent()).isEqualTo(content); - assertThat(organizationBoard.getType()).isEqualTo(type); + assertThat(organizationBoard.getCategory()).isEqualTo(type); + assertThat(organizationBoard.getStartDateTime()).isEqualTo(startDateTime); + assertThat(organizationBoard.getEndDateTime()).isEqualTo(endDateTime); assertThat(organizationBoard.getSubDomain()).isEqualTo(subDomain); assertThat(organizationBoard.getMemberId()).isEqualTo(memberId); } - private void assertDeletedBoardOrganization(DeleteOrganizationBoard deletedBoard, Long backUpId, String subDomain, OrganizationBoardType type) { + private void assertDeletedBoardOrganization(DeleteOrganizationBoard deletedBoard, Long backUpId, String subDomain, OrganizationBoardCategory type, Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime) { assertThat(deletedBoard.getBackUpId()).isEqualTo(backUpId); assertThat(deletedBoard.getSubDomain()).isEqualTo(subDomain); - assertThat(deletedBoard.getOrganizationBoardType()).isEqualTo(type); + assertThat(deletedBoard.getCategory()).isEqualTo(type); assertThat(deletedBoard.getDeletedMemberId()).isEqualTo(memberId); + assertThat(deletedBoard.getMemberId()).isEqualTo(memberId); + assertThat(deletedBoard.getTitle()).isEqualTo(title); + assertThat(deletedBoard.getStartDateTime()).isEqualTo(startDateTime); + assertThat(deletedBoard.getEndDateTime()).isEqualTo(endDateTime); } } diff --git a/potato-api/src/test/java/com/potato/service/comment/BoardCommentServiceTest.java b/potato-api/src/test/java/com/potato/service/comment/BoardCommentServiceTest.java index d795bc58..085a7234 100644 --- a/potato-api/src/test/java/com/potato/service/comment/BoardCommentServiceTest.java +++ b/potato-api/src/test/java/com/potato/service/comment/BoardCommentServiceTest.java @@ -1,23 +1,22 @@ package com.potato.service.comment; -import com.potato.domain.board.BoardRepository; +import com.potato.domain.board.BoardType; import com.potato.domain.board.admin.AdminBoard; import com.potato.domain.board.admin.AdminBoardCreator; import com.potato.domain.board.admin.AdminBoardRepository; import com.potato.domain.board.organization.OrganizationBoard; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.board.organization.OrganizationBoardCreator; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; -import com.potato.domain.comment.BoardComment; -import com.potato.domain.comment.BoardCommentCreator; -import com.potato.domain.comment.BoardCommentRepository; -import com.potato.domain.comment.BoardCommentType; +import com.potato.domain.comment.*; +import com.potato.exception.model.ConflictException; import com.potato.exception.model.NotFoundException; import com.potato.service.OrganizationMemberSetUpTest; import com.potato.service.comment.dto.request.AddBoardCommentRequest; import com.potato.service.comment.dto.response.BoardCommentResponse; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -44,14 +43,13 @@ class BoardCommentServiceTest extends OrganizationMemberSetUpTest { private AdminBoardRepository adminBoardRepository; @Autowired - private BoardRepository boardRepository; + private BoardCommentLikeRepository boardCommentLikeRepository; @AfterEach void cleanUp() { super.cleanup(); organizationBoardRepository.deleteAllInBatch(); adminBoardRepository.deleteAllInBatch(); - boardRepository.deleteAllInBatch(); boardCommentRepository.deleteAll(); } @@ -60,7 +58,7 @@ void cleanUp() { @BeforeEach void setUpOrganizationBoard() { - organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시물", OrganizationBoardType.RECRUIT); + organizationBoard = OrganizationBoardCreator.create(subDomain, memberId, "게시물", OrganizationBoardCategory.RECRUIT); adminBoard = AdminBoardCreator.create("관리자 공지 게시물", memberId); } @@ -69,7 +67,7 @@ void setUpOrganizationBoard() { // given organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; String content = "부모 댓글"; AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(type, organizationBoard.getId(), null, content); @@ -88,7 +86,7 @@ void setUpOrganizationBoard() { // given adminBoardRepository.save(adminBoard); - BoardCommentType type = BoardCommentType.ADMIN_BOARD; + BoardType type = BoardType.ADMIN_BOARD; String content = "부모 댓글"; AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(type, adminBoard.getId(), null, content); @@ -107,7 +105,7 @@ void setUpOrganizationBoard() { // given organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; String content = "자식 댓글"; BoardComment rootComment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "부모 댓글"); boardCommentRepository.save(rootComment); @@ -132,7 +130,7 @@ void setUpOrganizationBoard() { // given adminBoardRepository.save(adminBoard); - BoardCommentType type = BoardCommentType.ADMIN_BOARD; + BoardType type = BoardType.ADMIN_BOARD; String content = "자식 댓글"; BoardComment rootComment = BoardCommentCreator.createRootComment(type, adminBoard.getId(), memberId, "부모 댓글"); boardCommentRepository.save(rootComment); @@ -155,7 +153,7 @@ void setUpOrganizationBoard() { @Test void 존재하지_않는_게시물에_댓글을_추가할_수_없다() { // given - AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardCommentType.ORGANIZATION_BOARD, 999L, null, "없는 게시물에 댓글"); + AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardType.ORGANIZATION_BOARD, 999L, null, "없는 게시물에 댓글"); // when & then assertThatThrownBy(() -> boardCommentService.addBoardComment(request, memberId)).isInstanceOf(NotFoundException.class); @@ -165,7 +163,7 @@ void setUpOrganizationBoard() { void boardId가_같더라도_타입이_다른경우_존재하지_않는_게시물에_취급된다() { // given adminBoardRepository.save(adminBoard); - AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardCommentType.ORGANIZATION_BOARD, adminBoard.getId(), null, "없는 게시물에 댓글"); + AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardType.ORGANIZATION_BOARD, adminBoard.getId(), null, "없는 게시물에 댓글"); // when & then assertThatThrownBy(() -> boardCommentService.addBoardComment(request, memberId)).isInstanceOf(NotFoundException.class); @@ -175,7 +173,7 @@ void setUpOrganizationBoard() { void 존재하지_않는_댓글에_대댓글을_추가할_수_없다() { // given organizationBoardRepository.save(organizationBoard); - AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardCommentType.ORGANIZATION_BOARD, organizationBoard.getId(), 999L, "대댓글"); + AddBoardCommentRequest request = AddBoardCommentRequest.testInstance(BoardType.ORGANIZATION_BOARD, organizationBoard.getId(), 999L, "대댓글"); // when & then assertThatThrownBy(() -> boardCommentService.addBoardComment(request, memberId)).isInstanceOf(NotFoundException.class); @@ -186,7 +184,7 @@ void setUpOrganizationBoard() { // given organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; BoardComment rootComment1 = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "부모 댓글1"); rootComment1.addChildComment(memberId, "자식 댓글1-1"); rootComment1.addChildComment(memberId, "자식 댓글1-2"); @@ -215,11 +213,12 @@ void setUpOrganizationBoard() { // given adminBoardRepository.save(adminBoard); - BoardCommentType type = BoardCommentType.ADMIN_BOARD; + BoardType type = BoardType.ADMIN_BOARD; BoardComment rootComment1 = BoardCommentCreator.createRootComment(type, adminBoard.getId(), memberId, "부모 댓글1"); rootComment1.addChildComment(memberId, "자식 댓글1-1"); rootComment1.addChildComment(memberId, "자식 댓글1-2"); BoardComment rootComment2 = BoardCommentCreator.createRootComment(type, adminBoard.getId(), memberId, "부모 댓글2"); + rootComment2.addLike(memberId); rootComment2.addChildComment(memberId, "자식 댓글2-1"); boardCommentRepository.saveAll(Arrays.asList(rootComment1, rootComment2)); @@ -237,6 +236,8 @@ void setUpOrganizationBoard() { assertThat(responses.get(1).getChildren()).hasSize(1); assertBoardCommentResponse(responses.get(1).getChildren().get(0), "자식 댓글2-1"); + + assertThat(responses.get(1).getBoardCommentLikeCounts()).isEqualTo(1); } @Test @@ -244,24 +245,24 @@ void setUpOrganizationBoard() { // given organizationBoardRepository.save(organizationBoard); - BoardComment rootComment1 = BoardCommentCreator.createRootComment(BoardCommentType.ORGANIZATION_BOARD, organizationBoard.getId(), memberId, "부모 댓글1"); + BoardComment rootComment1 = BoardCommentCreator.createRootComment(BoardType.ORGANIZATION_BOARD, organizationBoard.getId(), memberId, "부모 댓글1"); boardCommentRepository.save(rootComment1); // when & then - assertThatThrownBy(() -> boardCommentService.retrieveBoardCommentList(BoardCommentType.ADMIN_BOARD, 999L)).isInstanceOf(NotFoundException.class); + assertThatThrownBy(() -> boardCommentService.retrieveBoardCommentList(BoardType.ADMIN_BOARD, 999L)).isInstanceOf(NotFoundException.class); } @Test void 존재하지_않는_게시물의_댓글을_불러올_수_없다() { // when & then - assertThatThrownBy(() -> boardCommentService.retrieveBoardCommentList(BoardCommentType.ADMIN_BOARD, 999L)).isInstanceOf(NotFoundException.class); + assertThatThrownBy(() -> boardCommentService.retrieveBoardCommentList(BoardType.ADMIN_BOARD, 999L)).isInstanceOf(NotFoundException.class); } @Test void 작성한_댓글을_삭제한다() { // given organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); boardCommentRepository.save(comment); @@ -279,7 +280,7 @@ void setUpOrganizationBoard() { void 내가_작성하지_않은_댓글을_삭제할_수_없다() { // given organizationBoardRepository.save(organizationBoard); - BoardComment comment = BoardCommentCreator.createRootComment(BoardCommentType.ORGANIZATION_BOARD, organizationBoard.getId(), memberId, "댓글"); + BoardComment comment = BoardCommentCreator.createRootComment(BoardType.ORGANIZATION_BOARD, organizationBoard.getId(), memberId, "댓글"); boardCommentRepository.save(comment); // when & then @@ -290,7 +291,7 @@ void setUpOrganizationBoard() { void 삭제된_댓글은_작성자가_보이지않고_삭제된_메시지가_보인다() { // given organizationBoardRepository.save(organizationBoard); - BoardCommentType type = BoardCommentType.ORGANIZATION_BOARD; + BoardType type = BoardType.ORGANIZATION_BOARD; BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); comment.delete(); boardCommentRepository.save(comment); @@ -304,11 +305,129 @@ void setUpOrganizationBoard() { assertThat(responses.get(0).getMemberId()).isNull(); } + @Test + void 댓글에_좋아요를_한다_댓글에_좋아요수가_올라간다() { + //given + organizationBoardRepository.save(organizationBoard); + BoardType type = BoardType.ORGANIZATION_BOARD; + BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); + boardCommentRepository.save(comment); + + //when + boardCommentService.likeBoardComment(comment.getId(), memberId); + + //then + List boardCommentLikeList = boardCommentLikeRepository.findAll(); + assertThat(boardCommentLikeList).hasSize(1); + assertBoardCommentLike(boardCommentLikeList.get(0), comment.getId(), memberId); + List boardCommentList = boardCommentRepository.findAll(); + assertThat(boardCommentList.get(0).getCommentLikeCounts()).isEqualTo(1); + } + + @Test + void 대댓글에_좋아요를_하면_대댓글_좋아요수가_올라간다() { + //given + organizationBoardRepository.save(organizationBoard); + BoardType type = BoardType.ORGANIZATION_BOARD; + BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); + comment.addChildComment(memberId, "대댓글_좋아요"); + boardCommentRepository.save(comment); + + //when + boardCommentService.likeBoardComment(comment.getChildComments().get(0).getId(), memberId); + + //then + List boardCommentLikeList = boardCommentLikeRepository.findAll(); + assertThat(boardCommentLikeList).hasSize(1); + assertBoardCommentLike(boardCommentLikeList.get(0), comment.getChildComments().get(0).getId(), memberId); + List boardCommentList = boardCommentRepository.findAll(); + assertThat(boardCommentList.get(1).getCommentLikeCounts()).isEqualTo(1); + } + + @Test + void 댓글에_이미_좋아요를_했을경우_애러발생() { + //given + organizationBoardRepository.save(organizationBoard); + BoardType type = BoardType.ORGANIZATION_BOARD; + BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); + comment.addLike(memberId); + boardCommentRepository.save(comment); + + assertThatThrownBy( + () -> boardCommentService.likeBoardComment(comment.getId(), memberId) + ).isInstanceOf(ConflictException.class); + } + + @Test + void 댓글이_삭제된_댓글일_경우_애러발생() { + //given + organizationBoardRepository.save(organizationBoard); + BoardType type = BoardType.ORGANIZATION_BOARD; + BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); + comment.delete(); + boardCommentRepository.save(comment); + + assertThatThrownBy( + () -> boardCommentService.likeBoardComment(comment.getId(), memberId) + ).isInstanceOf(NotFoundException.class); + } + + @Test + void 댓글에_좋아요한것을_좋아요_취소한다() { + //given + organizationBoardRepository.save(organizationBoard); + BoardType type = BoardType.ORGANIZATION_BOARD; + BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); + comment.addLike(memberId); + boardCommentRepository.save(comment); + + //when + boardCommentService.unLikeBoardComment(comment.getId(), memberId); + + //then + List boardCommentLikeList = boardCommentLikeRepository.findAll(); + assertThat(boardCommentLikeList).isEmpty(); + List boardCommentList = boardCommentRepository.findAll(); + assertThat(boardCommentList.get(0).getCommentLikeCounts()).isEqualTo(0); + } + + @Test + void 댓글에_좋아요를_하지않았는데_좋아요취소하면_애러발생() { + //given + organizationBoardRepository.save(organizationBoard); + BoardType type = BoardType.ORGANIZATION_BOARD; + BoardComment comment = BoardCommentCreator.createRootComment(type, organizationBoard.getId(), memberId, "댓글"); + boardCommentRepository.save(comment); + + // when & then + assertThatThrownBy( + () -> boardCommentService.unLikeBoardComment(comment.getId(), memberId) + ).isInstanceOf(NotFoundException.class); + } + + @DisplayName("이미 삭제된 댓글에 누른 좋아요를 취소하려하면 NOT FOUND EXCEPTION이 발생하면서 취소할 수 없다") + @Test + void 이미_삭제된_댓글에_누른_좋아요를_취소할_수없다() { + //given + organizationBoardRepository.save(organizationBoard); + BoardComment comment = BoardCommentCreator.createRootComment(BoardType.ORGANIZATION_BOARD, organizationBoard.getId(), memberId, "댓글"); + comment.delete(); + boardCommentRepository.save(comment); + + // when & then + assertThatThrownBy(() -> boardCommentService.unLikeBoardComment(comment.getId(), memberId)).isInstanceOf(NotFoundException.class); + } + + private void assertBoardCommentLike(BoardCommentLike boardCommentLike, Long boardCommentId, Long memberId) { + assertThat(boardCommentLike.getMemberId()).isEqualTo(memberId); + assertThat(boardCommentLike.getBoardComment().getId()).isEqualTo(boardCommentId); + } + private void assertBoardCommentResponse(BoardCommentResponse response, String content) { assertThat(response.getContent()).isEqualTo(content); } - private void assertBoardComment(BoardComment boardComment, BoardCommentType type, Long boardId, Long memberId, String content, int depth) { + private void assertBoardComment(BoardComment boardComment, BoardType type, Long boardId, Long memberId, String content, int depth) { assertThat(boardComment.getType()).isEqualTo(type); assertThat(boardComment.getBoardId()).isEqualTo(boardId); assertThat(boardComment.getMemberId()).isEqualTo(memberId); diff --git a/potato-api/src/test/java/com/potato/service/schedule/ScheduleServiceTest.java b/potato-api/src/test/java/com/potato/service/schedule/ScheduleServiceTest.java index 27c2dad7..e62146b3 100644 --- a/potato-api/src/test/java/com/potato/service/schedule/ScheduleServiceTest.java +++ b/potato-api/src/test/java/com/potato/service/schedule/ScheduleServiceTest.java @@ -4,7 +4,7 @@ import com.potato.domain.board.admin.AdminBoardRepository; import com.potato.domain.board.organization.OrganizationBoard; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.service.OrganizationMemberSetUpTest; import com.potato.service.schedule.dto.request.ScheduleRequest; import com.potato.service.schedule.dto.response.ScheduleResponse; @@ -47,7 +47,7 @@ void cleanUp() { .endDateTime(LocalDateTime.of(2021, 3, 7, 0, 0)) .title("감자 신입회원 모집") .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .build(); organizationBoardRepository.save(organizationBoard); diff --git a/potato-domain/src/main/java/com/potato/domain/board/Board.java b/potato-domain/src/main/java/com/potato/domain/board/Board.java deleted file mode 100644 index 65b6f73e..00000000 --- a/potato-domain/src/main/java/com/potato/domain/board/Board.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.potato.domain.board; - -import com.potato.domain.BaseTimeEntity; -import com.potato.domain.common.DateTimeInterval; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -@Table( - indexes = @Index(name = "idx_board_id", columnList = "startDateTime") -) -public class Board extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String title; - - @Embedded - private DateTimeInterval dateTimeInterval; - - @Builder - private Board(String title, LocalDateTime startDateTime, LocalDateTime endDateTime) { - this.title = title; - this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); - } - - public static Board of(String title, LocalDateTime startDateTime, LocalDateTime endDateTime) { - return Board.builder() - .title(title) - .startDateTime(startDateTime) - .endDateTime(endDateTime) - .build(); - } - - public LocalDateTime getStartDateTime() { - return this.dateTimeInterval.getStartDateTime(); - } - - public LocalDateTime getEndDateTime() { - return this.dateTimeInterval.getEndDateTime(); - } - -} diff --git a/potato-domain/src/main/java/com/potato/domain/board/BoardInfo.java b/potato-domain/src/main/java/com/potato/domain/board/BoardInfo.java new file mode 100644 index 00000000..2766735f --- /dev/null +++ b/potato-domain/src/main/java/com/potato/domain/board/BoardInfo.java @@ -0,0 +1,46 @@ +package com.potato.domain.board; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.util.Objects; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class BoardInfo { + + @Column(nullable = false) + private String title; + + private String content; + + private String imageUrl; + + private BoardInfo(String title, String content, String imageUrl) { + this.title = title; + this.content = content; + this.imageUrl = imageUrl; + } + + public static BoardInfo of(String title, String content, String imageUrl) { + return new BoardInfo(title, content, imageUrl); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BoardInfo boardInfo = (BoardInfo) o; + return Objects.equals(title, boardInfo.title) && Objects.equals(content, boardInfo.content) && Objects.equals(imageUrl, boardInfo.imageUrl); + } + + @Override + public int hashCode() { + return Objects.hash(title, content, imageUrl); + } + +} diff --git a/potato-domain/src/main/java/com/potato/domain/board/BoardRepository.java b/potato-domain/src/main/java/com/potato/domain/board/BoardRepository.java deleted file mode 100644 index 40e72b3a..00000000 --- a/potato-domain/src/main/java/com/potato/domain/board/BoardRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.potato.domain.board; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface BoardRepository extends JpaRepository { -} diff --git a/potato-domain/src/main/java/com/potato/domain/board/BoardType.java b/potato-domain/src/main/java/com/potato/domain/board/BoardType.java new file mode 100644 index 00000000..06919550 --- /dev/null +++ b/potato-domain/src/main/java/com/potato/domain/board/BoardType.java @@ -0,0 +1,8 @@ +package com.potato.domain.board; + +public enum BoardType { + + ORGANIZATION_BOARD, + ADMIN_BOARD + +} diff --git a/potato-domain/src/main/java/com/potato/domain/board/DeleteBoard.java b/potato-domain/src/main/java/com/potato/domain/board/DeleteBoard.java deleted file mode 100644 index b96ed5b2..00000000 --- a/potato-domain/src/main/java/com/potato/domain/board/DeleteBoard.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.potato.domain.board; - -import com.potato.domain.BaseTimeEntity; -import com.potato.domain.common.DateTimeInterval; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -public class DeleteBoard extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private Long memberId; - - @Column(nullable = false) - private String title; - - @Embedded - private DateTimeInterval dateTimeInterval; - - @Builder - private DeleteBoard(Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime) { - this.memberId = memberId; - this.title = title; - this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); - } - - public static DeleteBoard of(Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime) { - return DeleteBoard.builder() - .memberId(memberId) - .title(title) - .startDateTime(startDateTime) - .endDateTime(endDateTime) - .build(); - } - - public LocalDateTime getStartDateTime() { - return this.dateTimeInterval.getStartDateTime(); - } - - public LocalDateTime getEndDateTime() { - return this.dateTimeInterval.getEndDateTime(); - } - -} diff --git a/potato-domain/src/main/java/com/potato/domain/board/DeleteBoardRepository.java b/potato-domain/src/main/java/com/potato/domain/board/DeleteBoardRepository.java deleted file mode 100644 index 32021475..00000000 --- a/potato-domain/src/main/java/com/potato/domain/board/DeleteBoardRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.potato.domain.board; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface DeleteBoardRepository extends JpaRepository { -} diff --git a/potato-domain/src/main/java/com/potato/domain/board/admin/AdminBoard.java b/potato-domain/src/main/java/com/potato/domain/board/admin/AdminBoard.java index 99592559..b33346d8 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/admin/AdminBoard.java +++ b/potato-domain/src/main/java/com/potato/domain/board/admin/AdminBoard.java @@ -1,7 +1,8 @@ package com.potato.domain.board.admin; import com.potato.domain.BaseTimeEntity; -import com.potato.domain.board.Board; +import com.potato.domain.board.BoardInfo; +import com.potato.domain.common.DateTimeInterval; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -13,47 +14,56 @@ @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Entity +@Table( + indexes = { + @Index(name = "idx_admin_board_1", columnList = "startDateTime,endDateTime"), + } +) public class AdminBoard extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "board_id", nullable = false) - private Board board; - @Column(nullable = false) private Long administratorId; - private String content; + @Embedded + private BoardInfo boardInfo; + + @Embedded + private DateTimeInterval dateTimeInterval; @Builder - public AdminBoard(Long administratorId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, String content) { + public AdminBoard(Long administratorId, String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime) { this.administratorId = administratorId; - this.board = Board.of(title, startDateTime, endDateTime); - this.content = content; - } - - public String getTitle() { - return this.board.getTitle(); + this.boardInfo = BoardInfo.of(title, content, imageUrl); + this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); } public LocalDateTime getStartDateTime() { - return this.board.getStartDateTime(); + return this.dateTimeInterval.getStartDateTime(); } public LocalDateTime getEndDateTime() { - return this.board.getEndDateTime(); + return this.dateTimeInterval.getEndDateTime(); + } + + public void updateInfo(String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime) { + this.boardInfo = BoardInfo.of(title, content, imageUrl); + this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); + } + + public String getTitle() { + return boardInfo.getTitle(); } - public void updateInfo(String title, String content, LocalDateTime startDateTime, LocalDateTime endDateTime) { - this.board = Board.of(title, startDateTime, endDateTime); - this.content = content; + public String getContent() { + return boardInfo.getContent(); } - public DeleteAdminBoard delete(Long adminMemberId) { - return DeleteAdminBoard.newBackupInstance(this, adminMemberId); + public String getImageUrl() { + return boardInfo.getImageUrl(); } } diff --git a/potato-domain/src/main/java/com/potato/domain/board/admin/DeleteAdminBoard.java b/potato-domain/src/main/java/com/potato/domain/board/admin/DeleteAdminBoard.java deleted file mode 100644 index 04390692..00000000 --- a/potato-domain/src/main/java/com/potato/domain/board/admin/DeleteAdminBoard.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.potato.domain.board.admin; - -import com.potato.domain.BaseTimeEntity; -import com.potato.domain.board.DeleteBoard; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -import javax.persistence.*; -import java.time.LocalDateTime; - -@Getter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@Entity -public class DeleteAdminBoard extends BaseTimeEntity { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private Long backUpId; - - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "board_id", nullable = false) - private DeleteBoard board; - - @Column(nullable = false) - private Long deleteAdministratorId; - - private String content; - - @Builder - public DeleteAdminBoard(Long backUpId, Long administratorId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, String content, Long deleteAdministratorId) { - this.backUpId = backUpId; - this.board = DeleteBoard.of(administratorId, title, startDateTime, endDateTime); - this.content = content; - this.deleteAdministratorId = deleteAdministratorId; - } - - public static DeleteAdminBoard newBackupInstance(AdminBoard adminBoard, Long adminMemberId) { - return DeleteAdminBoard.builder() - .backUpId(adminBoard.getId()) - .administratorId(adminBoard.getAdministratorId()) - .title(adminBoard.getTitle()) - .startDateTime(adminBoard.getStartDateTime()) - .endDateTime(adminBoard.getEndDateTime()) - .content(adminBoard.getContent()) - .deleteAdministratorId(adminMemberId) - .build(); - } - -} diff --git a/potato-domain/src/main/java/com/potato/domain/board/admin/DeleteAdminBoardRepository.java b/potato-domain/src/main/java/com/potato/domain/board/admin/DeleteAdminBoardRepository.java deleted file mode 100644 index dfce91e3..00000000 --- a/potato-domain/src/main/java/com/potato/domain/board/admin/DeleteAdminBoardRepository.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.potato.domain.board.admin; - -import org.springframework.data.jpa.repository.JpaRepository; - -public interface DeleteAdminBoardRepository extends JpaRepository { -} diff --git a/potato-domain/src/main/java/com/potato/domain/board/admin/repository/AdminBoardRepositoryCustomImpl.java b/potato-domain/src/main/java/com/potato/domain/board/admin/repository/AdminBoardRepositoryCustomImpl.java index 62bfdba5..f90996f1 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/admin/repository/AdminBoardRepositoryCustomImpl.java +++ b/potato-domain/src/main/java/com/potato/domain/board/admin/repository/AdminBoardRepositoryCustomImpl.java @@ -9,7 +9,6 @@ import java.time.LocalTime; import java.util.List; -import static com.potato.domain.board.QBoard.board; import static com.potato.domain.board.admin.QAdminBoard.adminBoard; @RequiredArgsConstructor @@ -20,17 +19,15 @@ public class AdminBoardRepositoryCustomImpl implements AdminBoardRepositoryCusto @Override public List findAllBetweenDate(LocalDate startDate, LocalDate endDate) { return queryFactory.selectFrom(adminBoard) - .innerJoin(adminBoard.board, board).fetchJoin() .where( - board.dateTimeInterval.startDateTime.before(LocalDateTime.of(endDate, LocalTime.MAX)), - board.dateTimeInterval.endDateTime.after(LocalDateTime.of(startDate, LocalTime.MIN)) + adminBoard.dateTimeInterval.startDateTime.before(LocalDateTime.of(endDate, LocalTime.MAX)), + adminBoard.dateTimeInterval.endDateTime.after(LocalDateTime.of(startDate, LocalTime.MIN)) ).fetch(); } @Override public AdminBoard findAdminBoardById(Long adminBoardId) { return queryFactory.selectFrom(adminBoard) - .innerJoin(adminBoard.board, board).fetchJoin() .where( adminBoard.id.eq(adminBoardId) ) diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/DeleteOrganizationBoard.java b/potato-domain/src/main/java/com/potato/domain/board/organization/DeleteOrganizationBoard.java index bbe3407b..e4076cc0 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/DeleteOrganizationBoard.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/DeleteOrganizationBoard.java @@ -1,7 +1,10 @@ package com.potato.domain.board.organization; import com.potato.domain.BaseTimeEntity; -import com.potato.domain.board.DeleteBoard; +import com.potato.domain.board.BoardInfo; +import com.potato.domain.common.delete.DeletedTrackingInfo; +import com.potato.domain.common.delete.BackUpInfo; +import com.potato.domain.common.DateTimeInterval; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -19,75 +22,107 @@ public class DeleteOrganizationBoard extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(nullable = false) - private Long backUpId; - - @Column(nullable = false) - private LocalDateTime backUpCreatedDateTime; - - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "board_id", nullable = false) - private DeleteBoard board; - @Column(nullable = false, length = 50) private String subDomain; + @Column(nullable = false) + private Long memberId; + @Column(nullable = false, length = 30) @Enumerated(EnumType.STRING) - private OrganizationBoardType organizationBoardType; + private OrganizationBoardCategory category; + + @Embedded + private BoardInfo boardInfo; - private Long deletedMemberId; + @Embedded + private DateTimeInterval dateTimeInterval; - private Long deletedAdminMemberId; + private int likesCount; - private String content; + @Embedded + private DeletedTrackingInfo deletedTrackingInfo; - private String imageUrl; + @Embedded + private BackUpInfo backUpInfo; @Builder - public DeleteOrganizationBoard(Long backUpId, String subDomain, Long memberId, OrganizationBoardType organizationBoardType, String title, - String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, LocalDateTime backUpCreatedDateTime, Long deletedMemberId, Long deletedAdminMemberId) { - this.backUpId = backUpId; - this.board = DeleteBoard.of(memberId, title, startDateTime, endDateTime); + public DeleteOrganizationBoard(Long backUpId, String subDomain, Long memberId, OrganizationBoardCategory category, String title, + String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, int likesCount, + LocalDateTime backUpCreatedDateTime, Long deletedMemberId, Long deletedAdminMemberId) { + this.memberId = memberId; + this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); this.subDomain = subDomain; - this.organizationBoardType = organizationBoardType; - this.content = content; - this.imageUrl = imageUrl; - this.backUpCreatedDateTime = backUpCreatedDateTime; - this.deletedMemberId = deletedMemberId; - this.deletedAdminMemberId = deletedAdminMemberId; + this.category = category; + this.boardInfo = BoardInfo.of(title, content, imageUrl); + this.likesCount = likesCount; + this.backUpInfo = BackUpInfo.of(backUpId, backUpCreatedDateTime); + this.deletedTrackingInfo = DeletedTrackingInfo.of(deletedMemberId, deletedAdminMemberId); } public static DeleteOrganizationBoard newBackUpInstance(OrganizationBoard organizationBoard, Long memberId) { return DeleteOrganizationBoard.builder() - .backUpId(organizationBoard.getId()) - .deletedMemberId(memberId) .memberId(organizationBoard.getMemberId()) .subDomain(organizationBoard.getSubDomain()) - .organizationBoardType(organizationBoard.getType()) + .category(organizationBoard.getCategory()) .title(organizationBoard.getTitle()) .content(organizationBoard.getContent()) .imageUrl(organizationBoard.getImageUrl()) .startDateTime(organizationBoard.getStartDateTime()) .endDateTime(organizationBoard.getEndDateTime()) + .likesCount(builder().likesCount) .backUpCreatedDateTime(organizationBoard.getCreatedDateTime()) + .backUpId(organizationBoard.getId()) + .deletedMemberId(memberId) .build(); } public static DeleteOrganizationBoard newBackUpInstanceByAdmin(OrganizationBoard organizationBoard, Long adminMemberId) { return DeleteOrganizationBoard.builder() - .backUpId(organizationBoard.getId()) - .deletedAdminMemberId(adminMemberId) .memberId(organizationBoard.getMemberId()) .subDomain(organizationBoard.getSubDomain()) - .organizationBoardType(organizationBoard.getType()) + .category(organizationBoard.getCategory()) .title(organizationBoard.getTitle()) .content(organizationBoard.getContent()) .imageUrl(organizationBoard.getImageUrl()) .startDateTime(organizationBoard.getStartDateTime()) .endDateTime(organizationBoard.getEndDateTime()) + .backUpId(organizationBoard.getId()) .backUpCreatedDateTime(organizationBoard.getCreatedDateTime()) + .deletedAdminMemberId(adminMemberId) .build(); } + public LocalDateTime getStartDateTime() { + return this.dateTimeInterval.getStartDateTime(); + } + + public LocalDateTime getEndDateTime() { + return this.dateTimeInterval.getEndDateTime(); + } + + public String getTitle() { + return boardInfo.getTitle(); + } + + public String getContent() { + return boardInfo.getContent(); + } + + public String getImageUrl() { + return boardInfo.getImageUrl(); + } + + public Long getBackUpId() { + return backUpInfo.getBackUpId(); + } + + public Long getDeletedMemberId() { + return deletedTrackingInfo.getDeletedMemberId(); + } + + public Long getDeletedAdminMemberId() { + return deletedTrackingInfo.getDeletedAdminMemberId(); + } + } diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoard.java b/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoard.java index 20046ef4..b047e143 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoard.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoard.java @@ -1,7 +1,8 @@ package com.potato.domain.board.organization; import com.potato.domain.BaseTimeEntity; -import com.potato.domain.board.Board; +import com.potato.domain.board.BoardInfo; +import com.potato.domain.common.DateTimeInterval; import com.potato.exception.model.ConflictException; import com.potato.exception.model.NotFoundException; import lombok.AccessLevel; @@ -20,8 +21,9 @@ @Table( indexes = { @Index(name = "idx_organization_board_1", columnList = "subDomain"), - @Index(name = "idx_organization_board_2", columnList = "likesCount,id"), - @Index(name = "idx_organization_board_3", columnList = "type") + @Index(name = "idx_organization_board_2", columnList = "likesCount"), + @Index(name = "idx_organization_board_3", columnList = "category"), + @Index(name = "idx_organization_board_4", columnList = "startDateTime,endDateTime") } ) public class OrganizationBoard extends BaseTimeEntity { @@ -30,46 +32,42 @@ public class OrganizationBoard extends BaseTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true) - @JoinColumn(name = "board_id", nullable = false) - private Board board; - @Column(nullable = false, length = 50) private String subDomain; @Column(nullable = false) private Long memberId; - private String content; - - private String imageUrl; - @Column(nullable = false, length = 30) @Enumerated(EnumType.STRING) - private OrganizationBoardType type; + private OrganizationBoardCategory category; - @OneToMany(mappedBy = "organizationBoard", cascade = CascadeType.ALL, orphanRemoval = true) - private final List organizationBoardLikeList = new ArrayList<>(); + @Embedded + private BoardInfo boardInfo; + + @Embedded + private DateTimeInterval dateTimeInterval; private int likesCount; + @OneToMany(mappedBy = "organizationBoard", cascade = CascadeType.ALL, orphanRemoval = true) + private final List organizationBoardLikeList = new ArrayList<>(); + @Builder - public OrganizationBoard(String subDomain, Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, String content, String imageUrl, OrganizationBoardType type) { + public OrganizationBoard(String subDomain, Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, String content, String imageUrl, OrganizationBoardCategory category) { this.subDomain = subDomain; this.memberId = memberId; - this.board = Board.of(title, startDateTime, endDateTime); - this.content = content; - this.imageUrl = imageUrl; - this.type = type; + this.category = category; + this.boardInfo = BoardInfo.of(title, content, imageUrl); + this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); this.likesCount = 0; } - public void updateInfo(String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardType type, Long memberId) { - this.content = content; - this.imageUrl = imageUrl; - this.type = type; + public void updateInfo(String title, String content, String imageUrl, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardCategory category, Long memberId) { + this.boardInfo = BoardInfo.of(title, content, imageUrl); + this.category = category; this.memberId = memberId; - this.board = Board.of(title, startDateTime, endDateTime); + this.dateTimeInterval = DateTimeInterval.of(startDateTime, endDateTime); } public void addLike(Long memberId) { @@ -99,24 +97,32 @@ private OrganizationBoardLike findLike(Long memberId) { .orElseThrow(() -> new NotFoundException(String.format("멤버 (%s)는 게시물 (%s)에 좋아요를 누른 적이 없습니다", memberId, this.id))); } - public String getTitle() { - return this.board.getTitle(); + public DeleteOrganizationBoard delete(Long memberId) { + return DeleteOrganizationBoard.newBackUpInstance(this, memberId); + } + + public DeleteOrganizationBoard deleteByAdmin(Long adminMemberId) { + return DeleteOrganizationBoard.newBackUpInstanceByAdmin(this, adminMemberId); } public LocalDateTime getStartDateTime() { - return this.board.getStartDateTime(); + return this.dateTimeInterval.getStartDateTime(); } public LocalDateTime getEndDateTime() { - return this.board.getEndDateTime(); + return this.dateTimeInterval.getEndDateTime(); } - public DeleteOrganizationBoard delete(Long memberId) { - return DeleteOrganizationBoard.newBackUpInstance(this, memberId); + public String getTitle() { + return boardInfo.getTitle(); } - public DeleteOrganizationBoard deleteByAdmin(Long adminMemberId) { - return DeleteOrganizationBoard.newBackUpInstanceByAdmin(this, adminMemberId); + public String getContent() { + return boardInfo.getContent(); + } + + public String getImageUrl() { + return boardInfo.getImageUrl(); } } diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardType.java b/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCategory.java similarity index 64% rename from potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardType.java rename to potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCategory.java index 70de99cb..23dca92e 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardType.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCategory.java @@ -1,6 +1,6 @@ package com.potato.domain.board.organization; -public enum OrganizationBoardType { +public enum OrganizationBoardCategory { RECRUIT, EVENT diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCreator.java b/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCreator.java index 7c00dfda..c4f09dc6 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCreator.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/OrganizationBoardCreator.java @@ -8,23 +8,23 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class OrganizationBoardCreator { - public static OrganizationBoard create(String subDomain, Long memberId, String title, OrganizationBoardType type) { + public static OrganizationBoard create(String subDomain, Long memberId, String title, OrganizationBoardCategory category) { return OrganizationBoard.builder() .subDomain(subDomain) .memberId(memberId) .title(title) - .type(type) + .category(category) .startDateTime(LocalDateTime.of(2021, 3, 5, 0, 0)) .endDateTime(LocalDateTime.of(2021, 3, 7, 0, 0)) .build(); } - public static OrganizationBoard create(String subDomain, Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardType type) { + public static OrganizationBoard create(String subDomain, Long memberId, String title, LocalDateTime startDateTime, LocalDateTime endDateTime, OrganizationBoardCategory category) { return OrganizationBoard.builder() .subDomain(subDomain) .memberId(memberId) .title(title) - .type(type) + .category(category) .startDateTime(startDateTime) .endDateTime(endDateTime) .build(); diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustom.java b/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustom.java index bbf094e0..12481a7d 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustom.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustom.java @@ -1,7 +1,7 @@ package com.potato.domain.board.organization.repository; import com.potato.domain.board.organization.OrganizationBoard; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.board.organization.repository.dto.BoardWithOrganizationDto; import java.time.LocalDateTime; @@ -15,7 +15,7 @@ public interface OrganizationBoardRepositoryCustom { OrganizationBoard findOrganizationBoardByIdAndSubDomain(Long organizationBoardId, String subDomain); - List findAllWithOrganizationByTypeLessThanOrderByIdDescLimit(OrganizationBoardType type, long lastOrganizationBoardId, int size); + List findAllWithOrganizationByTypeLessThanOrderByIdDescLimit(OrganizationBoardCategory type, long lastOrganizationBoardId, int size); List findAllBetweenDate(LocalDate startDate, LocalDate endDate); diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustomImpl.java b/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustomImpl.java index dff775e5..bd5a76c9 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustomImpl.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/repository/OrganizationBoardRepositoryCustomImpl.java @@ -1,7 +1,7 @@ package com.potato.domain.board.organization.repository; import com.potato.domain.board.organization.OrganizationBoard; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.board.organization.repository.dto.BoardWithOrganizationDto; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; @@ -14,7 +14,6 @@ import java.time.LocalDateTime; import java.time.LocalTime; -import static com.potato.domain.board.QBoard.board; import static com.potato.domain.board.organization.QOrganizationBoard.organizationBoard; import static com.potato.domain.organization.QOrganization.organization; @@ -26,7 +25,6 @@ public class OrganizationBoardRepositoryCustomImpl implements OrganizationBoardR @Override public OrganizationBoard findOrganizationBoardById(Long id) { return queryFactory.selectFrom(organizationBoard) - .innerJoin(organizationBoard.board, board).fetchJoin() .where( organizationBoard.id.eq(id) ).fetchOne(); @@ -35,7 +33,6 @@ public OrganizationBoard findOrganizationBoardById(Long id) { @Override public OrganizationBoard findOrganizationBoardByIdAndSubDomain(Long organizationBoardId, String subDomain) { return queryFactory.selectFrom(organizationBoard) - .innerJoin(organizationBoard.board, board).fetchJoin() .where( organizationBoard.id.eq(organizationBoardId), organizationBoard.subDomain.eq(subDomain) @@ -43,7 +40,7 @@ public OrganizationBoard findOrganizationBoardByIdAndSubDomain(Long organization } @Override - public List findAllWithOrganizationByTypeLessThanOrderByIdDescLimit(OrganizationBoardType type, long lastOrganizationBoardId, int size) { + public List findAllWithOrganizationByTypeLessThanOrderByIdDescLimit(OrganizationBoardCategory category, long lastOrganizationBoardId, int size) { return queryFactory.select(Projections.fields(BoardWithOrganizationDto.class, organizationBoard.subDomain.as("orgSubDomain"), organization.name.as("orgName"), @@ -53,19 +50,19 @@ public List findAllWithOrganizationByTypeLessThanOrder organization.membersCount.as("orgMembersCount"), organization.followersCount.as("orgFollowersCount"), organizationBoard.id.as("boardId"), - organizationBoard.board.title.as("boardTitle"), - organizationBoard.content.as("boardContent"), - organizationBoard.imageUrl.as("boardImageUrl"), - organizationBoard.type.as("boardType"), - organizationBoard.board.dateTimeInterval.startDateTime.as("boardStartDateTime"), - organizationBoard.board.dateTimeInterval.endDateTime.as("boardEndDateTime"), + organizationBoard.boardInfo.title.as("boardTitle"), + organizationBoard.boardInfo.content.as("boardContent"), + organizationBoard.boardInfo.imageUrl.as("boardImageUrl"), + organizationBoard.category.as("boardCategory"), + organizationBoard.dateTimeInterval.startDateTime.as("boardStartDateTime"), + organizationBoard.dateTimeInterval.endDateTime.as("boardEndDateTime"), organizationBoard.createdDateTime, organizationBoard.lastModifiedDateTime )) .from(organizationBoard) .innerJoin(organization).on(organizationBoard.subDomain.eq(organization.subDomain)) .where( - eqType(type), + eqCategory(category), lessThanId(lastOrganizationBoardId) ) .orderBy(organizationBoard.id.desc()) @@ -73,11 +70,11 @@ public List findAllWithOrganizationByTypeLessThanOrder .fetch(); } - private BooleanExpression eqType(OrganizationBoardType type) { - if (type == null) { + private BooleanExpression eqCategory(OrganizationBoardCategory category) { + if (category == null) { return null; } - return organizationBoard.type.eq(type); + return organizationBoard.category.eq(category); } private BooleanExpression lessThanId(Long organizationBoardId) { @@ -90,21 +87,19 @@ private BooleanExpression lessThanId(Long organizationBoardId) { @Override public List findAllBetweenDate(LocalDate startDate, LocalDate endDate) { return queryFactory.selectFrom(organizationBoard) - .innerJoin(organizationBoard.board, board).fetchJoin() .where( - board.dateTimeInterval.startDateTime.before(LocalDateTime.of(endDate, LocalTime.MAX)), - board.dateTimeInterval.endDateTime.after(LocalDateTime.of(startDate, LocalTime.MIN)) + organizationBoard.dateTimeInterval.startDateTime.before(LocalDateTime.of(endDate, LocalTime.MAX)), + organizationBoard.dateTimeInterval.endDateTime.after(LocalDateTime.of(startDate, LocalTime.MIN)) ).fetch(); } @Override public List findAllByBetweenDateTimeWithLimit(LocalDateTime startDateTime, LocalDateTime endDateTime, int size) { return queryFactory.selectFrom(organizationBoard) - .innerJoin(organizationBoard.board, board).fetchJoin() .where( - board.dateTimeInterval.endDateTime.between(startDateTime, endDateTime) + organizationBoard.dateTimeInterval.endDateTime.between(startDateTime, endDateTime) ) - .orderBy(board.dateTimeInterval.endDateTime.asc()) + .orderBy(organizationBoard.dateTimeInterval.endDateTime.asc()) .limit(size) .fetch(); } diff --git a/potato-domain/src/main/java/com/potato/domain/board/organization/repository/dto/BoardWithOrganizationDto.java b/potato-domain/src/main/java/com/potato/domain/board/organization/repository/dto/BoardWithOrganizationDto.java index 370d8d7a..50fec150 100644 --- a/potato-domain/src/main/java/com/potato/domain/board/organization/repository/dto/BoardWithOrganizationDto.java +++ b/potato-domain/src/main/java/com/potato/domain/board/organization/repository/dto/BoardWithOrganizationDto.java @@ -1,6 +1,6 @@ package com.potato.domain.board.organization.repository.dto; -import com.potato.domain.board.organization.OrganizationBoardType; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.organization.OrganizationCategory; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -26,7 +26,7 @@ public class BoardWithOrganizationDto { private String boardTitle; private String boardContent; private String boardImageUrl; - private OrganizationBoardType boardType; + private OrganizationBoardCategory boardCategory; private LocalDateTime boardStartDateTime; private LocalDateTime boardEndDateTime; private LocalDateTime createdDateTime; diff --git a/potato-domain/src/main/java/com/potato/domain/comment/BoardComment.java b/potato-domain/src/main/java/com/potato/domain/comment/BoardComment.java index 35025f85..bce32345 100644 --- a/potato-domain/src/main/java/com/potato/domain/comment/BoardComment.java +++ b/potato-domain/src/main/java/com/potato/domain/comment/BoardComment.java @@ -1,7 +1,10 @@ package com.potato.domain.comment; import com.potato.domain.BaseTimeEntity; +import com.potato.domain.board.BoardType; import com.potato.exception.ErrorCode; +import com.potato.exception.model.ConflictException; +import com.potato.exception.model.NotFoundException; import com.potato.exception.model.ValidationException; import lombok.AccessLevel; import lombok.Getter; @@ -25,7 +28,7 @@ public class BoardComment extends BaseTimeEntity { @Column(nullable = false, length = 30) @Enumerated(EnumType.STRING) - private BoardCommentType type; + private BoardType type; @Column(nullable = false) private Long boardId; @@ -34,7 +37,7 @@ public class BoardComment extends BaseTimeEntity { private Long memberId; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "board_comment_id") + @JoinColumn(name = "parent_id") private BoardComment parentComment; @OneToMany(mappedBy = "parentComment", cascade = CascadeType.PERSIST) @@ -49,7 +52,13 @@ public class BoardComment extends BaseTimeEntity { @Column(nullable = false) private boolean isDeleted; - private BoardComment(BoardComment parentComment, BoardCommentType type, Long boardId, Long memberId, String content, int depth) { + @OneToMany(mappedBy = "boardComment", cascade = CascadeType.ALL, orphanRemoval = true) + private final List boardCommentLikeList = new ArrayList<>(); + + @Column(nullable = false) + private int commentLikeCounts; + + private BoardComment(BoardComment parentComment, BoardType type, Long boardId, Long memberId, String content, int depth) { this.parentComment = parentComment; this.type = type; this.boardId = boardId; @@ -57,9 +66,10 @@ private BoardComment(BoardComment parentComment, BoardCommentType type, Long boa this.content = content; this.depth = depth; this.isDeleted = false; + this.commentLikeCounts = 0; } - public static BoardComment newRootComment(BoardCommentType type, Long boardId, Long memberId, String content) { + public static BoardComment newRootComment(BoardType type, Long boardId, Long memberId, String content) { return new BoardComment(null, type, boardId, memberId, content, 0); } @@ -78,4 +88,39 @@ public void delete() { this.isDeleted = true; } + public void addLike(Long memberId) { + if (alreadyLike(memberId)) { + throw new ConflictException(String.format("멤버 (%s)는 (%s) 댓글에 좋아요를 누른 상태입니다.", memberId, this.id)); + } + validateNotDeletedBoardComment(); + BoardCommentLike boardCommentLike = BoardCommentLike.of(this, memberId); + this.boardCommentLikeList.add(boardCommentLike); + this.commentLikeCounts++; + } + + private boolean alreadyLike(Long memberId) { + return this.boardCommentLikeList.stream() + .anyMatch(boardCommentLike -> boardCommentLike.isSameMember(memberId)); + } + + public void deleteLike(Long memberId) { + validateNotDeletedBoardComment(); + BoardCommentLike boardCommentLike = findBoardComment(memberId); + this.boardCommentLikeList.remove(boardCommentLike); + this.commentLikeCounts--; + } + + private void validateNotDeletedBoardComment() { + if (this.isDeleted) { + throw new NotFoundException(String.format("댓글 (%s)는 삭제된 댓글입니다.", this.id)); + } + } + + private BoardCommentLike findBoardComment(Long memberId) { + return this.boardCommentLikeList.stream() + .filter(boardCommentLike -> boardCommentLike.isSameMember(memberId)) + .findFirst() + .orElseThrow(() -> new NotFoundException(String.format("(%s)가 좋아요 한 댓글 (%s)을 찾을 수 없습니다.", memberId, this.id))); + } + } diff --git a/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentCreator.java b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentCreator.java index ebcb5855..9106cead 100644 --- a/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentCreator.java +++ b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentCreator.java @@ -1,5 +1,6 @@ package com.potato.domain.comment; +import com.potato.domain.board.BoardType; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -9,7 +10,7 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class BoardCommentCreator { - public static BoardComment createRootComment(BoardCommentType type, Long boardId, Long memberId, String content) { + public static BoardComment createRootComment(BoardType type, Long boardId, Long memberId, String content) { return BoardComment.newRootComment(type, boardId, memberId, content); } diff --git a/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentLike.java b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentLike.java new file mode 100644 index 00000000..8fc74320 --- /dev/null +++ b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentLike.java @@ -0,0 +1,39 @@ +package com.potato.domain.comment; + +import com.potato.domain.BaseTimeEntity; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class BoardCommentLike extends BaseTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "board_comment_id", nullable = false) + private BoardComment boardComment; + + @Column(nullable = false) + private Long memberId; + + private BoardCommentLike(BoardComment boardComment, Long memberId) { + this.boardComment = boardComment; + this.memberId = memberId; + } + + public static BoardCommentLike of(BoardComment boardComment, Long memberId) { + return new BoardCommentLike(boardComment, memberId); + } + + public boolean isSameMember(Long memberId) { + return this.memberId.equals(memberId); + } + +} diff --git a/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentLikeRepository.java b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentLikeRepository.java new file mode 100644 index 00000000..5fa455c7 --- /dev/null +++ b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentLikeRepository.java @@ -0,0 +1,6 @@ +package com.potato.domain.comment; + +import org.springframework.data.jpa.repository.JpaRepository; + +public interface BoardCommentLikeRepository extends JpaRepository { +} diff --git a/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentType.java b/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentType.java deleted file mode 100644 index 281d887d..00000000 --- a/potato-domain/src/main/java/com/potato/domain/comment/BoardCommentType.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.potato.domain.comment; - -public enum BoardCommentType { - - ORGANIZATION_BOARD, - ADMIN_BOARD - -} diff --git a/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustom.java b/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustom.java index 6bb8197b..dec9ead8 100644 --- a/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustom.java +++ b/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustom.java @@ -1,7 +1,7 @@ package com.potato.domain.comment.repository; import com.potato.domain.comment.BoardComment; -import com.potato.domain.comment.BoardCommentType; +import com.potato.domain.board.BoardType; import java.util.List; @@ -9,6 +9,6 @@ public interface BoardCommentRepositoryCustom { BoardComment findBoardCommentByIdAndMemberId(Long boardCommentId, Long memberId); - List findRootCommentByTypeAndBoardId(BoardCommentType type, Long boardId); + List findRootCommentByTypeAndBoardId(BoardType type, Long boardId); } diff --git a/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustomImpl.java b/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustomImpl.java index af3bf574..e2e09aff 100644 --- a/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustomImpl.java +++ b/potato-domain/src/main/java/com/potato/domain/comment/repository/BoardCommentRepositoryCustomImpl.java @@ -1,7 +1,7 @@ package com.potato.domain.comment.repository; import com.potato.domain.comment.BoardComment; -import com.potato.domain.comment.BoardCommentType; +import com.potato.domain.board.BoardType; import com.potato.domain.comment.QBoardComment; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; @@ -33,7 +33,7 @@ private BooleanExpression eqMemberId(Long memberId) { } @Override - public List findRootCommentByTypeAndBoardId(BoardCommentType type, Long boardId) { + public List findRootCommentByTypeAndBoardId(BoardType type, Long boardId) { return queryFactory.selectFrom(boardComment).distinct() .leftJoin(boardComment.childComments, new QBoardComment("child")).fetchJoin() .where( diff --git a/potato-domain/src/main/java/com/potato/domain/common/delete/BackUpInfo.java b/potato-domain/src/main/java/com/potato/domain/common/delete/BackUpInfo.java new file mode 100644 index 00000000..9b473444 --- /dev/null +++ b/potato-domain/src/main/java/com/potato/domain/common/delete/BackUpInfo.java @@ -0,0 +1,45 @@ +package com.potato.domain.common.delete; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.Column; +import javax.persistence.Embeddable; +import java.time.LocalDateTime; +import java.util.Objects; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class BackUpInfo { + + @Column(nullable = false) + private Long backUpId; + + @Column(nullable = false) + private LocalDateTime backUpCreatedDateTime; + + private BackUpInfo(Long backUpId, LocalDateTime backUpCreatedDateTime) { + this.backUpId = backUpId; + this.backUpCreatedDateTime = backUpCreatedDateTime; + } + + public static BackUpInfo of(Long backUpId, LocalDateTime backUpCreatedDateTime) { + return new BackUpInfo(backUpId, backUpCreatedDateTime); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + BackUpInfo that = (BackUpInfo) o; + return Objects.equals(backUpId, that.backUpId) && Objects.equals(backUpCreatedDateTime, that.backUpCreatedDateTime); + } + + @Override + public int hashCode() { + return Objects.hash(backUpId, backUpCreatedDateTime); + } + +} diff --git a/potato-domain/src/main/java/com/potato/domain/common/delete/DeletedTrackingInfo.java b/potato-domain/src/main/java/com/potato/domain/common/delete/DeletedTrackingInfo.java new file mode 100644 index 00000000..994611a4 --- /dev/null +++ b/potato-domain/src/main/java/com/potato/domain/common/delete/DeletedTrackingInfo.java @@ -0,0 +1,41 @@ +package com.potato.domain.common.delete; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.persistence.Embeddable; +import java.util.Objects; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Embeddable +public class DeletedTrackingInfo { + + private Long deletedMemberId; + + private Long deletedAdminMemberId; + + private DeletedTrackingInfo(Long deletedMemberId, Long deletedAdminMemberId) { + this.deletedMemberId = deletedMemberId; + this.deletedAdminMemberId = deletedAdminMemberId; + } + + public static DeletedTrackingInfo of(Long deletedMemberId, Long deletedAdminMemberId) { + return new DeletedTrackingInfo(deletedMemberId, deletedAdminMemberId); + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + DeletedTrackingInfo that = (DeletedTrackingInfo) o; + return Objects.equals(deletedMemberId, that.deletedMemberId) && Objects.equals(deletedAdminMemberId, that.deletedAdminMemberId); + } + + @Override + public int hashCode() { + return Objects.hash(deletedMemberId, deletedAdminMemberId); + } + +} diff --git a/potato-domain/src/main/java/com/potato/domain/member/ClassNumber.java b/potato-domain/src/main/java/com/potato/domain/member/ClassNumber.java index dc8611a6..dc1e118b 100644 --- a/potato-domain/src/main/java/com/potato/domain/member/ClassNumber.java +++ b/potato-domain/src/main/java/com/potato/domain/member/ClassNumber.java @@ -8,6 +8,7 @@ import javax.persistence.Column; import javax.persistence.Embeddable; import java.time.LocalDateTime; +import java.util.Objects; import static com.potato.exception.ErrorCode.VALIDATION_CLASS_NUMBER_EXCEPTION; @@ -57,4 +58,17 @@ public static ClassNumber of(Integer classNumber) { return new ClassNumber(classNumber); } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ClassNumber that = (ClassNumber) o; + return Objects.equals(classNumber, that.classNumber); + } + + @Override + public int hashCode() { + return Objects.hash(classNumber); + } + } diff --git a/potato-domain/src/main/java/com/potato/domain/member/MemberMajor.java b/potato-domain/src/main/java/com/potato/domain/member/MemberMajor.java index 1dbddd56..201d08ca 100644 --- a/potato-domain/src/main/java/com/potato/domain/member/MemberMajor.java +++ b/potato-domain/src/main/java/com/potato/domain/member/MemberMajor.java @@ -9,7 +9,12 @@ public enum MemberMajor { IT_ICT(Department.IT, "ICT융합학과"), IT_COMPUTER(Department.IT, "컴퓨터공학과"), - VISUAL_DESIGN(Department.DESIGN, "시각정보디자인학과"); + INDUSTRIAL_SECURITY(Department.IT, "산업보안학과"), + VISUAL_DESIGN(Department.DESIGN, "시각정보디자인학과"), + INTERIOR_DESIGN(Department.DESIGN, "실내건축디자인학과"), + TEXTILE_FASHION_DESIGN(Department.DESIGN, "섬유패션디자인학과"), + MUSIC(Department.ART, "음악학과"), + PERFORMING_ARTS(Department.ART, "공연예술학과"); private final Department department; private final String name; @@ -22,7 +27,8 @@ public String getDepartment() { @RequiredArgsConstructor private enum Department { IT("IT학부"), - DESIGN("디자인학부"); + DESIGN("디자인학부"), + ART("예술학부"); private final String department; } diff --git a/potato-domain/src/main/java/com/potato/domain/organization/Organization.java b/potato-domain/src/main/java/com/potato/domain/organization/Organization.java index 3fff6b1c..44a313c7 100644 --- a/potato-domain/src/main/java/com/potato/domain/organization/Organization.java +++ b/potato-domain/src/main/java/com/potato/domain/organization/Organization.java @@ -22,7 +22,7 @@ uniqueConstraints = @UniqueConstraint(name = "uni_organization_1", columnNames = "subDomain"), indexes = { @Index(name = "idx_organization_1", columnList = "category"), - @Index(name = "idx_organization_2", columnList = "followersCount,id") + @Index(name = "idx_organization_2", columnList = "followersCount") } ) public class Organization extends BaseTimeEntity { diff --git a/potato-domain/src/main/resources/db/migration/V1__init.sql b/potato-domain/src/main/resources/db/migration/V1__init.sql index f0251f2c..2aea5af7 100644 --- a/potato-domain/src/main/resources/db/migration/V1__init.sql +++ b/potato-domain/src/main/resources/db/migration/V1__init.sql @@ -1,27 +1,3 @@ -CREATE TABLE IF NOT EXISTS SPRING_SESSION -( - SESSION_ID CHAR(36) NOT NULL, - CREATION_TIME BIGINT NOT NULL, - LAST_ACCESS_TIME BIGINT NOT NULL, - MAX_INACTIVE_INTERVAL INT NOT NULL, - PRINCIPAL_NAME VARCHAR(100), - CONSTRAINT SPRING_SESSION_PK PRIMARY KEY (SESSION_ID) -); - -CREATE INDEX IF NOT EXISTS SPRING_SESSION_IX1 ON SPRING_SESSION (LAST_ACCESS_TIME); - -CREATE TABLE IF NOT EXISTS SPRING_SESSION_ATTRIBUTES -( - SESSION_ID CHAR(36) NOT NULL, - ATTRIBUTE_NAME VARCHAR(200) NOT NULL, - ATTRIBUTE_BYTES MEDIUMBLOB NOT NULL, - CONSTRAINT SPRING_SESSION_ATTRIBUTES_PK PRIMARY KEY (SESSION_ID, ATTRIBUTE_NAME), - CONSTRAINT SPRING_SESSION_ATTRIBUTES_FK FOREIGN KEY (SESSION_ID) REFERENCES SPRING_SESSION (SESSION_ID) ON DELETE CASCADE -); - -CREATE INDEX IF NOT EXISTS SPRING_SESSION_ATTRIBUTES_IX1 ON SPRING_SESSION_ATTRIBUTES (SESSION_ID); - - CREATE TABLE IF NOT EXISTS `member` ( `id` BIGINT NOT NULL AUTO_INCREMENT, @@ -64,7 +40,8 @@ CREATE TABLE IF NOT EXISTS `organization` `last_modified_date_time` DATETIME(6) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uni_organization_1` (`sub_domain`), - KEY `idx_organization_1` (`category`) + KEY `idx_organization_1` (`category`), + KEY `idx_organization_2` (`followers_count`) ) ENGINE = InnoDB; @@ -94,47 +71,40 @@ CREATE TABLE IF NOT EXISTS `organization_follower` ) ENGINE = InnoDB; -CREATE TABLE IF NOT EXISTS `board` +CREATE TABLE IF NOT EXISTS `organization_board` ( `id` BIGINT NOT NULL AUTO_INCREMENT, + `sub_domain` varchar(50) NOT NULL, + `member_id` BIGINT NOT NULL, + `category` VARCHAR(30) NOT NULL, `title` VARCHAR(200) NOT NULL, + `content` VARCHAR(2048) DEFAULT NULL, `start_date_time` DATETIME(6) NOT NULL, `end_date_time` DATETIME(6) NOT NULL, - `created_date_time` DATETIME(6) DEFAULT NULL, - `last_modified_date_time` DATETIME(6) DEFAULT NULL, - PRIMARY KEY (`id`), - KEY `idx_board_1` (`start_date_time`) -) ENGINE = InnoDB; - - -CREATE TABLE IF NOT EXISTS `organization_board` -( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `board_id` BIGINT NOT NULL, - `sub_domain` varchar(50) NOT NULL, - `member_id` BIGINT NOT NULL, - `content` VARCHAR(2048) DEFAULT NULL, - `image_url` VARCHAR(2048) DEFAULT NULL, - `type` VARCHAR(30) NOT NULL, - `likes_count` INTEGER NOT NULL DEFAULT 0, - `created_date_time` DATETIME(6) DEFAULT NULL, - `last_modified_date_time` DATETIME(6) DEFAULT NULL, + `image_url` VARCHAR(2048) DEFAULT NULL, + `likes_count` INTEGER NOT NULL DEFAULT 0, + `created_date_time` DATETIME(6) DEFAULT NULL, + `last_modified_date_time` DATETIME(6) DEFAULT NULL, PRIMARY KEY (`id`), - FOREIGN KEY (`board_id`) REFERENCES `board` (`id`), - KEY `idx_organization_board_1` (`sub_domain`) + KEY `idx_organization_board_1` (`sub_domain`), + KEY `idx_organization_board_2` (`likes_count`), + KEY `idx_organization_board_3` (`category`), + KEY `idx_organization_board_4` (`start_date_time`, `end_date_time`) ) ENGINE = InnoDB; CREATE TABLE IF NOT EXISTS `admin_board` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `board_id` BIGINT NOT NULL, - `administrator_id` BIGINT NOT NULL, + `id` BIGINT NOT NULL AUTO_INCREMENT, + `administrator_id` BIGINT NOT NULL, + `title` VARCHAR(200) NOT NULL, `content` VARCHAR(2048) DEFAULT NULL, + `start_date_time` DATETIME(6) NOT NULL, + `end_date_time` DATETIME(6) NOT NULL, `created_date_time` DATETIME(6) DEFAULT NULL, `last_modified_date_time` DATETIME(6) DEFAULT NULL, PRIMARY KEY (`id`), - FOREIGN KEY (`board_id`) REFERENCES `board` (`id`) + KEY `admin_board_1` (`start_date_time`, `end_date_time`) ) ENGINE = InnoDB; @@ -150,62 +120,52 @@ CREATE TABLE IF NOT EXISTS `organization_board_like` ) ENGINE = InnoDB; +CREATE TABLE IF NOT EXISTS `delete_organization_board` +( + `id` BIGINT NOT NULL AUTO_INCREMENT, + `sub_domain` VARCHAR(50) NOT NULL, + `member_id` BIGINT NOT NULL, + `category` VARCHAR(30) NOT NULL, + `title` VARCHAR(200) NOT NULL, + `content` VARCHAR(2048) DEFAULT NULL, + `start_date_time` DATETIME(6) NOT NULL, + `end_date_time` DATETIME(6) NOT NULL, + `image_url` VARCHAR(2048) DEFAULT NULL, + `back_up_id` BIGINT NOT NULL, + `deleted_member_id` BIGINT DEFAULT NULL, + `deleted_admin_member_id` BIGINT DEFAULT NULL, + `back_up_created_date_time` DATETIME(6) NOT NULL, + `created_date_time` DATETIME(6) DEFAULT NULL, + `last_modified_date_time` DATETIME(6) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE = InnoDB; + + CREATE TABLE IF NOT EXISTS `board_comment` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `type` VARCHAR(30) NOT NULL, `board_id` BIGINT NOT NULL, `member_id` BIGINT NOT NULL, - `board_comment_id` BIGINT DEFAULT NULL, + `parent_id` BIGINT DEFAULT NULL, `content` VARCHAR(2048) NOT NULL, `depth` INTEGER NOT NULL DEFAULT 0, `is_deleted` TINYINT(1) NOT NULL DEFAULT FALSE, `created_date_time` DATETIME(6) DEFAULT NULL, `last_modified_date_time` DATETIME(6) DEFAULT NULL, + `comment_like_counts` INT NOT NULL DEFAULT 0, PRIMARY KEY (`id`), KEY `idx_board_comment_1` (`type`, `board_id`) ) ENGINE = InnoDB; -CREATE TABLE IF NOT EXISTS `delete_board` +CREATE TABLE IF NOT EXISTS `board_comment_like` ( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `member_id` BIGINT NOT NULL, - `title` VARCHAR(200) NOT NULL, - `start_date_time` DATETIME(6) NOT NULL, - `end_date_time` DATETIME(6) NOT NULL, + `id` BIGINT NOT NULL AUTO_INCREMENT, + `board_comment_id` BIGINT NOT NULL, + `member_id` BIGINT NOT NULL, `created_date_time` DATETIME(6) DEFAULT NULL, `last_modified_date_time` DATETIME(6) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE = InnoDB; - - -CREATE TABLE IF NOT EXISTS `delete_organization_board` -( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `back_up_id` BIGINT NOT NULL, - `back_up_created_date_time` DATETIME(6) NOT NULL, - `board_id` BIGINT NOT NULL, - `sub_domain` VARCHAR(50) NOT NULL, - `organization_board_type` VARCHAR(30) NOT NULL, - `deleted_member_id` BIGINT DEFAULT NULL, - `deleted_admin_member_id` BIGINT DEFAULT NULL, - `content` VARCHAR(2048) DEFAULT NULL, - `image_url` VARCHAR(2048) DEFAULT NULL, - `created_date_time` DATETIME(6) DEFAULT NULL, - `last_modified_date_time` DATETIME(6) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE = InnoDB; - - -CREATE TABLE IF NOT EXISTS `delete_admin_board` -( - `id` BIGINT NOT NULL AUTO_INCREMENT, - `back_up_id` BIGINT NOT NULL, - `board_id` BIGINT NOT NULL, - `delete_administrator_id` BIGINT NOT NULL, - `content` VARCHAR(2048) DEFAULT NULL, - `created_date_time` DATETIME(6) DEFAULT NULL, - `last_modified_date_time` DATETIME(6) DEFAULT NULL, - PRIMARY KEY (`id`) + PRIMARY KEY (`id`), + FOREIGN KEY (`board_comment_id`) REFERENCES `board_comment` (`id`) ) ENGINE = InnoDB; diff --git a/potato-domain/src/main/resources/db/migration/V2__add_index_organization.sql b/potato-domain/src/main/resources/db/migration/V2__add_index_organization.sql deleted file mode 100644 index 1d71691c..00000000 --- a/potato-domain/src/main/resources/db/migration/V2__add_index_organization.sql +++ /dev/null @@ -1,5 +0,0 @@ -ALTER TABLE `organization` - ADD INDEX `idx_organization_2` (`followers_count`); - -ALTER TABLE `organization_board` - ADD INDEX `idx_organization_board_2` (`likes_count`); diff --git a/potato-domain/src/main/resources/db/migration/V2__adminboard_add_imageurl.sql b/potato-domain/src/main/resources/db/migration/V2__adminboard_add_imageurl.sql new file mode 100644 index 00000000..6328db86 --- /dev/null +++ b/potato-domain/src/main/resources/db/migration/V2__adminboard_add_imageurl.sql @@ -0,0 +1,2 @@ +ALTER TABLE `admin_board` + ADD `image_url` VARCHAR(2048) DEFAULT NULL; diff --git a/potato-domain/src/main/resources/db/migration/V3__deleteorganizationboard_add_likescount.sql b/potato-domain/src/main/resources/db/migration/V3__deleteorganizationboard_add_likescount.sql new file mode 100644 index 00000000..0a443e9f --- /dev/null +++ b/potato-domain/src/main/resources/db/migration/V3__deleteorganizationboard_add_likescount.sql @@ -0,0 +1,2 @@ +ALTER TABLE `delete_organization_board` + ADD `likes_count` INTEGER NOT NULL; diff --git a/potato-domain/src/main/resources/db/migration/V4_add_index_organization_board.sql b/potato-domain/src/main/resources/db/migration/V4_add_index_organization_board.sql deleted file mode 100644 index 5ba7d2f0..00000000 --- a/potato-domain/src/main/resources/db/migration/V4_add_index_organization_board.sql +++ /dev/null @@ -1,2 +0,0 @@ -ALTER TABLE `organization_board` - ADD INDEX `idx_organization_3` (`type`); diff --git a/potato-domain/src/main/resources/db/migration/v3__update_index_organization.sql b/potato-domain/src/main/resources/db/migration/v3__update_index_organization.sql deleted file mode 100644 index 36fb348f..00000000 --- a/potato-domain/src/main/resources/db/migration/v3__update_index_organization.sql +++ /dev/null @@ -1,11 +0,0 @@ -ALTER TABLE `organization_board` - DROP INDEX `idx_organization_board_2`; - -ALTER TABLE `organization` - DROP INDEX `idx_organization_2`; - -ALTER TABLE `organization` - ADD INDEX `idx_organization_2` (`followers_count`, `id`); - -ALTER TABLE `organization_board` - ADD INDEX `idx_organization_board_2` (`likes_count`, `id`); diff --git a/potato-domain/src/test/java/com/potato/domain/board/OrganizationBoardRepositoryTest.java b/potato-domain/src/test/java/com/potato/domain/board/OrganizationBoardRepositoryTest.java index caaa3f3d..6e379b99 100644 --- a/potato-domain/src/test/java/com/potato/domain/board/OrganizationBoardRepositoryTest.java +++ b/potato-domain/src/test/java/com/potato/domain/board/OrganizationBoardRepositoryTest.java @@ -1,9 +1,9 @@ package com.potato.domain.board; import com.potato.domain.board.organization.OrganizationBoard; +import com.potato.domain.board.organization.OrganizationBoardCategory; import com.potato.domain.board.organization.OrganizationBoardCreator; import com.potato.domain.board.organization.OrganizationBoardRepository; -import com.potato.domain.board.organization.OrganizationBoardType; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -21,65 +21,9 @@ class OrganizationBoardRepositoryTest { @Autowired private OrganizationBoardRepository organizationBoardRepository; - @Autowired - private BoardRepository boardRepository; - @AfterEach void cleanUp() { organizationBoardRepository.deleteAllInBatch(); - boardRepository.deleteAllInBatch(); - } - - @Test - void OrganizaitonBoard저장시_Board도_함께_저장된다() { - // given - OrganizationBoard organizationBoard = OrganizationBoard.builder() - .subDomain("subDomain") - .memberId(1L) - .startDateTime(LocalDateTime.of(2021, 3, 5, 0, 0)) - .endDateTime(LocalDateTime.of(2021, 3, 7, 0, 0)) - .title("감자 신입회원 모집") - .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") - .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) - .build(); - - // when - organizationBoardRepository.save(organizationBoard); - - // then - List boardList = boardRepository.findAll(); - assertThat(boardList).hasSize(1); - - List organizationRepository = organizationBoardRepository.findAll(); - assertThat(organizationRepository).hasSize(1); - } - - @Test - void OrganizationBoard를_삭제하면_Board도_삭제된다() { - // given - OrganizationBoard organizationBoard = OrganizationBoard.builder() - .subDomain("subDomain") - .memberId(1L) - .startDateTime(LocalDateTime.of(2021, 3, 5, 0, 0)) - .endDateTime(LocalDateTime.of(2021, 3, 7, 0, 0)) - .title("감자 신입회원 모집") - .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") - .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) - .build(); - - // when - organizationBoardRepository.save(organizationBoard); - - organizationBoardRepository.delete(organizationBoard); - - // then - List boardList = boardRepository.findAll(); - assertThat(boardList).isEmpty(); - - List organizationRepository = organizationBoardRepository.findAll(); - assertThat(organizationRepository).isEmpty(); } @Test @@ -96,7 +40,7 @@ void cleanUp() { .title("감자 신입회원 모집") .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .build(); organizationBoardRepository.save(organizationBoard); @@ -121,7 +65,7 @@ void cleanUp() { .title("감자 신입회원 모집") .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .build(); organizationBoardRepository.save(organizationBoard); @@ -146,7 +90,7 @@ void cleanUp() { .title("감자 신입회원 모집") .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .build(); organizationBoardRepository.save(organizationBoard); @@ -171,7 +115,7 @@ void cleanUp() { .title("감자 신입회원 모집") .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .build(); organizationBoardRepository.save(organizationBoard); @@ -196,7 +140,7 @@ void cleanUp() { .title("감자 신입회원 모집") .content("감자팀 신입회원을 모집합니다. 많은 참여바랍니다") .imageUrl("http://image.com") - .type(OrganizationBoardType.RECRUIT) + .category(OrganizationBoardCategory.RECRUIT) .build(); organizationBoardRepository.save(organizationBoard); @@ -212,7 +156,7 @@ void cleanUp() { // given LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 2, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 2, 11, 59); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); // when @@ -227,7 +171,7 @@ void cleanUp() { // given LocalDateTime startDateTime = LocalDateTime.of(2021, 3, 31, 11, 59); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 2, 11, 59); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); // when @@ -242,7 +186,7 @@ void cleanUp() { // given LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 2, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 3, 0, 1); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); // when @@ -257,7 +201,7 @@ void cleanUp() { // given LocalDateTime startDateTime = LocalDateTime.of(2021, 3, 31, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 3, 31, 11, 59); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); // when @@ -272,7 +216,7 @@ void cleanUp() { // given LocalDateTime startDateTime = LocalDateTime.of(2021, 3, 31, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 1, 0, 1); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); // when @@ -287,7 +231,7 @@ void cleanUp() { // given LocalDateTime startDateTime = LocalDateTime.of(2021, 4, 2, 0, 0); LocalDateTime endDateTime = LocalDateTime.of(2021, 4, 10, 0, 0); - OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardType.RECRUIT); + OrganizationBoard organizationBoard = OrganizationBoardCreator.create("subDomain", 1L, "게시물", startDateTime, endDateTime, OrganizationBoardCategory.RECRUIT); organizationBoardRepository.save(organizationBoard); // when diff --git a/version.txt b/version.txt index 937cd784..7becae11 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -v0.3.1 +v0.3.2