Skip to content

Commit a406120

Browse files
authored
[DDING-87] 동아리 지원 폼지 삭제 API 구현 (#232)
1 parent 4612739 commit a406120

17 files changed

+214
-51
lines changed

src/main/java/ddingdong/ddingdongBE/common/exception/AuthenticationException.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ sealed public class AuthenticationException extends CustomException {
77
public static final String UNREGISTERED_ID_ERROR_MESSAGE = "등록되지 않은 ID입니다.";
88
public static final String INVALIDATED_PASSWORD_ERROR_MESSAGE = "잘못된 비밀번호입니다.";
99
public static final String NON_EXIST_USER_ROLE_ERROR_MESSAGE = "유저 권한이 존재하지 않습니다.";
10+
public static final String NON_HAVE_AUTHORITY_MESSAGE = "해당 유저에게 권한이 없습니다.";
1011

1112
public AuthenticationException(String message, int errorCode) {
1213
super(message, errorCode);
@@ -32,4 +33,11 @@ public NonExistUserRole() {
3233
super(NON_EXIST_USER_ROLE_ERROR_MESSAGE, UNAUTHORIZED.value());
3334
}
3435
}
36+
37+
public static final class NonHaveAuthority extends AuthenticationException {
38+
39+
public NonHaveAuthority() {
40+
super(NON_HAVE_AUTHORITY_MESSAGE, UNAUTHORIZED.value());
41+
}
42+
}
3543
}

src/main/java/ddingdong/ddingdongBE/domain/form/api/CentralFormApi.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,10 @@
77
import io.swagger.v3.oas.annotations.responses.ApiResponse;
88
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
99
import io.swagger.v3.oas.annotations.tags.Tag;
10+
import jakarta.validation.Valid;
1011
import org.springframework.http.HttpStatus;
1112
import org.springframework.security.core.annotation.AuthenticationPrincipal;
13+
import org.springframework.web.bind.annotation.DeleteMapping;
1214
import org.springframework.web.bind.annotation.PathVariable;
1315
import org.springframework.web.bind.annotation.PostMapping;
1416
import org.springframework.web.bind.annotation.PutMapping;
@@ -26,7 +28,7 @@ public interface CentralFormApi {
2628
@SecurityRequirement(name = "AccessToken")
2729
@PostMapping("/my/forms")
2830
void createForm(
29-
@RequestBody CreateFormRequest createFormRequest,
31+
@Valid @RequestBody CreateFormRequest createFormRequest,
3032
@AuthenticationPrincipal PrincipalDetails principalDetails
3133
);
3234

@@ -36,7 +38,17 @@ void createForm(
3638
@SecurityRequirement(name = "AccessToken")
3739
@PutMapping("/my/forms/{formId}")
3840
void updateForm(
39-
@RequestBody UpdateFormRequest updateFormRequest,
41+
@Valid @RequestBody UpdateFormRequest updateFormRequest,
42+
@PathVariable("formId") Long formId,
43+
@AuthenticationPrincipal PrincipalDetails principalDetails
44+
);
45+
46+
@Operation(summary = "동아리 지원 폼지 삭제 API")
47+
@ApiResponse(responseCode = "204", description = "동아리 지원 폼지 삭제 성공")
48+
@ResponseStatus(HttpStatus.NO_CONTENT)
49+
@SecurityRequirement(name = "AccessToken")
50+
@DeleteMapping("/my/forms/{formId}")
51+
void deleteForm(
4052
@PathVariable("formId") Long formId,
4153
@AuthenticationPrincipal PrincipalDetails principalDetails
4254
);

src/main/java/ddingdong/ddingdongBE/domain/form/controller/CentralFormController.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,10 @@ public void updateForm(
3232
) {
3333
facadeCentralFormService.updateForm(updateFormRequest.toCommand(formId));
3434
}
35+
36+
@Override
37+
public void deleteForm(Long formId, PrincipalDetails principalDetails) {
38+
User user = principalDetails.getUser();
39+
facadeCentralFormService.deleteForm(formId, user);
40+
}
3541
}

src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,13 @@
22

33
import ddingdong.ddingdongBE.domain.form.service.dto.command.CreateFormCommand;
44
import ddingdong.ddingdongBE.domain.form.service.dto.command.UpdateFormCommand;
5+
import ddingdong.ddingdongBE.domain.user.entity.User;
56

67
public interface FacadeCentralFormService {
78

89
void createForm(CreateFormCommand command);
910

1011
void updateForm(UpdateFormCommand command);
12+
13+
void deleteForm(Long formId, User user);
1114
}

src/main/java/ddingdong/ddingdongBE/domain/form/service/FacadeCentralFormServiceImpl.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ddingdong.ddingdongBE.domain.form.service;
22

3+
import ddingdong.ddingdongBE.common.exception.AuthenticationException.NonHaveAuthority;
34
import ddingdong.ddingdongBE.domain.club.entity.Club;
45
import ddingdong.ddingdongBE.domain.club.service.ClubService;
56
import ddingdong.ddingdongBE.domain.form.entity.Form;
@@ -8,7 +9,9 @@
89
import ddingdong.ddingdongBE.domain.form.service.dto.command.CreateFormCommand.CreateFormFieldCommand;
910
import ddingdong.ddingdongBE.domain.form.service.dto.command.UpdateFormCommand;
1011
import ddingdong.ddingdongBE.domain.form.service.dto.command.UpdateFormCommand.UpdateFormFieldCommand;
12+
import ddingdong.ddingdongBE.domain.user.entity.User;
1113
import java.util.List;
14+
import java.util.Objects;
1215
import lombok.RequiredArgsConstructor;
1316
import org.springframework.stereotype.Service;
1417
import org.springframework.transaction.annotation.Transactional;
@@ -47,6 +50,21 @@ public void updateForm(UpdateFormCommand updateFormCommand) {
4750
formFieldService.createAll(updateFormFields);
4851
}
4952

53+
@Transactional
54+
@Override
55+
public void deleteForm(Long formId, User user) {
56+
Club club = clubService.getByUserId(user.getId());
57+
Form form = formService.getById(formId);
58+
validateEqualsClub(club, form);
59+
formService.delete(form); //테이블 생성 시 외래 키에 cascade 설정하여 formField 삭제도 자동으로 됨.
60+
}
61+
62+
private void validateEqualsClub(Club club, Form form) {
63+
if (!Objects.equals(club.getId(), form.getClub().getId())) {
64+
throw new NonHaveAuthority();
65+
}
66+
}
67+
5068
private List<FormField> toUpdateFormFields(Form originform, List<UpdateFormFieldCommand> updateFormFieldCommands) {
5169
return updateFormFieldCommands.stream()
5270
.map(formFieldCommand -> formFieldCommand.toEntity(originform))

src/main/java/ddingdong/ddingdongBE/domain/form/service/FormService.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ public interface FormService {
77
Form create(Form form);
88

99
Form getById(Long formId);
10+
11+
void delete(Form form);
1012
}

src/main/java/ddingdong/ddingdongBE/domain/form/service/GeneralFormFieldService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
package ddingdong.ddingdongBE.domain.form.service;
22

3+
import ddingdong.ddingdongBE.common.exception.PersistenceException.ResourceNotFound;
34
import ddingdong.ddingdongBE.domain.form.entity.Form;
45
import ddingdong.ddingdongBE.domain.form.entity.FormField;
56
import ddingdong.ddingdongBE.domain.form.repository.FormFieldRepository;
67
import java.util.List;
7-
import java.util.Optional;
8-
98
import lombok.RequiredArgsConstructor;
109
import org.springframework.stereotype.Service;
1110
import org.springframework.transaction.annotation.Transactional;
@@ -27,8 +26,9 @@ public void createAll(List<FormField> formFields) {
2726
@Override
2827
public FormField getById(Long id) {
2928
return formFieldRepository.findById(id)
30-
.orElseThrow(() -> new IllegalArgumentException("해당 field를 id로 찾을 수 없습니다: " + id));
31-
29+
.orElseThrow(() -> new ResourceNotFound("FormField(fieldId=" + id + ")를 찾을 수 없습니다."));
30+
}
31+
3232
@Override
3333
public List<FormField> findAllByForm(Form form) {
3434
return formFieldRepository.findAllByForm(form);

src/main/java/ddingdong/ddingdongBE/domain/form/service/GeneralFormService.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,4 +25,10 @@ public Form getById(Long formId) {
2525
return formRepository.findById(formId)
2626
.orElseThrow(() -> new ResourceNotFound("Form(formId=" + formId + ")를 찾을 수 없습니다."));
2727
}
28+
29+
@Transactional
30+
@Override
31+
public void delete(Form form) {
32+
formRepository.delete(form);
33+
}
2834
}

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/UserFormController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,6 @@ public class UserFormController implements UserFormApi {
1414

1515
@Override
1616
public void createFormResponse(Long formId, CreateFormApplicationRequest createFormApplicationRequest) {
17-
facadeUserFormService.createFormApplication(formId, createFormApplicationRequest.toCommand());
17+
facadeUserFormService.createFormApplication(createFormApplicationRequest.toCommand(formId));
1818
}
1919
}

src/main/java/ddingdong/ddingdongBE/domain/formapplicaion/controller/dto/request/CreateFormApplicationRequest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,12 @@ public CreateFormAnswerCommand toCommand() {
4242
}
4343
}
4444

45-
public CreateFormApplicationCommand toCommand() {
45+
public CreateFormApplicationCommand toCommand(Long formId) {
4646
List<CreateFormAnswerCommand> createFormAnswerCommands = formAnswers.stream()
4747
.map(CreateFormAnswerRequest::toCommand)
4848
.toList();
4949
return CreateFormApplicationCommand.builder()
50+
.formId(formId)
5051
.name(name)
5152
.studentNumber(studentNumber)
5253
.department(department)

0 commit comments

Comments
 (0)