Skip to content

Commit 96dde49

Browse files
Feat: [FN-309] 그룹 가입 신청 API 구현
Feat: [FN-309] 그룹 가입 신청 API 구현
2 parents 24ff8d5 + e3e000a commit 96dde49

26 files changed

Lines changed: 505 additions & 24 deletions

src/main/java/flipnote/group/adapter/in/web/InvitationController.java

Lines changed: 0 additions & 18 deletions
This file was deleted.
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package flipnote.group.adapter.in.web;
2+
3+
import org.springframework.http.HttpStatus;
4+
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.GetMapping;
6+
import org.springframework.web.bind.annotation.PathVariable;
7+
import org.springframework.web.bind.annotation.PostMapping;
8+
import org.springframework.web.bind.annotation.RequestBody;
9+
import org.springframework.web.bind.annotation.RequestHeader;
10+
import org.springframework.web.bind.annotation.RequestMapping;
11+
import org.springframework.web.bind.annotation.RestController;
12+
13+
import flipnote.group.api.dto.request.ApplicationFormRequestDto;
14+
import flipnote.group.api.dto.response.ApplicationFormResponseDto;
15+
import flipnote.group.api.dto.response.FindJoinFormListResponseDto;
16+
import flipnote.group.application.port.in.JoinUseCase;
17+
import flipnote.group.application.port.in.command.ApplicationFormCommand;
18+
import flipnote.group.application.port.in.command.FindJoinFormCommand;
19+
import flipnote.group.application.port.in.result.ApplicationFormResult;
20+
import flipnote.group.application.port.in.result.FindJoinFormListResult;
21+
import jakarta.validation.Valid;
22+
import lombok.RequiredArgsConstructor;
23+
24+
@RestController
25+
@RequestMapping("/v1/groups/{groupId}")
26+
@RequiredArgsConstructor
27+
public class JoinController {
28+
29+
private final JoinUseCase joinUseCase;
30+
31+
/**
32+
* 가입 신청 요청
33+
* @param userId
34+
* @param groupId
35+
* @param req
36+
* @return
37+
*/
38+
@PostMapping("/joins")
39+
public ResponseEntity<ApplicationFormResponseDto> joinRequest(
40+
@RequestHeader("X-USER-ID") Long userId,
41+
@PathVariable("groupId") Long groupId,
42+
@Valid @RequestBody ApplicationFormRequestDto req) {
43+
44+
ApplicationFormCommand cmd = new ApplicationFormCommand(userId, groupId, req.joinIntro());
45+
46+
ApplicationFormResult result = joinUseCase.joinRequest(cmd);
47+
48+
ApplicationFormResponseDto res = ApplicationFormResponseDto.from(result);
49+
50+
return ResponseEntity.status(HttpStatus.CREATED).body(res);
51+
}
52+
53+
/**
54+
* 해당 그룹 가입 신청 리스트 조회
55+
* todo 유저 닉네임 추가
56+
* @param userId
57+
* @param groupId
58+
* @return
59+
*/
60+
@GetMapping("/joins")
61+
public ResponseEntity<FindJoinFormListResponseDto> findGroupJoinList(
62+
@RequestHeader("X-USER-ID") Long userId,
63+
@PathVariable("groupId") Long groupId) {
64+
65+
FindJoinFormCommand cmd = new FindJoinFormCommand(userId, groupId);
66+
67+
FindJoinFormListResult result = joinUseCase.findJoinFormList(cmd);
68+
69+
FindJoinFormListResponseDto res = FindJoinFormListResponseDto.from(result);
70+
71+
return ResponseEntity.status(HttpStatus.CREATED).body(res);
72+
}
73+
74+
//todo 가입신청 응답
75+
76+
//todo 가입신청 삭제
77+
78+
//todo 내가 신청한 가입신청 리스트 조회
79+
}

src/main/java/flipnote/group/adapter/in/web/MemberController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import org.springframework.http.ResponseEntity;
44
import org.springframework.web.bind.annotation.GetMapping;
55
import org.springframework.web.bind.annotation.PathVariable;
6+
import org.springframework.web.bind.annotation.PutMapping;
67
import org.springframework.web.bind.annotation.RequestHeader;
78
import org.springframework.web.bind.annotation.RequestMapping;
89
import org.springframework.web.bind.annotation.RestController;
@@ -41,4 +42,6 @@ public ResponseEntity<FindGroupMemberResponseDto> findGroupMembers(
4142
}
4243

4344
//todo 하위 권한 수정
45+
46+
//todo 그룹 멤버 추방
4447
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
package flipnote.group.adapter.out.entity;
2+
3+
import flipnote.group.domain.model.BaseEntity;
4+
import flipnote.group.domain.model.join.JoinStatus;
5+
import jakarta.persistence.Column;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.EnumType;
8+
import jakarta.persistence.Enumerated;
9+
import jakarta.persistence.FetchType;
10+
import jakarta.persistence.GeneratedValue;
11+
import jakarta.persistence.GenerationType;
12+
import jakarta.persistence.Id;
13+
import jakarta.persistence.JoinColumn;
14+
import jakarta.persistence.ManyToOne;
15+
import jakarta.persistence.Table;
16+
import lombok.AccessLevel;
17+
import lombok.Builder;
18+
import lombok.Getter;
19+
import lombok.NoArgsConstructor;
20+
21+
@Getter
22+
@Entity
23+
@Table(name = "joins")
24+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
25+
public class JoinEntity extends BaseEntity {
26+
@Id
27+
@GeneratedValue(strategy = GenerationType.IDENTITY)
28+
private Long id;
29+
30+
@Column(name = "user_id", nullable = false)
31+
private Long userId;
32+
33+
@Column(name = "group_id", nullable = false)
34+
private Long groupId;
35+
36+
@Enumerated(EnumType.STRING)
37+
@Column(nullable = false)
38+
private JoinStatus status;
39+
40+
@Column(name = "form")
41+
private String form;
42+
43+
@Builder
44+
private JoinEntity(Long userId, Long groupId, JoinStatus status, String form) {
45+
this.userId = userId;
46+
this.groupId = groupId;
47+
this.status = status;
48+
this.form = form;
49+
}
50+
51+
public static JoinEntity create(Long groupId, Long userId, String form, JoinStatus status) {
52+
return JoinEntity.builder()
53+
.groupId(groupId)
54+
.userId(userId)
55+
.form(form)
56+
.status(status)
57+
.build();
58+
}
59+
}

src/main/java/flipnote/group/adapter/out/persistence/GroupRoleRepositoryAdapter.java

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,10 +87,25 @@ public RoleEntity create(Long groupId) {
8787
*/
8888
@Override
8989
public boolean checkRole(Long userId, Long groupId, GroupMemberRole groupMemberRole) {
90-
RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, groupMemberRole).orElseThrow(
91-
() -> new IllegalArgumentException("not exist member")
92-
);
90+
RoleEntity roleEntity = groupRoleRepository.findByGroupIdAndRole(groupId, groupMemberRole);
9391

9492
return groupMemberRepository.existsByUserIdAndRole_Id(userId, roleEntity.getId());
9593
}
94+
95+
/**
96+
* 권한 체킁
97+
* @param userId
98+
* @param groupId
99+
* @param permission
100+
* @return
101+
*/
102+
@Override
103+
public boolean checkPermission(Long userId, Long groupId, GroupPermission permission) {
104+
return groupRolePermissionRepository.existsUserInGroupPermission(groupId, userId, permission);
105+
}
106+
107+
@Override
108+
public RoleEntity findByIdAndRole(Long id, GroupMemberRole groupMemberRole) {
109+
return groupRoleRepository.findByGroupIdAndRole(id, groupMemberRole);
110+
}
96111
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package flipnote.group.adapter.out.persistence;
2+
3+
import java.util.List;
4+
5+
import org.springframework.stereotype.Repository;
6+
7+
import flipnote.group.adapter.out.entity.JoinEntity;
8+
import flipnote.group.application.port.out.JoinRepositoryPort;
9+
import flipnote.group.infrastructure.persistence.jpa.JoinRepository;
10+
import lombok.RequiredArgsConstructor;
11+
12+
@Repository
13+
@RequiredArgsConstructor
14+
public class JoinRepositoryAdapter implements JoinRepositoryPort {
15+
16+
private final JoinRepository joinRepository;
17+
18+
@Override
19+
public boolean existsJoin(Long groupId, Long userId) {
20+
return joinRepository.existsByUserIdAndGroupId(userId, groupId);
21+
}
22+
23+
@Override
24+
public void save(JoinEntity join) {
25+
joinRepository.save(join);
26+
}
27+
28+
@Override
29+
public List<JoinEntity> findFormList(Long groupId) {
30+
31+
List<JoinEntity> joinList = joinRepository.findAllByGroupId(groupId);
32+
33+
return joinList;
34+
}
35+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package flipnote.group.api.dto.request;
2+
3+
public record ApplicationFormRequestDto(
4+
String joinIntro
5+
) {
6+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package flipnote.group.api.dto.request;
2+
3+
public record FindJoinFormListRequestDto() {
4+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package flipnote.group.api.dto.response;
2+
3+
import flipnote.group.application.port.in.result.ApplicationFormResult;
4+
import flipnote.group.domain.model.join.JoinStatus;
5+
6+
public record ApplicationFormResponseDto(
7+
Long groupJoinId,
8+
JoinStatus status
9+
) {
10+
public static ApplicationFormResponseDto from(ApplicationFormResult result) {
11+
return new ApplicationFormResponseDto(result.join().getId(), result.join().getStatus());
12+
}
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package flipnote.group.api.dto.response;
2+
3+
import java.util.List;
4+
5+
import flipnote.group.application.port.in.result.FindJoinFormListResult;
6+
import flipnote.group.domain.model.join.JoinInfo;
7+
8+
public record FindJoinFormListResponseDto(
9+
List<JoinInfo> joinList
10+
) {
11+
public static FindJoinFormListResponseDto from(FindJoinFormListResult result) {
12+
return new FindJoinFormListResponseDto(result.joinInfoList());
13+
}
14+
}

0 commit comments

Comments
 (0)