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 @@ -13,6 +13,8 @@ public enum UserInterestEnum {
HEALTH_MEDICAL("보건·의료", "관심주제"),
CULTURE_ENVIRONMENT("문화·환경", "관심주제"),
LIFE_STABILITY("생활안정", "관심주제"),
PROTECTION_CARE("보호·돌봄", "관심주제"), // 새로 추가된 카테고리
OTHER("기타", "관심주제"),

// SpecialGroup 관련 관심사
IS_MULTI_CULTURAL("다문화가족", "가구형태"),
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,42 @@
package com.hyetaekon.hyetaekon.answer.controller;

import com.hyetaekon.hyetaekon.answer.dto.AnswerDto;
import com.hyetaekon.hyetaekon.answer.service.AnswerService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/posts/{postId}/answers")
@RequiredArgsConstructor
public class AnswerController {

private final AnswerService answerService;

// 답변 작성
@PostMapping
@PreAuthorize("hasRole('USER')")
public ResponseEntity<AnswerDto> createAnswer(@PathVariable Long postId, @RequestBody AnswerDto answerDto) {
AnswerDto createdAnswer = answerService.createAnswer(postId, answerDto);
return ResponseEntity.status(HttpStatus.CREATED).body(createdAnswer);
}

// 답변 채택
@PutMapping("/{answerId}/select")
@PreAuthorize("hasRole('USER')")
public ResponseEntity<Void> selectAnswer(@PathVariable Long answerId) {
answerService.selectAnswer(answerId);
return ResponseEntity.ok().build();
}

// 답변 삭제 (관리자만 가능)
@DeleteMapping("/admin/answers/{answerId}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> deleteAnswer(@PathVariable Long answerId) {
answerService.deleteAnswer(answerId);
return ResponseEntity.noContent().build();
}
}

10 changes: 10 additions & 0 deletions src/main/java/com/hyetaekon/hyetaekon/answer/dto/AnswerDto.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,14 @@
package com.hyetaekon.hyetaekon.answer.dto;

import lombok.Data;
import java.time.LocalDateTime;

@Data
public class AnswerDto {
private Long id;
private Long postId;
private Long userId;
private String content;
private LocalDateTime createdAt;
private boolean selected;
}
29 changes: 29 additions & 0 deletions src/main/java/com/hyetaekon/hyetaekon/answer/entity/Answer.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,33 @@
package com.hyetaekon.hyetaekon.answer.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "answer")
public class Answer {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 답변 ID

@Column(name = "post_id", nullable = false)
private Long postId; // 게시글 ID

@Column(name = "user_id", nullable = false)
private Long userId; // 회원 ID

@Column(name = "content", columnDefinition = "TEXT", nullable = false)
private String content; // 답변 내용

@Column(name = "created_at", nullable = false)
private LocalDateTime createdAt; // 생성일

@Column(name = "selected", nullable = false)
private boolean selected; // 채택 여부
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,19 @@
package com.hyetaekon.hyetaekon.answer.mapper;

import com.hyetaekon.hyetaekon.answer.dto.AnswerDto;
import com.hyetaekon.hyetaekon.answer.entity.Answer;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "spring")
public interface AnswerMapper {
AnswerMapper INSTANCE = Mappers.getMapper(AnswerMapper.class);

AnswerDto toDto(Answer answer);

@Mapping(target = "id", ignore = true) // id는 자동 생성되므로 무시
@Mapping(target = "selected", ignore = true) // 기본값 false 처리
@Mapping(target = "createdAt", ignore = true) // createdAt 자동 설정
Answer toEntity(AnswerDto answerDto);
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
package com.hyetaekon.hyetaekon.answer.repository;

public class AnswerRepository {
import com.hyetaekon.hyetaekon.answer.entity.Answer;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface AnswerRepository extends JpaRepository<Answer, Long> {
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,34 @@
package com.hyetaekon.hyetaekon.answer.service;

import com.hyetaekon.hyetaekon.answer.dto.AnswerDto;
import com.hyetaekon.hyetaekon.answer.entity.Answer;
import com.hyetaekon.hyetaekon.answer.mapper.AnswerMapper;
import com.hyetaekon.hyetaekon.answer.repository.AnswerRepository;
import jakarta.persistence.EntityNotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AnswerService {
private final AnswerRepository answerRepository;
private final AnswerMapper answerMapper;

public AnswerDto createAnswer(Long postId, AnswerDto answerDto) {
Answer answer = answerMapper.toEntity(answerDto);
answer.setPostId(postId);
answer = answerRepository.save(answer);
return answerMapper.toDto(answer);
}

public void selectAnswer(Long answerId) {
Answer answer = answerRepository.findById(answerId)
.orElseThrow(() -> new EntityNotFoundException("Answer not found"));
answer.setSelected(true);
answerRepository.save(answer);
}

public void deleteAnswer(Long answerId) {
answerRepository.deleteById(answerId);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package com.hyetaekon.hyetaekon.banner.controller;

import com.hyetaekon.hyetaekon.banner.dto.BannerDto;
import com.hyetaekon.hyetaekon.banner.service.BannerService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/banners")
@RequiredArgsConstructor
public class BannerController {
private final BannerService bannerService;

// 배너 목록 조회 (ALL)
@GetMapping
public ResponseEntity<List<BannerDto>> getBanners() {
return ResponseEntity.ok(bannerService.getBanners());
}

// 배너 상세 조회 (ALL)
@GetMapping("/{bannerId}")
public ResponseEntity<BannerDto> getBanner(@PathVariable Long bannerId) {
return ResponseEntity.ok(bannerService.getBanner(bannerId));
}

// 배너 목록 조회 (ADMIN)
@GetMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<List<BannerDto>> getAdminBanners() {
return ResponseEntity.ok(bannerService.getAdminBanners());
}

// 배너 등록 (ADMIN)
@PostMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<BannerDto> createBanner(@RequestBody BannerDto bannerDto) {
return ResponseEntity.ok(bannerService.createBanner(bannerDto));
}

// 배너 수정 (ADMIN)
@PutMapping("/admin/{bannerId}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<BannerDto> updateBanner(
@PathVariable Long bannerId, @RequestBody BannerDto bannerDto) {
return ResponseEntity.ok(bannerService.updateBanner(bannerId, bannerDto));
}

// 배너 삭제 (ADMIN)
@DeleteMapping("/admin/{bannerId}")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> deleteBanner(@PathVariable Long bannerId) {
bannerService.deleteBanner(bannerId);
return ResponseEntity.noContent().build();
}

// 배너 순서 변경 (ADMIN)
@PatchMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public ResponseEntity<Void> updateBannerOrder(@RequestBody List<Long> bannerIds) {
bannerService.updateBannerOrder(bannerIds);
return ResponseEntity.noContent().build();
}
}

This file was deleted.

14 changes: 14 additions & 0 deletions src/main/java/com/hyetaekon/hyetaekon/banner/dto/BannerDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.hyetaekon.hyetaekon.banner.dto;

import lombok.Data;
import java.time.LocalDateTime;

@Data
public class BannerDto {
private Long id;
private String title;
private String imageUrl;
private String linkUrl;
private int displayOrder;
private LocalDateTime createdAt;
}

This file was deleted.

36 changes: 36 additions & 0 deletions src/main/java/com/hyetaekon/hyetaekon/banner/entity/Banner.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.hyetaekon.hyetaekon.banner.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@NoArgsConstructor
@Table(name = "banner")
public class Banner {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id; // 배너 ID

@Column(name = "title", nullable = false, length = 100)
private String title; // 배너 제목

@Column(name = "image_url", nullable = false, length = 500)
private String imageUrl; // 배너 이미지 URL

@Column(name = "link_url", length = 500)
private String linkUrl; // 배너 클릭 시 이동할 URL

@Column(name = "display_order", nullable = false)
private int displayOrder; // 배너 정렬 순서

@Column(name = "created_at", nullable = false)
private LocalDateTime createdAt; // 생성일

@Column(name = "updated_at")
private LocalDateTime updatedAt; // 수정일
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.hyetaekon.hyetaekon.banner.mapper;

import com.hyetaekon.hyetaekon.banner.dto.BannerDto;
import com.hyetaekon.hyetaekon.banner.entity.Banner;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper(componentModel = "spring")
public interface BannerMapper {
BannerMapper INSTANCE = Mappers.getMapper(BannerMapper.class);

BannerDto toDto(Banner banner);

@Mapping(target = "id", ignore = true) // id는 자동 생성됨
Banner toEntity(BannerDto bannerDto);
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.hyetaekon.hyetaekon.banner.repository;

import com.hyetaekon.hyetaekon.banner.entity.Banner;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;

public interface BannerRepository extends JpaRepository<Banner, Long> {
List<Banner> findAllByOrderByDisplayOrderAsc();
}

This file was deleted.

Loading