diff --git a/src/main/java/com/run_us/server/domains/crew/controller/CrewController.java b/src/main/java/com/run_us/server/domains/crew/controller/CrewController.java index abbb2067..7716b050 100644 --- a/src/main/java/com/run_us/server/domains/crew/controller/CrewController.java +++ b/src/main/java/com/run_us/server/domains/crew/controller/CrewController.java @@ -1,11 +1,10 @@ package com.run_us.server.domains.crew.controller; -import com.run_us.server.domains.crew.controller.model.request.CreateJoinRequest; -import com.run_us.server.domains.crew.controller.model.request.ReviewJoinRequest; +import com.run_us.server.domains.crew.controller.model.request.*; import com.run_us.server.domains.crew.controller.model.response.*; import com.run_us.server.domains.crew.domain.enums.CrewJoinRequestStatus; +import com.run_us.server.domains.crew.service.usecase.CommandCrewUseCase; import com.run_us.server.domains.crew.service.usecase.CrewJoinUseCase; -import com.run_us.server.domains.crew.controller.model.request.CreateCrewRequest; import com.run_us.server.domains.crew.controller.model.response.CreateCrewResponse; import com.run_us.server.domains.crew.service.usecase.CreateCrewUseCase; import com.run_us.server.domains.crew.service.usecase.CrewMemberUseCase; @@ -30,6 +29,7 @@ public class CrewController { private final CrewJoinUseCase crewJoinUseCase; private final CreateCrewUseCase createCrewUseCase; private final CrewMemberUseCase crewMemberUseCase; + private final CommandCrewUseCase commandCrewUseCase; @PostMapping @@ -43,6 +43,37 @@ public ResponseEntity> createCrew( return ResponseEntity.status(HttpStatus.CREATED).body(response); } + @PatchMapping("/{crewPublicId}") + public ResponseEntity> updateCrewInfo( + @PathVariable String crewPublicId, + @RequestBody UpdateCrewInfoRequest requestDto, + @CurrentUser String currentUserPublicId){ + log.info("action=update_crew_info userPublicId={}, crewPublicId={}", currentUserPublicId, crewPublicId); + + SuccessResponse response = commandCrewUseCase.updateCrewInfo(crewPublicId, requestDto, currentUserPublicId); + return ResponseEntity.ok().body(response); + } + + @PatchMapping("/{crewPublicId}/join-rule") + public ResponseEntity> updateCrewJoinRule( + @PathVariable String crewPublicId, + @RequestBody UpdateCrewJoinTypeRequest requestDto, + @CurrentUser String currentUserPublicId){ + log.info("action=update_crew_join_rule userPublicId={}, crewPublicId={}", currentUserPublicId, crewPublicId); + + SuccessResponse response = commandCrewUseCase.updateCrewJoinRule(crewPublicId, requestDto, currentUserPublicId); + return ResponseEntity.ok().body(response); + } + + @DeleteMapping("/{crewPublicId}") + public ResponseEntity> closeCrew( + @PathVariable String crewPublicId, + @CurrentUser String currentUserPublicId){ + log.info("action=delete_crew userPublicId={}, crewPublicId={}", currentUserPublicId, crewPublicId); + + SuccessResponse response = commandCrewUseCase.closeCrew(crewPublicId, currentUserPublicId); + return ResponseEntity.ok().body(response); + } @PostMapping("/{crewPublicId}/join-requests") public ResponseEntity> requestJoin( diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewErrorCode.java b/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewErrorCode.java index 478d2cfc..ebc3a93d 100644 --- a/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewErrorCode.java +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewErrorCode.java @@ -19,7 +19,8 @@ public enum CrewErrorCode implements CustomResponseCode { // 403 - RECENTLY_REJECTED_REQUEST("CEH4032","Recently rejected request","Recently rejected request",HttpStatus.FORBIDDEN) + RECENTLY_REJECTED_REQUEST("CEH4032","Recently rejected request","Recently rejected request",HttpStatus.FORBIDDEN), + FORBIDDEN_UPDATE_CREW("CEH4033","Forbidden update crew", "Forbidden update crew",HttpStatus.FORBIDDEN) ; private final String code; diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewHttpResponseCode.java b/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewHttpResponseCode.java index 048912f9..f130708a 100644 --- a/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewHttpResponseCode.java +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/enums/CrewHttpResponseCode.java @@ -7,8 +7,8 @@ @RequiredArgsConstructor public enum CrewHttpResponseCode implements CustomResponseCode { CREW_CREATED("CSH2011", HttpStatus.CREATED, "크루 생성 성공", "크루 생성 성공"), - CREW_HOME_INFO_FETCHED("CSH2002", HttpStatus.OK, "크루 홈 데이터 조회 성공", "크루 홈 데이터 조회 성공"), - CREW_FETCHED("CSH2003", HttpStatus.OK, "크루 정보 조회 성공", "크루 정보 조회 성공"), + CREW_HOME_FETCHED("CSH2002", HttpStatus.OK, "크루 홈 조회 성공", "크루 홈 조회 성공"), + CREW_INFO_PAGE_FETCHED("CSH2003", HttpStatus.OK, "크루 정보 페이지 조회 성공", "크루 정보 페이지 조회 성공"), CREW_UPDATED("CSH2004", HttpStatus.OK, "크루 정보 수정 성공", "크루 정보 수정 성공"), CREW_JOIN_RULE_UPDATED("CSH2005", HttpStatus.OK, "크루 가입 방식 수정 성공", "크루 가입 방식 수정 성공"), CREW_SEARCH_SUCCESS("CSH2006", HttpStatus.OK, "크루 검색 성공", "크루 검색 성공"), diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/request/UpdateCrewInfoRequest.java b/src/main/java/com/run_us/server/domains/crew/controller/model/request/UpdateCrewInfoRequest.java new file mode 100644 index 00000000..d25458c7 --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/request/UpdateCrewInfoRequest.java @@ -0,0 +1,28 @@ +package com.run_us.server.domains.crew.controller.model.request; + +import com.run_us.server.domains.crew.domain.CrewDescription; +import com.run_us.server.domains.crew.domain.enums.CrewThemeType; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UpdateCrewInfoRequest { + private String title; + private String intro; + private String location; + private String profileImageUrl; + private CrewThemeType crewType; + + public CrewDescription from(CrewDescription old) { + return CrewDescription.builder() + .title(this.title) + .intro(this.intro) + .location(this.location) + .profileImageUrl(this.profileImageUrl) + .themeType(this.crewType) + .joinQuestion(old.getJoinQuestion()) + .build(); + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/request/UpdateCrewJoinTypeRequest.java b/src/main/java/com/run_us/server/domains/crew/controller/model/request/UpdateCrewJoinTypeRequest.java new file mode 100644 index 00000000..a0516e7e --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/request/UpdateCrewJoinTypeRequest.java @@ -0,0 +1,15 @@ +package com.run_us.server.domains.crew.controller.model.request; + +import com.run_us.server.domains.crew.domain.CrewDescription; +import com.run_us.server.domains.crew.domain.enums.CrewJoinType; +import com.run_us.server.domains.crew.domain.enums.CrewThemeType; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UpdateCrewJoinTypeRequest { + private CrewJoinType joinType; + private String joinQuestion; +} diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/response/CloseCrewResponse.java b/src/main/java/com/run_us/server/domains/crew/controller/model/response/CloseCrewResponse.java new file mode 100644 index 00000000..c76ae9d2 --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/response/CloseCrewResponse.java @@ -0,0 +1,25 @@ +package com.run_us.server.domains.crew.controller.model.response; + +import com.run_us.server.domains.crew.domain.Crew; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class CloseCrewResponse { + private String crewPublicId; + + @Builder + private CloseCrewResponse(String crewPublicId) { + this.crewPublicId = crewPublicId; + } + + public static CloseCrewResponse from(Crew crew) { + return CloseCrewResponse.builder() + .crewPublicId(crew.getPublicId()) + .build(); + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/response/UpdateCrewInfoResponse.java b/src/main/java/com/run_us/server/domains/crew/controller/model/response/UpdateCrewInfoResponse.java new file mode 100644 index 00000000..94e3b613 --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/response/UpdateCrewInfoResponse.java @@ -0,0 +1,23 @@ +package com.run_us.server.domains.crew.controller.model.response; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UpdateCrewInfoResponse { + private String crewPublicId; + + @Builder + public UpdateCrewInfoResponse(String crewPublicId) { + this.crewPublicId = crewPublicId; + } + + public static UpdateCrewInfoResponse from(String crewPublicId) { + return UpdateCrewInfoResponse.builder() + .crewPublicId(crewPublicId) + .build(); + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/controller/model/response/UpdateCrewJoinRuleResponse.java b/src/main/java/com/run_us/server/domains/crew/controller/model/response/UpdateCrewJoinRuleResponse.java new file mode 100644 index 00000000..16133201 --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/controller/model/response/UpdateCrewJoinRuleResponse.java @@ -0,0 +1,31 @@ +package com.run_us.server.domains.crew.controller.model.response; + +import com.run_us.server.domains.crew.domain.Crew; +import com.run_us.server.domains.crew.domain.enums.CrewJoinType; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class UpdateCrewJoinRuleResponse { + private String crewPublicId; + private CrewJoinType joinType; + private String joinQuestion; + + @Builder + public UpdateCrewJoinRuleResponse(String crewPublicId, CrewJoinType joinType, String joinQuestion) { + this.crewPublicId = crewPublicId; + this.joinType = joinType; + this.joinQuestion = joinQuestion; + } + + public static UpdateCrewJoinRuleResponse from(Crew crew) { + return UpdateCrewJoinRuleResponse.builder() + .crewPublicId(crew.getPublicId()) + .joinType(crew.getJoinType()) + .joinQuestion(crew.getCrewDescription().getJoinQuestion()) + .build(); + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/domain/Crew.java b/src/main/java/com/run_us/server/domains/crew/domain/Crew.java index f286bb87..4911afd5 100644 --- a/src/main/java/com/run_us/server/domains/crew/domain/Crew.java +++ b/src/main/java/com/run_us/server/domains/crew/domain/Crew.java @@ -1,6 +1,5 @@ package com.run_us.server.domains.crew.domain; -import com.run_us.server.domains.crew.domain.enums.CrewJoinRequestStatus; import com.run_us.server.domains.crew.domain.enums.CrewJoinType; import com.run_us.server.domains.crew.domain.enums.CrewStatus; import com.run_us.server.domains.user.domain.User; @@ -75,6 +74,15 @@ public void removeMember(Integer userId) { this.memberCount--; } + public boolean isOwner(Integer userId) { + return this.owner.getId().equals(userId); + } + + public void updateCrewInfo(CrewDescription crewDescription) { + this.crewDescription = crewDescription; + } + + @Override public void prePersist() { this.publicId = TSID.Factory.getTsid().toString(); @@ -95,4 +103,13 @@ public Crew( this.status = CrewStatus.ACTIVE; this.crewMemberships = crewMemberships; } + + public void updateJoinRule(CrewJoinType joinType, String joinQuestion) { + this.joinType = joinType; + this.getCrewDescription().updateJoinQuestion(joinQuestion); + } + + public void close() { + this.status = CrewStatus.SUSPENDED; + } } diff --git a/src/main/java/com/run_us/server/domains/crew/domain/CrewDescription.java b/src/main/java/com/run_us/server/domains/crew/domain/CrewDescription.java index 2c0517f5..dc2f45c7 100644 --- a/src/main/java/com/run_us/server/domains/crew/domain/CrewDescription.java +++ b/src/main/java/com/run_us/server/domains/crew/domain/CrewDescription.java @@ -74,4 +74,8 @@ public boolean equals(Object obj) { public int hashCode() { return Objects.hash(this.title, this.profileImageUrl, this.location, this.intro, this.themeType, this.joinQuestion); } + + public void updateJoinQuestion(String joinQuestion) { + this.joinQuestion = joinQuestion; + } } diff --git a/src/main/java/com/run_us/server/domains/crew/exception/CrewException.java b/src/main/java/com/run_us/server/domains/crew/exception/CrewException.java new file mode 100644 index 00000000..08b49c1a --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/exception/CrewException.java @@ -0,0 +1,19 @@ +package com.run_us.server.domains.crew.exception; + +import com.run_us.server.global.exception.BusinessException; +import com.run_us.server.global.exception.code.CustomResponseCode; + +public class CrewException extends BusinessException { + + protected CrewException(CustomResponseCode errorCode, String logMessage) { + super(errorCode, logMessage); + } + + public CrewException(CustomResponseCode errorCode) { + super(errorCode); + } + + public static CrewException of(CustomResponseCode errorCode) { + return new CrewException(errorCode); + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/service/CommandCrewService.java b/src/main/java/com/run_us/server/domains/crew/service/CommandCrewService.java new file mode 100644 index 00000000..2035b27f --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/service/CommandCrewService.java @@ -0,0 +1,51 @@ +package com.run_us.server.domains.crew.service; + +import com.run_us.server.domains.crew.controller.model.enums.CrewErrorCode; +import com.run_us.server.domains.crew.controller.model.enums.CrewException; +import com.run_us.server.domains.crew.controller.model.request.CreateCrewRequest; +import com.run_us.server.domains.crew.controller.model.request.UpdateCrewInfoRequest; +import com.run_us.server.domains.crew.controller.model.request.UpdateCrewJoinTypeRequest; +import com.run_us.server.domains.crew.domain.Crew; +import com.run_us.server.domains.crew.domain.CrewDescription; +import com.run_us.server.domains.crew.repository.CrewRepository; +import com.run_us.server.domains.user.domain.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class CommandCrewService { + + private final CrewRepository crewRepository; + + public Crew saveCrew(CreateCrewRequest requestDto, User creator) { + Crew crew = requestDto.toEntity(creator); + return crewRepository.save(crew); + } + + public void updateCrewInfo(UpdateCrewInfoRequest requestDto, Crew crew, Integer userId) { + checkCrewOwner(crew, userId); + + CrewDescription newCrewDescription = requestDto.from(crew.getCrewDescription()); + crew.updateCrewInfo(newCrewDescription); + } + + public void updateCrewJoinRule(UpdateCrewJoinTypeRequest requestDto, Crew crew, Integer userId) { + checkCrewOwner(crew, userId); + + crew.updateJoinRule(requestDto.getJoinType(), requestDto.getJoinQuestion()); + } + + public void closeCrew(Crew crew, Integer userId) { + checkCrewOwner(crew, userId); + + crew.close(); + } + + + private void checkCrewOwner(Crew crew, Integer userId) { + if (!crew.isOwner(userId)) { + throw new CrewException(CrewErrorCode.FORBIDDEN_UPDATE_CREW); + } + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/service/CrewCommandService.java b/src/main/java/com/run_us/server/domains/crew/service/CrewCommandService.java deleted file mode 100644 index 46943739..00000000 --- a/src/main/java/com/run_us/server/domains/crew/service/CrewCommandService.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.run_us.server.domains.crew.service; - -import com.run_us.server.domains.crew.controller.model.request.CreateCrewRequest; -import com.run_us.server.domains.crew.domain.Crew; -import com.run_us.server.domains.crew.repository.CrewRepository; -import com.run_us.server.domains.user.domain.User; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class CrewCommandService { - - private final CrewRepository crewRepository; - - public Crew saveCrew(CreateCrewRequest requestDto, User creator) { - Crew crew = requestDto.toEntity(creator); - return crewRepository.save(crew); - } -} diff --git a/src/main/java/com/run_us/server/domains/crew/service/usecase/CommandCrewUseCase.java b/src/main/java/com/run_us/server/domains/crew/service/usecase/CommandCrewUseCase.java new file mode 100644 index 00000000..8e927594 --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/service/usecase/CommandCrewUseCase.java @@ -0,0 +1,16 @@ +package com.run_us.server.domains.crew.service.usecase; + +import com.run_us.server.domains.crew.controller.model.request.UpdateCrewInfoRequest; +import com.run_us.server.domains.crew.controller.model.request.UpdateCrewJoinTypeRequest; +import com.run_us.server.domains.crew.controller.model.response.CloseCrewResponse; +import com.run_us.server.domains.crew.controller.model.response.UpdateCrewInfoResponse; +import com.run_us.server.domains.crew.controller.model.response.UpdateCrewJoinRuleResponse; +import com.run_us.server.global.common.SuccessResponse; + +public interface CommandCrewUseCase { + SuccessResponse updateCrewInfo(String crewPublicId, UpdateCrewInfoRequest requestDto, String userPublicId); + + SuccessResponse updateCrewJoinRule(String crewPublicId, UpdateCrewJoinTypeRequest requestDto, String userPublicId); + + SuccessResponse closeCrew(String crewPublicId, String userPublicId); +} diff --git a/src/main/java/com/run_us/server/domains/crew/service/usecase/CommandCrewUseCaseImpl.java b/src/main/java/com/run_us/server/domains/crew/service/usecase/CommandCrewUseCaseImpl.java new file mode 100644 index 00000000..b52f3b1d --- /dev/null +++ b/src/main/java/com/run_us/server/domains/crew/service/usecase/CommandCrewUseCaseImpl.java @@ -0,0 +1,57 @@ +package com.run_us.server.domains.crew.service.usecase; + +import com.run_us.server.domains.crew.controller.model.enums.CrewHttpResponseCode; +import com.run_us.server.domains.crew.controller.model.request.UpdateCrewInfoRequest; +import com.run_us.server.domains.crew.controller.model.request.UpdateCrewJoinTypeRequest; +import com.run_us.server.domains.crew.controller.model.response.CloseCrewResponse; +import com.run_us.server.domains.crew.controller.model.response.UpdateCrewInfoResponse; +import com.run_us.server.domains.crew.controller.model.response.UpdateCrewJoinRuleResponse; +import com.run_us.server.domains.crew.domain.Crew; +import com.run_us.server.domains.crew.service.CommandCrewService; +import com.run_us.server.domains.crew.service.CrewService; +import com.run_us.server.domains.user.domain.UserPrincipal; +import com.run_us.server.domains.user.service.resolver.UserIdResolver; +import com.run_us.server.global.common.SuccessResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class CommandCrewUseCaseImpl implements CommandCrewUseCase { + private final CrewService crewService; + private final CommandCrewService commandCrewService; + private final UserIdResolver userIdResolver; + + @Override + @Transactional + public SuccessResponse updateCrewInfo(String crewPublicId, UpdateCrewInfoRequest requestDto, String userPublicId) { + UserPrincipal userPrincipal = userIdResolver.resolve(userPublicId); + + Crew crew = crewService.getCrewByPublicId(crewPublicId); + commandCrewService.updateCrewInfo(requestDto, crew, userPrincipal.getInternalId()); + return SuccessResponse.of(CrewHttpResponseCode.CREW_UPDATED, UpdateCrewInfoResponse.from(crew.getPublicId())); + } + + @Override + @Transactional + public SuccessResponse updateCrewJoinRule(String crewPublicId, UpdateCrewJoinTypeRequest requestDto, String userPublicId) { + UserPrincipal userPrincipal = userIdResolver.resolve(userPublicId); + + Crew crew = crewService.getCrewByPublicId(crewPublicId); + commandCrewService.updateCrewJoinRule(requestDto, crew, userPrincipal.getInternalId()); + return SuccessResponse.of(CrewHttpResponseCode.CREW_JOIN_RULE_UPDATED, UpdateCrewJoinRuleResponse.from(crew)); + } + + @Override + @Transactional + public SuccessResponse closeCrew(String crewPublicId, String userPublicId) { + UserPrincipal userPrincipal = userIdResolver.resolve(userPublicId); + + Crew crew = crewService.getCrewByPublicId(crewPublicId); + commandCrewService.closeCrew(crew, userPrincipal.getInternalId()); + + return SuccessResponse.of(CrewHttpResponseCode.CREW_CLOSE_SUCCESS, CloseCrewResponse.from(crew)); + } +} diff --git a/src/main/java/com/run_us/server/domains/crew/service/usecase/CreateCrewUseCaseImpl.java b/src/main/java/com/run_us/server/domains/crew/service/usecase/CreateCrewUseCaseImpl.java index d35e2d20..686fbf06 100644 --- a/src/main/java/com/run_us/server/domains/crew/service/usecase/CreateCrewUseCaseImpl.java +++ b/src/main/java/com/run_us/server/domains/crew/service/usecase/CreateCrewUseCaseImpl.java @@ -4,7 +4,7 @@ import com.run_us.server.domains.crew.controller.model.request.CreateCrewRequest; import com.run_us.server.domains.crew.controller.model.response.CreateCrewResponse; import com.run_us.server.domains.crew.domain.Crew; -import com.run_us.server.domains.crew.service.CrewCommandService; +import com.run_us.server.domains.crew.service.CommandCrewService; import com.run_us.server.domains.user.domain.User; import com.run_us.server.domains.user.service.UserService; import com.run_us.server.global.common.SuccessResponse; @@ -18,13 +18,13 @@ public class CreateCrewUseCaseImpl implements CreateCrewUseCase { private final UserService userService; - private final CrewCommandService crewCommandService; + private final CommandCrewService commandCrewService; @Override @Transactional public SuccessResponse createCrew(CreateCrewRequest requestDto, String creatorId) { User creator = userService.getUserByPublicId(creatorId); - Crew crew = crewCommandService.saveCrew(requestDto, creator); + Crew crew = commandCrewService.saveCrew(requestDto, creator); return SuccessResponse.of(CrewHttpResponseCode.CREW_CREATED, CreateCrewResponse.from(crew)); }