Skip to content

Commit 44be651

Browse files
committed
입장코드로 그룹 참여 api
1 parent 591b045 commit 44be651

File tree

6 files changed

+99
-10
lines changed

6 files changed

+99
-10
lines changed

polling-app-server/src/main/java/com/example/polls/controller/GroupController.java

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
import com.example.polls.model.User;
44
import com.example.polls.payload.Request.CreateGroupRequest;
5+
import com.example.polls.payload.Request.JoinGroupRequest;
56
import com.example.polls.payload.Response.GroupSummaryResponse;
67
import com.example.polls.repository.UserRepository;
7-
import com.example.polls.security.CustomUserDetailsService;
88
import com.example.polls.security.UserPrincipal;
99
import com.example.polls.service.GroupService;
1010
import lombok.RequiredArgsConstructor;
@@ -29,14 +29,6 @@ public ResponseEntity<GroupSummaryResponse> createGroup(
2929
@RequestBody CreateGroupRequest request,
3030
@AuthenticationPrincipal UserPrincipal userPrincipal) {
3131

32-
System.out.println(">>> userPrincipal = " + userPrincipal);
33-
System.out.println(">>> request.name = " + request.getName());
34-
System.out.println(">>> request.memberIds = " + request.getMemberIds());
35-
36-
if (userPrincipal == null) {
37-
throw new RuntimeException("userPrincipal이 null입니다.");
38-
}
39-
4032
User creator = userRepository.findById(userPrincipal.getId())
4133
.orElseThrow(()-> new RuntimeException("사용자 없음"));
4234

@@ -51,4 +43,10 @@ public ResponseEntity<List<GroupSummaryResponse>> getMyGroups(@AuthenticationPri
5143
return ResponseEntity.ok(groups);
5244
}
5345

46+
@PostMapping("/join")
47+
public ResponseEntity<String> joinGroup(@RequestBody JoinGroupRequest request, @AuthenticationPrincipal UserPrincipal userPrincipal) {
48+
groupService.joinCode(userPrincipal.getId(),request.getJoinCode());
49+
return ResponseEntity.ok("그룹에 성공적으로 참여했습니다.");
50+
}
51+
5452
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.example.polls.exception;
2+
3+
public class AlreadyJoinedException extends RuntimeException {
4+
public AlreadyJoinedException(String message) {
5+
super(message);
6+
}
7+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.example.polls.exception;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.ExceptionHandler;
6+
import org.springframework.web.bind.annotation.RestControllerAdvice;
7+
8+
import java.util.Map;
9+
10+
@RestControllerAdvice
11+
public class GlobalExceptionHandler {
12+
13+
// 400 Bad Request
14+
@ExceptionHandler(BadRequestException.class)
15+
public ResponseEntity<?> handleBadRequest(BadRequestException ex) {
16+
return buildErrorResponse(HttpStatus.BAD_REQUEST, ex.getMessage());
17+
}
18+
19+
// 404 Not Found
20+
@ExceptionHandler(ResourceNotFoundException.class)
21+
public ResponseEntity<?> handleNotFound(ResourceNotFoundException ex) {
22+
return buildErrorResponse(HttpStatus.NOT_FOUND, ex.getMessage());
23+
}
24+
25+
// 409 Conflict
26+
@ExceptionHandler(AlreadyJoinedException.class)
27+
public ResponseEntity<?> handleConflict(AlreadyJoinedException ex) {
28+
return buildErrorResponse(HttpStatus.CONFLICT, ex.getMessage());
29+
}
30+
31+
// 500 Internal Server Error (예외 누락 시 fallback)
32+
@ExceptionHandler(Exception.class)
33+
public ResponseEntity<?> handleException(Exception ex) {
34+
return buildErrorResponse(HttpStatus.INTERNAL_SERVER_ERROR, "서버 오류가 발생했습니다.");
35+
}
36+
37+
// 공통 응답 포맷 생성 메서드
38+
private ResponseEntity<?> buildErrorResponse(HttpStatus status, String message) {
39+
return ResponseEntity.status(status).body(Map.of(
40+
"status", status.value(),
41+
"error", status.getReasonPhrase(),
42+
"message", message
43+
));
44+
}
45+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.example.polls.payload.Request;
2+
3+
public class JoinGroupRequest {
4+
private String joinCode;
5+
6+
public String getJoinCode() {
7+
return joinCode;
8+
}
9+
10+
public void setJoinCode(String joinCode) {
11+
this.joinCode = joinCode;
12+
}
13+
}

polling-app-server/src/main/java/com/example/polls/repository/GroupMemberRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,6 @@
1111
public interface GroupMemberRepository extends JpaRepository<GroupMember, Long> {
1212
@Query("SELECT gm.group FROM GroupMember gm WHERE gm.user.id = :userId")
1313
List<Group> findGroupsByUserId(@Param("userId") Long userId);
14+
15+
boolean existsByUserIdAndGroupId(Long userId, Long groupId);
1416
}

polling-app-server/src/main/java/com/example/polls/service/GroupService.java

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.example.polls.service;
22

3+
import com.example.polls.exception.AlreadyJoinedException;
4+
import com.example.polls.exception.BadRequestException;
5+
import com.example.polls.exception.ResourceNotFoundException;
36
import com.example.polls.model.Group;
47
import com.example.polls.model.GroupMember;
58
import com.example.polls.model.GroupRole;
@@ -13,7 +16,6 @@
1316
import org.springframework.stereotype.Service;
1417

1518
import javax.transaction.Transactional;
16-
import java.util.Collection;
1719
import java.util.List;
1820
import java.util.UUID;
1921
import java.util.stream.Collectors;
@@ -83,4 +85,26 @@ public List<GroupSummaryResponse> getGroupsForUser(Long userId) {
8385
.map(GroupSummaryResponse::new)
8486
.collect(Collectors.toList());
8587
}
88+
89+
//조인 코드로 그룹 참여
90+
public void joinCode(Long userId, String joinCode) {
91+
Group group = groupRepository.findByJoinCode(joinCode)
92+
.orElseThrow(()-> new BadRequestException("유효하지 않은 입장코드입니다."));
93+
94+
//중복 참여 체크
95+
boolean alreadyJoined = groupMemberRepository.existsByUserIdAndGroupId(userId, group.getId());
96+
if(alreadyJoined){
97+
throw new AlreadyJoinedException("이미 참여한 그룹입니다.");
98+
}
99+
100+
User user = userRepository.findById(userId)
101+
.orElseThrow(()-> new ResourceNotFoundException("User", "id", userId));
102+
103+
GroupMember newMember = new GroupMember();
104+
newMember.setGroup(group);
105+
newMember.setUser(user);
106+
newMember.setRole(GroupRole.MEMBER);
107+
groupMemberRepository.save(newMember);
108+
109+
}
86110
}

0 commit comments

Comments
 (0)