Skip to content

Commit 223ab3a

Browse files
Feat: 가입 신청 취소 API 추가
1 parent 0001d57 commit 223ab3a

7 files changed

Lines changed: 77 additions & 0 deletions

File tree

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

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

33
import org.springframework.http.HttpStatus;
44
import org.springframework.http.ResponseEntity;
5+
import org.springframework.web.bind.annotation.DeleteMapping;
56
import org.springframework.web.bind.annotation.GetMapping;
67
import org.springframework.web.bind.annotation.PatchMapping;
78
import org.springframework.web.bind.annotation.PathVariable;
@@ -16,9 +17,11 @@
1617
import flipnote.group.api.dto.response.ApplicationFormResponseDto;
1718
import flipnote.group.api.dto.response.FindJoinFormListResponseDto;
1819
import flipnote.group.api.dto.response.JoinRespondResponseDto;
20+
import flipnote.group.application.port.in.DeleteJoinUseCase;
1921
import flipnote.group.application.port.in.JoinRespondUseCase;
2022
import flipnote.group.application.port.in.JoinUseCase;
2123
import flipnote.group.application.port.in.command.ApplicationFormCommand;
24+
import flipnote.group.application.port.in.command.DeleteJoinCommand;
2225
import flipnote.group.application.port.in.command.FindJoinFormCommand;
2326
import flipnote.group.application.port.in.command.JoinRespondCommand;
2427
import flipnote.group.application.port.in.result.ApplicationFormResult;
@@ -34,6 +37,7 @@ public class JoinController {
3437

3538
private final JoinUseCase joinUseCase;
3639
private final JoinRespondUseCase joinRespondUseCase;
40+
private final DeleteJoinUseCase deleteJoinUseCase;
3741

3842
/**
3943
* 가입 신청 요청
@@ -101,4 +105,23 @@ public ResponseEntity<JoinRespondResponseDto> respondToJoinRequest(
101105
return ResponseEntity.ok(res);
102106
}
103107

108+
/**
109+
* 가입 신청 취소
110+
* @param userId
111+
* @param groupId
112+
* @param joinId
113+
* @return
114+
*/
115+
@DeleteMapping("/{joinId}")
116+
public ResponseEntity<Void> deleteJoin(
117+
@RequestHeader("X-USER-ID") Long userId,
118+
@PathVariable("groupId") Long groupId,
119+
@PathVariable("joinId") Long joinId
120+
) {
121+
DeleteJoinCommand cmd = new DeleteJoinCommand(userId, joinId);
122+
deleteJoinUseCase.deleteJoin(cmd);
123+
124+
return ResponseEntity.ok().build();
125+
}
126+
104127
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ public List<JoinEntity> findMyJoinList(Long userId) {
5555

5656
return joinList;
5757
}
58+
59+
@Override
60+
public void delete(JoinEntity join) {
61+
joinRepository.delete(join);
62+
}
5863
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package flipnote.group.application.port.in;
2+
3+
import flipnote.group.application.port.in.command.DeleteJoinCommand;
4+
5+
public interface DeleteJoinUseCase {
6+
void deleteJoin(DeleteJoinCommand cmd);
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package flipnote.group.application.port.in.command;
2+
3+
public record DeleteJoinCommand(
4+
Long userId,
5+
Long joinId
6+
) {
7+
}

src/main/java/flipnote/group/application/port/out/JoinRepositoryPort.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ public interface JoinRepositoryPort {
1616
JoinEntity updateJoin(JoinEntity join);
1717

1818
List<JoinEntity> findMyJoinList(Long userId);
19+
20+
void delete(JoinEntity join);
1921
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package flipnote.group.application.service;
2+
3+
import org.springframework.stereotype.Service;
4+
import org.springframework.transaction.annotation.Transactional;
5+
6+
import flipnote.group.adapter.out.entity.JoinEntity;
7+
import flipnote.group.adapter.out.persistence.JoinRepositoryAdapter;
8+
import flipnote.group.application.port.in.DeleteJoinUseCase;
9+
import flipnote.group.application.port.in.command.DeleteJoinCommand;
10+
import flipnote.group.domain.policy.BusinessException;
11+
import flipnote.group.domain.policy.ErrorCode;
12+
import lombok.RequiredArgsConstructor;
13+
14+
@Service
15+
@RequiredArgsConstructor
16+
public class DeleteJoinService implements DeleteJoinUseCase {
17+
18+
private final JoinRepositoryAdapter joinRepository;
19+
20+
@Override
21+
@Transactional
22+
public void deleteJoin(DeleteJoinCommand cmd) {
23+
24+
JoinEntity join = joinRepository.findJoin(cmd.joinId());
25+
26+
if(!join.getUserId().equals(cmd.userId())) {
27+
throw new BusinessException(ErrorCode.PERMISSION_DENIED);
28+
}
29+
joinRepository.delete(join);
30+
}
31+
}

src/main/java/flipnote/group/domain/model/BaseEntity.java

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

33
import java.time.LocalDateTime;
44

5+
import org.hibernate.annotations.SQLRestriction;
56
import org.springframework.data.annotation.CreatedDate;
67
import org.springframework.data.annotation.LastModifiedDate;
78
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@@ -14,6 +15,7 @@
1415
@Getter
1516
@MappedSuperclass
1617
@EntityListeners(AuditingEntityListener.class)
18+
@SQLRestriction("deleted_at IS NULL")
1719
public abstract class BaseEntity {
1820

1921
@CreatedDate

0 commit comments

Comments
 (0)