diff --git a/src/main/java/com/repo/whopper/application/notice/impl/DeleteNoticeService.java b/src/main/java/com/repo/whopper/application/notice/impl/DeleteNoticeService.java new file mode 100644 index 0000000..db27449 --- /dev/null +++ b/src/main/java/com/repo/whopper/application/notice/impl/DeleteNoticeService.java @@ -0,0 +1,19 @@ +package com.repo.whopper.application.notice.impl; + +import com.repo.whopper.application.notice.usecase.DeleteNoticeUseCase; +import com.repo.whopper.domain.notice.NoticeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class DeleteNoticeService implements DeleteNoticeUseCase { + private final NoticeRepository noticeRepository; + + @Override + @Transactional + public void deleteNotice(String noticeId) { + noticeRepository.deleteById(noticeId); + } +} diff --git a/src/main/java/com/repo/whopper/application/notice/impl/EditNoticeService.java b/src/main/java/com/repo/whopper/application/notice/impl/EditNoticeService.java new file mode 100644 index 0000000..145b933 --- /dev/null +++ b/src/main/java/com/repo/whopper/application/notice/impl/EditNoticeService.java @@ -0,0 +1,24 @@ +package com.repo.whopper.application.notice.impl; + +import com.repo.whopper.application.notice.usecase.EditNoticeUseCase; +import com.repo.whopper.common.exception.notice.NoticeNotFoundException; +import com.repo.whopper.domain.notice.NoticeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class EditNoticeService implements EditNoticeUseCase { + private final NoticeRepository noticeRepository; + + @Override + @Transactional + public void editNotice(String noticeId, String title, String content) { + final var notice = noticeRepository.findById(noticeId) + .orElseThrow(()-> NoticeNotFoundException.EXCEPTION); + + var newNotice = notice.editNotice(title, content); + noticeRepository.save(newNotice); + } +} diff --git a/src/main/java/com/repo/whopper/application/notice/impl/WriteNoticeService.java b/src/main/java/com/repo/whopper/application/notice/impl/WriteNoticeService.java new file mode 100644 index 0000000..031474e --- /dev/null +++ b/src/main/java/com/repo/whopper/application/notice/impl/WriteNoticeService.java @@ -0,0 +1,28 @@ +package com.repo.whopper.application.notice.impl; + +import com.repo.whopper.application.notice.usecase.WriteNoticeUseCase; +import com.repo.whopper.application.teacher.component.CurrentTeacher; +import com.repo.whopper.domain.notice.NoticeModel; +import com.repo.whopper.domain.notice.NoticeRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.time.LocalDateTime; + +@Service +@RequiredArgsConstructor +public class WriteNoticeService implements WriteNoticeUseCase { + private final NoticeRepository noticeRepository; + private final CurrentTeacher currentTeacher; + + @Override + @Transactional + public void writeNotice(String title, String content) { + LocalDateTime now = LocalDateTime.now(); + + final var teacher = currentTeacher.getTeacher(); + + noticeRepository.save(new NoticeModel(null, title, content, teacher.name(), now, false)); + } +} \ No newline at end of file diff --git a/src/main/java/com/repo/whopper/application/notice/usecase/DeleteNoticeUseCase.java b/src/main/java/com/repo/whopper/application/notice/usecase/DeleteNoticeUseCase.java new file mode 100644 index 0000000..9091333 --- /dev/null +++ b/src/main/java/com/repo/whopper/application/notice/usecase/DeleteNoticeUseCase.java @@ -0,0 +1,5 @@ +package com.repo.whopper.application.notice.usecase; + +public interface DeleteNoticeUseCase { + void deleteNotice(String noticeId); +} diff --git a/src/main/java/com/repo/whopper/application/notice/usecase/EditNoticeUseCase.java b/src/main/java/com/repo/whopper/application/notice/usecase/EditNoticeUseCase.java new file mode 100644 index 0000000..89abf7d --- /dev/null +++ b/src/main/java/com/repo/whopper/application/notice/usecase/EditNoticeUseCase.java @@ -0,0 +1,5 @@ +package com.repo.whopper.application.notice.usecase; + +public interface EditNoticeUseCase { + void editNotice(String noticeId, String title, String content); +} diff --git a/src/main/java/com/repo/whopper/common/swagger/notice/DeleteNoticeApiDocumentation.java b/src/main/java/com/repo/whopper/common/swagger/notice/DeleteNoticeApiDocumentation.java new file mode 100644 index 0000000..e45e03e --- /dev/null +++ b/src/main/java/com/repo/whopper/common/swagger/notice/DeleteNoticeApiDocumentation.java @@ -0,0 +1,21 @@ +package com.repo.whopper.common.swagger.notice; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "Delete_notice", description = "공지 삭제 API") +public interface DeleteNoticeApiDocumentation { + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "OK, 성공!" + ) + }) + @Operation( + summary = "공지 삭제 API", + description = "클라이언트에서 받은 id로 공지를 삭제합니다." + ) + void deleteNotice(String noticeId); +} diff --git a/src/main/java/com/repo/whopper/common/swagger/notice/EditNoticeApiDocumentation.java b/src/main/java/com/repo/whopper/common/swagger/notice/EditNoticeApiDocumentation.java new file mode 100644 index 0000000..3fa4fb5 --- /dev/null +++ b/src/main/java/com/repo/whopper/common/swagger/notice/EditNoticeApiDocumentation.java @@ -0,0 +1,22 @@ +package com.repo.whopper.common.swagger.notice; + +import com.repo.whopper.interfaces.notice.dto.request.NoticeRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "Edit_notice", description = "공지 수정 API") +public interface EditNoticeApiDocumentation { + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "OK, 성공!" + ) + }) + @Operation( + summary = "공지 수정 API", + description = "클라이언트에서 받은 id로 공지를 검색하고, 검색한 공지의 제목과 내용을 수정합니다." + ) + void editNotice(String noticeId, NoticeRequest request); +} diff --git a/src/main/java/com/repo/whopper/common/swagger/notice/WriteNoticeApiDocumentation.java b/src/main/java/com/repo/whopper/common/swagger/notice/WriteNoticeApiDocumentation.java new file mode 100644 index 0000000..de0d1ae --- /dev/null +++ b/src/main/java/com/repo/whopper/common/swagger/notice/WriteNoticeApiDocumentation.java @@ -0,0 +1,22 @@ +package com.repo.whopper.common.swagger.notice; + +import com.repo.whopper.interfaces.notice.dto.request.NoticeRequest; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +@Tag(name = "Write_notice", description = "공지 작성 API") +public interface WriteNoticeApiDocumentation { + @ApiResponses({ + @ApiResponse( + responseCode = "200", + description = "OK, 성공!" + ) + }) + @Operation( + summary = "공지 작성 API", + description = "제목과 내용을 받아서 데이터베이스에 저장합니다." + ) + void writeNotice(NoticeRequest request); +} diff --git a/src/main/java/com/repo/whopper/domain/notice/NoticeModel.java b/src/main/java/com/repo/whopper/domain/notice/NoticeModel.java index e6570e6..be0d93c 100644 --- a/src/main/java/com/repo/whopper/domain/notice/NoticeModel.java +++ b/src/main/java/com/repo/whopper/domain/notice/NoticeModel.java @@ -16,4 +16,8 @@ public record NoticeModel( public NoticeModel checkNotice() { return new NoticeModel(id, title, content, writerName, createdAt, true); } + + public NoticeModel editNotice(String title, String content) { + return new NoticeModel(id, title, content, writerName, createdAt, checked); + } } diff --git a/src/main/java/com/repo/whopper/domain/notice/NoticeRepository.java b/src/main/java/com/repo/whopper/domain/notice/NoticeRepository.java index ee067c7..9931892 100644 --- a/src/main/java/com/repo/whopper/domain/notice/NoticeRepository.java +++ b/src/main/java/com/repo/whopper/domain/notice/NoticeRepository.java @@ -4,7 +4,8 @@ import java.util.stream.Stream; public interface NoticeRepository { - NoticeModel save(NoticeModel model); + void save(NoticeModel model); Optional findById(String noticeId); Stream findAll(); + void deleteById(String noticeId); } diff --git a/src/main/java/com/repo/whopper/domain/notice/NoticeRepositoryImpl.java b/src/main/java/com/repo/whopper/domain/notice/NoticeRepositoryImpl.java index 5724b5d..b430763 100644 --- a/src/main/java/com/repo/whopper/domain/notice/NoticeRepositoryImpl.java +++ b/src/main/java/com/repo/whopper/domain/notice/NoticeRepositoryImpl.java @@ -13,10 +13,10 @@ public class NoticeRepositoryImpl implements NoticeRepository { private final NoticeEntityMapper noticeEntityMapper; @Override - public NoticeModel save(NoticeModel model) { + public void save(NoticeModel model) { final var entity = noticeEntityMapper.toEntity(model); - return noticeEntityMapper.toModel(noticeMongoRepository.save(entity)); + noticeMongoRepository.save(entity); } @Override @@ -30,4 +30,9 @@ public Stream findAll() { return noticeEntityMapper.toStreamLibraryModel(result); } + + @Override + public void deleteById(String noticeId) { + noticeMongoRepository.deleteById(noticeId); + } } diff --git a/src/main/java/com/repo/whopper/interfaces/notice/DeleteNoticeController.java b/src/main/java/com/repo/whopper/interfaces/notice/DeleteNoticeController.java new file mode 100644 index 0000000..aa9ac09 --- /dev/null +++ b/src/main/java/com/repo/whopper/interfaces/notice/DeleteNoticeController.java @@ -0,0 +1,23 @@ +package com.repo.whopper.interfaces.notice; + +import com.repo.whopper.application.notice.usecase.DeleteNoticeUseCase; +import com.repo.whopper.common.annotation.OnlyTeacher; +import com.repo.whopper.common.swagger.notice.DeleteNoticeApiDocumentation; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/notice") +public class DeleteNoticeController implements DeleteNoticeApiDocumentation { + private final DeleteNoticeUseCase deleteNoticeUseCase; + + @OnlyTeacher + @DeleteMapping("/{noticeId}") + public void deleteNotice(@PathVariable String noticeId) { + deleteNoticeUseCase.deleteNotice(noticeId); + } +} diff --git a/src/main/java/com/repo/whopper/interfaces/notice/EditNoticeController.java b/src/main/java/com/repo/whopper/interfaces/notice/EditNoticeController.java new file mode 100644 index 0000000..319c7e8 --- /dev/null +++ b/src/main/java/com/repo/whopper/interfaces/notice/EditNoticeController.java @@ -0,0 +1,25 @@ +package com.repo.whopper.interfaces.notice; + +import com.repo.whopper.application.notice.usecase.EditNoticeUseCase; +import com.repo.whopper.common.annotation.OnlyTeacher; +import com.repo.whopper.common.swagger.notice.EditNoticeApiDocumentation; +import com.repo.whopper.interfaces.notice.dto.request.NoticeRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/notice") +public class EditNoticeController implements EditNoticeApiDocumentation { + private final EditNoticeUseCase editNoticeUseCase; + + @OnlyTeacher + @PatchMapping("/{noticeId}") + public void editNotice(@PathVariable String noticeId, @RequestBody NoticeRequest request) { + editNoticeUseCase.editNotice(noticeId, request.title(), request.content()); + } +} diff --git a/src/main/java/com/repo/whopper/interfaces/notice/WriteNoticeController.java b/src/main/java/com/repo/whopper/interfaces/notice/WriteNoticeController.java new file mode 100644 index 0000000..a5e4b4b --- /dev/null +++ b/src/main/java/com/repo/whopper/interfaces/notice/WriteNoticeController.java @@ -0,0 +1,24 @@ +package com.repo.whopper.interfaces.notice; + +import com.repo.whopper.application.notice.usecase.WriteNoticeUseCase; +import com.repo.whopper.common.annotation.OnlyTeacher; +import com.repo.whopper.common.swagger.notice.WriteNoticeApiDocumentation; +import com.repo.whopper.interfaces.notice.dto.request.NoticeRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/notice") +public class WriteNoticeController implements WriteNoticeApiDocumentation { + private final WriteNoticeUseCase writeNoticeUseCase; + + @OnlyTeacher + @PostMapping + public void writeNotice(@RequestBody NoticeRequest request) { + writeNoticeUseCase.writeNotice(request.title(), request.content()); + } +} diff --git a/src/main/java/com/repo/whopper/interfaces/notice/dto/request/NoticeRequest.java b/src/main/java/com/repo/whopper/interfaces/notice/dto/request/NoticeRequest.java new file mode 100644 index 0000000..75462d6 --- /dev/null +++ b/src/main/java/com/repo/whopper/interfaces/notice/dto/request/NoticeRequest.java @@ -0,0 +1,6 @@ +package com.repo.whopper.interfaces.notice.dto.request; + +public record NoticeRequest( + String title, + String content +) {}