diff --git a/src/main/java/com/codiary/backend/global/converter/TeamConverter.java b/src/main/java/com/codiary/backend/global/converter/TeamConverter.java index 63ee658..55ad26b 100644 --- a/src/main/java/com/codiary/backend/global/converter/TeamConverter.java +++ b/src/main/java/com/codiary/backend/global/converter/TeamConverter.java @@ -2,6 +2,10 @@ import com.codiary.backend.global.domain.entity.Team; import com.codiary.backend.global.web.dto.Team.TeamResponseDTO; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberResponseDTO; + +import java.util.List; +import java.util.stream.Collectors; public class TeamConverter { //팀생성 @@ -15,14 +19,20 @@ public static TeamResponseDTO.CreateTeamResponseDTO toCreateMemberDTO(Team team) } //팀 조회 - public static TeamResponseDTO.TeamCheckResponseDTO toTeamCheckDTO(Team team) { + public static TeamResponseDTO.TeamCheckResponseDTO toTeamCheckResponseDTO(Team team) { + List members = team.getTeamMemberList().stream() + .map(TeamMemberConverter::toTeamMemberDTO) + .collect(Collectors.toList()); + return TeamResponseDTO.TeamCheckResponseDTO.builder() + .teamId(team.getTeamId()) .name(team.getName()) .intro(team.getIntro()) .profilePhoto(team.getProfilePhoto()) .github(team.getGithub()) .email(team.getEmail()) .linkedIn(team.getLinkedin()) + .members(members) .build(); } diff --git a/src/main/java/com/codiary/backend/global/converter/TeamMemberConverter.java b/src/main/java/com/codiary/backend/global/converter/TeamMemberConverter.java index 05ee3f7..5d13bdf 100644 --- a/src/main/java/com/codiary/backend/global/converter/TeamMemberConverter.java +++ b/src/main/java/com/codiary/backend/global/converter/TeamMemberConverter.java @@ -1,4 +1,16 @@ package com.codiary.backend.global.converter; +import com.codiary.backend.global.domain.entity.mapping.TeamMember; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberResponseDTO; + public class TeamMemberConverter { -} + + public static TeamMemberResponseDTO.TeamMemberDTO toTeamMemberDTO(TeamMember teamMember) { + return TeamMemberResponseDTO.TeamMemberDTO.builder() + .teamMemberId(teamMember.getTeamMemberId()) + .teamId(teamMember.getTeam().getTeamId()) + .memberId(teamMember.getMember().getMemberId()) + .memberRole(teamMember.getTeamMemberRole()) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/codiary/backend/global/domain/entity/mapping/TeamMember.java b/src/main/java/com/codiary/backend/global/domain/entity/mapping/TeamMember.java index d054a96..a018925 100644 --- a/src/main/java/com/codiary/backend/global/domain/entity/mapping/TeamMember.java +++ b/src/main/java/com/codiary/backend/global/domain/entity/mapping/TeamMember.java @@ -9,6 +9,8 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor +@Builder public class TeamMember { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/codiary/backend/global/repository/TeamMemberRepository.java b/src/main/java/com/codiary/backend/global/repository/TeamMemberRepository.java index 11f049d..1f1173d 100644 --- a/src/main/java/com/codiary/backend/global/repository/TeamMemberRepository.java +++ b/src/main/java/com/codiary/backend/global/repository/TeamMemberRepository.java @@ -1,4 +1,12 @@ package com.codiary.backend.global.repository; -public interface TeamMemberRepository { -} +import com.codiary.backend.global.domain.entity.Team; +import com.codiary.backend.global.domain.entity.Member; +import com.codiary.backend.global.domain.entity.mapping.TeamMember; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface TeamMemberRepository extends JpaRepository { + Optional findByTeamAndMember(Team team, Member member); +} \ No newline at end of file diff --git a/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandService.java b/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandService.java index 5877537..bcefc64 100644 --- a/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandService.java +++ b/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandService.java @@ -1,4 +1,13 @@ package com.codiary.backend.global.service.TeamMemberService; +import com.codiary.backend.global.domain.entity.mapping.TeamMember; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberRequestDTO; + public interface TeamMemberCommandService { + + // 팀원 추가 + TeamMember addMember(TeamMemberRequestDTO.AddMemberDTO request); + + // 팀원 삭제 + void removeMember(TeamMemberRequestDTO.RemoveMemberDTO request); } diff --git a/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandServiceImpl.java b/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandServiceImpl.java index 614cae9..c379b3e 100644 --- a/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandServiceImpl.java +++ b/src/main/java/com/codiary/backend/global/service/TeamMemberService/TeamMemberCommandServiceImpl.java @@ -1,4 +1,54 @@ package com.codiary.backend.global.service.TeamMemberService; -public class TeamMemberCommandServiceImpl { -} +import com.codiary.backend.global.domain.entity.Member; +import com.codiary.backend.global.domain.entity.Team; +import com.codiary.backend.global.domain.entity.mapping.TeamMember; +import com.codiary.backend.global.repository.MemberRepository; +import com.codiary.backend.global.repository.TeamMemberRepository; +import com.codiary.backend.global.repository.TeamRepository; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberRequestDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@RequiredArgsConstructor +@Service +public class TeamMemberCommandServiceImpl implements TeamMemberCommandService { + + private final TeamRepository teamRepository; + private final MemberRepository memberRepository; + private final TeamMemberRepository teamMemberRepository; + + @Override + @Transactional + public TeamMember addMember(TeamMemberRequestDTO.AddMemberDTO request) { + Team team = teamRepository.findById(request.getTeamId()) + .orElseThrow(() -> new IllegalArgumentException("Invalid team ID")); + + Member member = memberRepository.findById(request.getMemberId()) + .orElseThrow(() -> new IllegalArgumentException("Invalid member ID")); + + TeamMember teamMember = TeamMember.builder() + .team(team) + .member(member) + .teamMemberRole(request.getMemberRole()) + .build(); + + return teamMemberRepository.save(teamMember); + } + + @Override + @Transactional + public void removeMember(TeamMemberRequestDTO.RemoveMemberDTO request) { + Team team = teamRepository.findById(request.getTeamId()) + .orElseThrow(() -> new IllegalArgumentException("Invalid team ID")); + + Member member = memberRepository.findById(request.getMemberId()) + .orElseThrow(() -> new IllegalArgumentException("Invalid member ID")); + + TeamMember teamMember = teamMemberRepository.findByTeamAndMember(team, member) + .orElseThrow(() -> new IllegalArgumentException("Team member not found")); + + teamMemberRepository.delete(teamMember); + } +} \ No newline at end of file diff --git a/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryService.java b/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryService.java index a027623..d6c6bb6 100644 --- a/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryService.java +++ b/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryService.java @@ -1,4 +1,7 @@ package com.codiary.backend.global.service.TeamService; +import com.codiary.backend.global.web.dto.Team.TeamResponseDTO; + public interface TeamQueryService { + TeamResponseDTO.TeamCheckResponseDTO getTeamById(Long teamId); } diff --git a/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryServiceImpl.java b/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryServiceImpl.java index 4659568..b438332 100644 --- a/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryServiceImpl.java +++ b/src/main/java/com/codiary/backend/global/service/TeamService/TeamQueryServiceImpl.java @@ -1,4 +1,23 @@ package com.codiary.backend.global.service.TeamService; -public class TeamQueryServiceImpl { +import com.codiary.backend.global.converter.TeamConverter; +import com.codiary.backend.global.domain.entity.Team; +import com.codiary.backend.global.repository.TeamRepository; +import com.codiary.backend.global.web.dto.Team.TeamResponseDTO; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@RequiredArgsConstructor +@Service +public class TeamQueryServiceImpl implements TeamQueryService { + + private final TeamRepository teamRepository; + + @Override + public TeamResponseDTO.TeamCheckResponseDTO getTeamById(Long teamId) { + Team team = teamRepository.findById(teamId) + .orElseThrow(() -> new IllegalArgumentException("Invalid team ID")); + + return TeamConverter.toTeamCheckResponseDTO(team); + } } diff --git a/src/main/java/com/codiary/backend/global/web/controller/TeamController.java b/src/main/java/com/codiary/backend/global/web/controller/TeamController.java index b6fe932..bf83df7 100644 --- a/src/main/java/com/codiary/backend/global/web/controller/TeamController.java +++ b/src/main/java/com/codiary/backend/global/web/controller/TeamController.java @@ -8,6 +8,7 @@ import com.codiary.backend.global.domain.entity.Team; import com.codiary.backend.global.service.PostService.PostCommandService; import com.codiary.backend.global.service.TeamService.TeamCommandService; +import com.codiary.backend.global.service.TeamService.TeamQueryService; import com.codiary.backend.global.web.dto.Post.PostRequestDTO; import com.codiary.backend.global.web.dto.Post.PostResponseDTO; import com.codiary.backend.global.web.dto.Team.TeamRequestDTO; @@ -22,6 +23,7 @@ public class TeamController { private final TeamCommandService teamCommandService; + private final TeamQueryService teamQueryService; //팀 생성 @PostMapping() @@ -35,6 +37,14 @@ public ApiResponse createTeam( TeamConverter.toCreateMemberDTO(newTeam)); } + //팀 조회 + @GetMapping("/{teamId}") + @Operation(summary = "팀 정보 조회") + public ApiResponse getTeamById(@PathVariable Long teamId) { + TeamResponseDTO.TeamCheckResponseDTO teamInfo = teamQueryService.getTeamById(teamId); + return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, teamInfo); + } + // 팀 프로필 수정 @PatchMapping("/profile/{teamId}") @Operation(summary = "팀 프로필 수정") @@ -46,6 +56,6 @@ public ApiResponse updateTeam( SuccessStatus.TEAM_OK, TeamConverter.toUpdateTeamDTO(updatedTeam)); } - + //팀 팔로우 } diff --git a/src/main/java/com/codiary/backend/global/web/controller/TeamMemberController.java b/src/main/java/com/codiary/backend/global/web/controller/TeamMemberController.java index e15daa9..993c5cf 100644 --- a/src/main/java/com/codiary/backend/global/web/controller/TeamMemberController.java +++ b/src/main/java/com/codiary/backend/global/web/controller/TeamMemberController.java @@ -1,4 +1,34 @@ package com.codiary.backend.global.web.controller; +import com.codiary.backend.global.apiPayload.ApiResponse; +import com.codiary.backend.global.apiPayload.code.status.SuccessStatus; +import com.codiary.backend.global.converter.TeamMemberConverter; +import com.codiary.backend.global.domain.entity.mapping.TeamMember; +import com.codiary.backend.global.service.TeamMemberService.TeamMemberCommandService; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberRequestDTO; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberResponseDTO; +import io.swagger.v3.oas.annotations.Operation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RequiredArgsConstructor +@RestController +@RequestMapping("/teams") public class TeamMemberController { -} + + private final TeamMemberCommandService teamMemberCommandService; + + @PostMapping("/add") + @Operation(summary = "팀원 추가") + public ApiResponse addMember(@RequestBody TeamMemberRequestDTO.AddMemberDTO request) { + TeamMember newMember = teamMemberCommandService.addMember(request); + return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, TeamMemberConverter.toTeamMemberDTO(newMember)); + } + + @DeleteMapping("/delete") + @Operation(summary = "팀원 삭제") + public ApiResponse removeMember(@RequestBody TeamMemberRequestDTO.RemoveMemberDTO request) { + teamMemberCommandService.removeMember(request); + return ApiResponse.onSuccess(SuccessStatus.TEAM_OK, null); + } +} \ No newline at end of file diff --git a/src/main/java/com/codiary/backend/global/web/dto/Team/TeamResponseDTO.java b/src/main/java/com/codiary/backend/global/web/dto/Team/TeamResponseDTO.java index fb89316..88feaa3 100644 --- a/src/main/java/com/codiary/backend/global/web/dto/Team/TeamResponseDTO.java +++ b/src/main/java/com/codiary/backend/global/web/dto/Team/TeamResponseDTO.java @@ -2,8 +2,10 @@ import com.codiary.backend.global.domain.enums.PostAccess; import com.codiary.backend.global.jwt.TokenInfo; +import com.codiary.backend.global.web.dto.TeamMember.TeamMemberResponseDTO; import lombok.*; +import java.util.List; import java.util.Set; public class TeamResponseDTO { @@ -47,6 +49,7 @@ public static class TeamCheckResponseDTO { // 팀 조회 String github; String email; String linkedIn; + private List members; // 팀원 목록 추가 } @Builder diff --git a/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberRequestDTO.java b/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberRequestDTO.java index 503766a..2b3cab4 100644 --- a/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberRequestDTO.java +++ b/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberRequestDTO.java @@ -1,5 +1,6 @@ package com.codiary.backend.global.web.dto.TeamMember; +import com.codiary.backend.global.domain.enums.MemberRole; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -10,27 +11,18 @@ public class TeamMemberRequestDTO { @Builder @AllArgsConstructor @NoArgsConstructor - public static class AddTeamMemberRequestDTO { //팀원 추가 - private String name; - private String profilePhoto; - private String intro; - private String github; - private String linkedIn; - private String discord; - private String instagram; + public static class AddMemberDTO { + private Long teamId; + private Long memberId; + private MemberRole memberRole; } @Getter @Builder @AllArgsConstructor @NoArgsConstructor - public static class DeleteMemberRequestDTO { //팀원 삭제 - private String name; - private String profilePhoto; - private String intro; - private String github; - private String linkedIn; - private String discord; - private String instagram; + public static class RemoveMemberDTO { + private Long teamId; + private Long memberId; } } diff --git a/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberResponseDTO.java b/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberResponseDTO.java index ef61b94..e0cde50 100644 --- a/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberResponseDTO.java +++ b/src/main/java/com/codiary/backend/global/web/dto/TeamMember/TeamMemberResponseDTO.java @@ -1,5 +1,6 @@ package com.codiary.backend.global.web.dto.TeamMember; +import com.codiary.backend.global.domain.enums.MemberRole; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -11,8 +12,24 @@ public class TeamMemberResponseDTO { @Getter @NoArgsConstructor @AllArgsConstructor - public static class TeamMemberViewResponseDTO { - Long teamMemberId; + public static class TeamCheckResponseDTO { //팀 조회 + private Long teamId; + private String name; + private String intro; + private String profilePhoto; + private String github; + private String email; + private String linkedIn; + } + @Getter + @Builder + @AllArgsConstructor + @NoArgsConstructor + public static class TeamMemberDTO { + private Long teamMemberId; + private Long teamId; + private Long memberId; + private MemberRole memberRole; } }