Skip to content

Commit

Permalink
Refactor: Group API (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
Sion99 authored Dec 2, 2023
2 parents bb1fdfb + eabf1b7 commit 578e3de
Show file tree
Hide file tree
Showing 17 changed files with 366 additions and 123 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
package com.uspray.uspray.DTO.auth.response;

import com.querydsl.core.annotations.QueryProjection;
import com.uspray.uspray.domain.Member;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class MemberResponseDto {

Expand All @@ -20,6 +20,13 @@ public class MemberResponseDto {
@Schema(description = "전화번호", example = "01012345678")
private String phone;

@QueryProjection
public MemberResponseDto(String userId, String name, String phone){
this.userId = userId;
this.name = name;
this.phone = phone;
}

public static MemberResponseDto of(Member member) {
return new MemberResponseDto(member.getUserId(), member.getName(), member.getPhone());
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,5 +12,5 @@
public class GroupMemberRequestDto {

@NotNull
private String username;
private Long memberId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.uspray.uspray.DTO.group.response;

import com.querydsl.core.annotations.QueryProjection;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@NoArgsConstructor
public class GroupMemberResponseDto {

@Schema(description = "ID", example = "1")
private Long id;

@Schema(description = "USER ID", example = "test")
private String userId;

@Schema(description = "USER NAME", example = "홍길동")
private String name;

@QueryProjection
public GroupMemberResponseDto(Long id, String userId, String name) {
this.id = id;
this.userId = userId;
this.name = name;
}
}
18 changes: 10 additions & 8 deletions src/main/java/com/uspray/uspray/InitDb.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,8 @@

import com.uspray.uspray.Enums.Authority;
import com.uspray.uspray.Enums.PrayType;
import com.uspray.uspray.domain.Category;
import com.uspray.uspray.domain.Group;
import com.uspray.uspray.domain.History;
import com.uspray.uspray.domain.Member;
import com.uspray.uspray.domain.Pray;
import com.uspray.uspray.domain.*;

import java.time.LocalDate;
import javax.annotation.PostConstruct;
import javax.persistence.EntityManager;
Expand Down Expand Up @@ -72,13 +69,17 @@ public void dbInit() {


Group group = Group.builder()
.leader(member)
.name("테스트 모임")
.leader(member)
.build();
group.addMember(member);
member.joinGroup(group);
em.persist(group);

GroupMember groupMember = GroupMember.builder()
.group(group)
.member(member)
.build();
em.persist(groupMember);

Category category = Category.builder()
.name("기타 카테고리")
.color("#FFFFFF")
Expand Down Expand Up @@ -154,6 +155,7 @@ public void dbInit() {
.pray(pray)
.build();
em.persist(history);

}

}
Expand Down
94 changes: 81 additions & 13 deletions src/main/java/com/uspray/uspray/controller/GroupController.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,17 +4,26 @@
import com.uspray.uspray.DTO.group.request.GroupMemberRequestDto;
import com.uspray.uspray.DTO.group.request.GroupRequestDto;
import com.uspray.uspray.DTO.group.response.GroupListResponseDto;
import com.uspray.uspray.DTO.group.response.GroupMemberResponseDto;
import com.uspray.uspray.exception.SuccessStatus;
import com.uspray.uspray.service.GroupFacadeService;
import com.uspray.uspray.service.GroupFacade;
import com.uspray.uspray.service.GroupService;
import io.netty.channel.ChannelHandler;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.checkerframework.checker.units.qual.A;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.userdetails.User;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@RestController
@RequestMapping("/group")
Expand All @@ -23,79 +32,138 @@
@SecurityRequirement(name = "JWT Auth")
public class GroupController {

private final GroupFacadeService groupFacadeService;
private final GroupService groupService;
private final GroupFacade groupFacade;

@Operation(summary = "모임 목록 조회")
@ApiResponse(
responseCode = "200",
description = "사용자가 가입한 목록 조회",
content = @Content(schema = @Schema(implementation = GroupListResponseDto.class))
)
@GetMapping
public ApiResponseDto<GroupListResponseDto> getGroupList(
@Parameter(hidden = true) @AuthenticationPrincipal User user) {
return ApiResponseDto.success(SuccessStatus.GET_GROUP_LIST_SUCCESS,
groupFacadeService.getGroupList(user.getUsername()));
groupService.getGroupList(user.getUsername()));
}

@Operation(summary = "모임 생성")
@ApiResponse(
responseCode = "201",
description = "신규로 모임을 생성합니다",
content = @Content(schema = @Schema(implementation = GroupRequestDto.class))
)
@PostMapping
public ApiResponseDto<?> createGroup(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@Valid @RequestBody GroupRequestDto groupRequestDto) {
groupFacadeService.createGroup(user.getUsername(), groupRequestDto);
groupFacade.createGroup(user.getUsername(), groupRequestDto);
return ApiResponseDto.success(SuccessStatus.CREATE_GROUP_SUCCESS,
SuccessStatus.CREATE_GROUP_SUCCESS.getMessage());
}

@Operation(summary = "[모임 리더] 모임 이름을 변경합니다")
@ApiResponse(
responseCode = "200",
description = "모임 이름 변경",
content = @Content(schema = @Schema(implementation = GroupRequestDto.class))
)
@PutMapping("/{groupId}/change-name")
public ApiResponseDto<?> changeGroupName(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@PathVariable Long groupId,
@Valid @RequestBody GroupRequestDto groupRequestDto) {
groupFacadeService.changeGroupName(user.getUsername(), groupId, groupRequestDto);
groupFacade.changeGroupName(user.getUsername(), groupId, groupRequestDto);
return ApiResponseDto.success(SuccessStatus.CHANGE_GROUP_NAME_SUCCESS,
SuccessStatus.CHANGE_GROUP_NAME_SUCCESS.getMessage());
}

@Operation(summary = "[모임 리더] 모임 리더를 위임합니다")
@ApiResponse(
responseCode = "200",
description = "모임 리더 위임",
content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class))
)
@PutMapping("/{groupId}/change-leader")
public ApiResponseDto<?> changeGroupLeader(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@PathVariable Long groupId,
@Valid @RequestBody GroupMemberRequestDto groupLeaderRequestDto) {
groupFacadeService.changeGroupLeader(user.getUsername(), groupId, groupLeaderRequestDto);
groupFacade.changeGroupLeader(user.getUsername(), groupId, groupLeaderRequestDto.getMemberId());
return ApiResponseDto.success(SuccessStatus.CHANGE_GROUP_LEADER_SUCCESS,
SuccessStatus.CHANGE_GROUP_LEADER_SUCCESS.getMessage());
}

@Operation(summary = "[모임 리더] 회원 내보내기")
@ApiResponse(
responseCode = "200",
description = "모임 회원을 내보냅니다",
content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class))
)
@DeleteMapping("/{groupId}/kick")
public ApiResponseDto<?> kickGroupMember(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@PathVariable Long groupId,
@Valid @RequestBody GroupMemberRequestDto groupMemberRequestDto) {
groupFacadeService.kickGroupMember(user.getUsername(), groupId, groupMemberRequestDto);
groupFacade.kickGroupMember(user.getUsername(), groupId, groupMemberRequestDto.getMemberId());
return ApiResponseDto.success(SuccessStatus.KICK_GROUP_MEMBER_SUCCESS,
SuccessStatus.KICK_GROUP_MEMBER_SUCCESS.getMessage());
}

@PostMapping("/{groupId}/member")
@Operation(summary = "모임 가입하기")
@ApiResponse(
responseCode = "200",
description = "모임에 가입합니다"
)
@PostMapping("/{groupId}/join")
public ApiResponseDto<?> addGroupMember(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@PathVariable Long groupId,
@Valid @RequestBody GroupMemberRequestDto groupMemberRequestDto) {
groupFacadeService.addGroupMember(user.getUsername(), groupId, groupMemberRequestDto);
@PathVariable Long groupId) {
groupFacade.addGroupMember(user.getUsername(), groupId);
return ApiResponseDto.success(SuccessStatus.ADD_GROUP_MEMBER_SUCCESS,
SuccessStatus.ADD_GROUP_MEMBER_SUCCESS.getMessage());
}

@Operation(summary = "모임 탈퇴하기")
@ApiResponse(
responseCode = "204",
description = "모임을 떠납니다",
content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class))
)
@DeleteMapping("/{groupId}/leave")
public ApiResponseDto<?> leaveGroup(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@PathVariable Long groupId) {
groupFacadeService.leaveGroup(user.getUsername(), groupId);
groupFacade.leaveGroup(user.getUsername(), groupId);
return ApiResponseDto.success(SuccessStatus.LEAVE_GROUP_SUCCESS,
SuccessStatus.LEAVE_GROUP_SUCCESS.getMessage());
}

@Operation(summary = "[모임 리더] 모임 삭제하기")
@ApiResponse(
responseCode = "200",
description = "모임을 삭제합니다. 모임 회원, 모임 기도제목 등 일괄 삭제"
)
@DeleteMapping("/{groupId}")
public ApiResponseDto<?> deleteGroup(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@PathVariable Long groupId) {
groupFacadeService.deleteGroup(user.getUsername(), groupId);
groupFacade.deleteGroup(user.getUsername(), groupId);
return ApiResponseDto.success(SuccessStatus.DELETE_GROUP_SUCCESS,
SuccessStatus.DELETE_GROUP_SUCCESS.getMessage());
}

@Operation(summary = "회원 검색")
@ApiResponse(
responseCode = "200",
description = "모임 내 회원 목록을 조회합니다"
)
@GetMapping("/{groupId}/member/search")
public ApiResponseDto<List<GroupMemberResponseDto>> searchGroupMembers(
@PathVariable Long groupId,
@RequestParam(required = false) String name) {
return ApiResponseDto.success(SuccessStatus.GET_MEMBER_LIST_SUCCESS,
groupService.searchGroupMembers(groupId, name));
}
}
30 changes: 9 additions & 21 deletions src/main/java/com/uspray/uspray/domain/Group.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,12 @@

import com.uspray.uspray.common.domain.AuditingTimeEntity;

import java.util.HashSet;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import javax.persistence.*;

import com.uspray.uspray.exception.ErrorStatus;
import com.uspray.uspray.exception.model.CustomException;
import com.uspray.uspray.exception.model.NotFoundException;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -32,33 +30,28 @@ public class Group extends AuditingTimeEntity {
@JoinColumn(name = "leader_id", referencedColumnName = "member_id")
private Member leader;

@ManyToMany(mappedBy = "groups")
private Set<Member> members = new HashSet<>();
@OneToMany(mappedBy = "group", cascade = CascadeType.REMOVE, orphanRemoval = true)
private List<GroupMember> groupMemberList = new ArrayList<>();

@OneToMany(mappedBy = "group", orphanRemoval = true)
private List<GroupPray> groupPrayList;

@Builder
public Group(String name, Member leader) {
this.name = name;
this.members.add(leader);
this.leader = leader;
}

public void changeName(String name) {
this.name = name;
}

public void changeLeader(Member leader) {
this.leader = leader;
}

public void addMember(Member member) {
this.members.add(member);
public void changeLeader(Member member) {
this.leader = member;
}

public void kickMember(Member member) {
this.members.remove(member);
public void kickMember(GroupMember groupMember) {
this.groupMemberList.remove(groupMember);
}

public void validateGroupName(String newName) {
Expand All @@ -68,14 +61,9 @@ public void validateGroupName(String newName) {
}

public void checkLeaderAuthorization(Member member) {
if (!this.leader.equals(member)) {
Member leader = this.getLeader();
if (!leader.equals(member)) {
throw new CustomException(ErrorStatus.GROUP_UNAUTHORIZED_EXCEPTION, ErrorStatus.GROUP_UNAUTHORIZED_EXCEPTION.getMessage());
}
}

public void checkGroupMember(Member member) {
if (!this.members.contains(member)) {
throw new NotFoundException(ErrorStatus.GROUP_MEMBER_NOT_FOUND_EXCEPTION, ErrorStatus.GROUP_MEMBER_NOT_FOUND_EXCEPTION.getMessage());
}
}
}
Loading

0 comments on commit 578e3de

Please sign in to comment.