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
Expand Up @@ -38,7 +38,8 @@ public class SecurityConfig {
"/actuator/**",
"/api/v1/answers/internal/**",
"/api/v1/questions/internal/**",
"/api/v1/drill-answers/internal/**"
"/api/v1/drill-answers/internal/**",
"/api/v1/notices/**"
};

@Bean
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package me.thinkcat.opic.practice.controller;

import lombok.RequiredArgsConstructor;
import me.thinkcat.opic.practice.dto.CommonResponse;
import me.thinkcat.opic.practice.dto.response.NoticeResponse;
import me.thinkcat.opic.practice.service.NoticeService;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/api/v1/notices")
@RequiredArgsConstructor
public class NoticeController {

private final NoticeService noticeService;

@GetMapping
public ResponseEntity<CommonResponse<List<NoticeResponse>>> getNotices() {
List<NoticeResponse> notices = noticeService.getNotices();
return ResponseEntity.ok(
CommonResponse.<List<NoticeResponse>>builder()
.success(true)
.result(notices)
.message("Notices retrieved successfully")
.build()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package me.thinkcat.opic.practice.dto.mapper;

import me.thinkcat.opic.practice.dto.response.NoticeResponse;
import me.thinkcat.opic.practice.entity.Notice;

public class NoticeMapper {

private NoticeMapper() {}

public static NoticeResponse toResponse(Notice notice) {
return NoticeResponse.builder()
.id(notice.getId())
.title(notice.getTitle())
.content(notice.getContent())
.createdAt(notice.getCreatedAt())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package me.thinkcat.opic.practice.dto.response;

import lombok.Builder;
import lombok.Getter;

import java.time.LocalDateTime;

@Getter
@Builder
public class NoticeResponse {
private Long id;
private String title;
private String content;
private LocalDateTime createdAt;
}
25 changes: 25 additions & 0 deletions src/main/java/me/thinkcat/opic/practice/entity/Notice.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.thinkcat.opic.practice.entity;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.Where;

@Entity
@Table(name = "notices")
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Where(clause = "deleted_at IS NULL")
public class Notice extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false, length = 200)
private String title;

@Column(nullable = false, columnDefinition = "TEXT")
private String content;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package me.thinkcat.opic.practice.repository;

import me.thinkcat.opic.practice.entity.Notice;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface NoticeRepository extends JpaRepository<Notice, Long> {
List<Notice> findAllByOrderByCreatedAtDesc();
}
25 changes: 25 additions & 0 deletions src/main/java/me/thinkcat/opic/practice/service/NoticeService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package me.thinkcat.opic.practice.service;

import lombok.RequiredArgsConstructor;
import me.thinkcat.opic.practice.dto.mapper.NoticeMapper;
import me.thinkcat.opic.practice.dto.response.NoticeResponse;
import me.thinkcat.opic.practice.repository.NoticeRepository;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
public class NoticeService {

private final NoticeRepository noticeRepository;

public List<NoticeResponse> getNotices() {
return noticeRepository.findAllByOrderByCreatedAtDesc()
.stream()
.map(NoticeMapper::toResponse)
.toList();
}
}