Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package plango.notice.application.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDateTime;
import lombok.Builder;
import plango.notice.domain.entity.NoticeType;

@Schema(description = "사용자 공지사항 리스트 응답")
public record NoticeMemberListResponse(
@Schema(description = "공지 ID", example = "1")
Long id,

@Schema(description = "공지 제목", example = "서비스 점검 안내")
String title,

@Schema(
description = "공지 타입",
example = "UPDATE",
allowableValues = {"ERROR", "UPDATE", "EMERGENCY"}
)
NoticeType type,

@Schema(
description = "공지 내용",
example = "금일 23시부터 서버 점검이 진행됩니다."
)
String content,

@Schema(description = "생성 일시", example = "2025-12-08T12:34:56")
LocalDateTime createdAt
) {
@Builder
public NoticeMemberListResponse {
}
}
18 changes: 18 additions & 0 deletions src/main/java/plango/notice/application/mapper/NoticeMapper.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import java.util.List;
import plango.notice.application.dto.request.NoticeCreateRequest;
import plango.notice.application.dto.response.NoticeListResponse;
import plango.notice.application.dto.response.NoticeMemberListResponse;
import plango.notice.application.dto.response.NoticeResponse;
import plango.notice.domain.entity.Notice;

Expand Down Expand Up @@ -43,4 +44,21 @@ public static List<NoticeListResponse> toListResponses(List<Notice> notices) {
.map(NoticeMapper::toListResponse)
.toList();
}

// ===== 사용자용 매핑 =====
public static NoticeMemberListResponse toMemberListResponse(Notice notice) {
return NoticeMemberListResponse.builder()
.id(notice.getId())
.title(notice.getTitle())
.type(notice.getType())
.content(notice.getContent())
.createdAt(notice.getCreatedAt())
.build();
}

public static List<NoticeMemberListResponse> toMemberListResponses(List<Notice> notices) {
return notices.stream()
.map(NoticeMapper::toMemberListResponse)
.toList();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package plango.notice.application.usecase;

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import plango.notice.application.dto.response.NoticeMemberListResponse;
import plango.notice.application.mapper.NoticeMapper;
import plango.notice.domain.entity.Notice;
import plango.notice.domain.service.NoticeService;

@Service
@RequiredArgsConstructor
public class NoticeListQueryUseCase {

private final NoticeService noticeService;

@Transactional(readOnly = true)
public List<NoticeMemberListResponse> execute() {
List<Notice> notices = noticeService.getAll();

return NoticeMapper.toMemberListResponses(notices);
}
}
39 changes: 39 additions & 0 deletions src/main/java/plango/notice/presentation/NoticeController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package plango.notice.presentation;

import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import plango.global.common.response.CommonResponse;
import plango.global.common.response.ResponseMessage;
import plango.notice.application.dto.response.NoticeMemberListResponse;
import plango.notice.application.usecase.NoticeListQueryUseCase;

@Tag(
name = "사용자 공지사항",
description = "사용자가 공지사항을 조회하는 API"
)
@RestController
@RequiredArgsConstructor
@RequestMapping("/api/notices")
public class NoticeController {

private final NoticeListQueryUseCase noticeListQueryUseCase;

@Operation(
summary = "공지사항 목록 조회 (사용자)",
description = "사용자가 전체 공지사항을 최신 순으로 조회합니다."
)
@GetMapping
public CommonResponse<List<NoticeMemberListResponse>> getNoticeList() {
List<NoticeMemberListResponse> responses = noticeListQueryUseCase.execute();

return CommonResponse.success(
ResponseMessage.NOTICE_LIST_GET_SUCCESS,
responses
);
}
}