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 @@ -41,7 +41,7 @@ public class BoardController {
private final BookMarkService bookMarkService;

@PostMapping
@Operation(summary = "게시글 등록 API & 게시글 임시 등록 API", description = "게시글을 등록합니다.")
@Operation(summary = "게시글 등록 API & 게시글 임시 등록 API", description = "게시글을 등록하는 API 입니다.")
public BoardInfo createOrUpdateBoard(@JwtValidation Long userId,
@Valid @RequestBody CreateOrUpdateBoardRequest request) {
return boardService.createOrUpdateBoard(userId, null, request);
Expand Down Expand Up @@ -88,7 +88,7 @@ public StateResponse addBookMark(@JwtValidation Long userId,
}

@GetMapping("/bookmark")
@Operation(summary = "찜한 게시글 조회 API", description = "사용자가 찜한 게시글을 조회하는 API입니다.")
@Operation(summary = "찜한 게시글 조회 API", description = "사용자가 찜한 게시글을 조회하는 API 입니다.")
public PagedBoardInfo getBookMarkBoardList(@JwtValidation Long userId,
@PageableDefault(sort = "createdAt", direction = Sort.Direction.DESC)
@Parameter(hidden = true) Pageable pageable) {
Expand All @@ -103,22 +103,22 @@ public StateResponse removeBookMark(@JwtValidation Long userId,
}

@PatchMapping("/{boardId}")
@Operation(summary = "게시글 수정 API", description = "게시글을 수정합니다.")
@Operation(summary = "게시글 수정 API", description = "게시글을 수정하는 API 입니다.")
public BoardInfo updateBoard(@JwtValidation Long userId,
@PathVariable Long boardId,
@Valid @RequestBody CreateOrUpdateBoardRequest request) {
return boardService.createOrUpdateBoard(userId, boardId, request);
}

@DeleteMapping("/{boardId}")
@Operation(summary = "게시글 삭제 API", description = "게시글을 삭제합니다.")
@Operation(summary = "게시글 삭제 API", description = "게시글을 삭제하는 API 입니다.")
public BoardDeleteInfo deleteBoard(@JwtValidation Long userId,
@PathVariable Long boardId) {
return boardService.deleteBoard(userId, boardId);
}

@PatchMapping("/{boardId}/lift-up")
@Operation(summary = "게시글 끌어올리기 API", description = "게시글을 끌어올립니다.")
@Operation(summary = "게시글 끌어올리기 API", description = "게시글을 끌어올리는 API 입니다.")
public LiftUpStatusInfo updateLiftUpDate(@JwtValidation Long userId,
@PathVariable Long boardId) {
return boardService.updateLiftUpDate(userId, boardId);
Expand Down
23 changes: 17 additions & 6 deletions src/main/java/com/back/catchmate/domain/board/entity/Board.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,24 +8,31 @@
import com.back.catchmate.domain.notification.entity.Notification;
import com.back.catchmate.domain.user.entity.User;
import com.back.catchmate.global.entity.BaseTimeEntity;
import jakarta.persistence.*;
import jakarta.persistence.Id;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Table(name = "boards")
public class Board extends BaseTimeEntity {
Expand Down Expand Up @@ -100,6 +107,10 @@ public void updateBoard(Club cheerClub, Game game, CreateOrUpdateBoardRequest bo
this.game = game;
}

public void updateLiftUpDate(LocalDateTime localDateTime) {
this.liftUpDate = localDateTime;
}

public void deleteBoard() {
// Enroll 리스트 삭제
for (Enroll enroll : enrollList) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ public LiftUpStatusInfo updateLiftUpDate(Long userId, Long boardId) {
LocalDateTime nextLiftUpAllowed = board.getLiftUpDate().plusDays(3);

if (nextLiftUpAllowed.isBefore(now)) {
board.setLiftUpDate(now);
board.updateLiftUpDate(now);
return boardConverter.toLiftUpStatusInfo(true, null);
} else {
// 남은 시간 계산
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import com.google.firebase.messaging.FirebaseMessagingException;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
Expand Down
7 changes: 2 additions & 5 deletions src/main/java/com/back/catchmate/domain/game/entity/Game.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,21 +11,18 @@
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.ToString;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@Builder
@ToString
@NoArgsConstructor
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Table(name = "games")
public class Game extends BaseTimeEntity {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.back.catchmate.domain.report.controller;

import com.back.catchmate.domain.report.dto.ReportRequest.CreateReportRequest;
import com.back.catchmate.domain.report.service.ReportService;
import com.back.catchmate.global.dto.StateResponse;
import com.back.catchmate.global.jwt.JwtValidation;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
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;


@Tag(name = "신고 관련 API")
@RestController
@RequestMapping("/reports")
@RequiredArgsConstructor
public class ReportController {
private final ReportService reportService;

@PostMapping
@Operation(summary = "유저 신고 API", description = """
유저를 신고하는 API입니다. 신고 사유 목록은 다음과 같습니다:
- **PROFANITY**: 욕설 / 비하 발언

- **DEFAMATION**: 선수 혹은 특정인 비방

- **PRIVACY_INVASION**: 개인 사생활 침해

- **SPAM**: 게시글 도배

- **ADVERTISEMENT**: 홍보성 게시글

- **FALSE_INFORMATION**: 허위사실 유포

- **OTHER**: 기타
"""
)
public StateResponse reportUser(@JwtValidation Long userId,
@RequestBody CreateReportRequest request) {
return reportService.reportUser(userId, request);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.back.catchmate.domain.report.converter;

import com.back.catchmate.domain.report.dto.ReportRequest;
import com.back.catchmate.domain.report.entity.Report;
import com.back.catchmate.domain.user.entity.User;
import org.springframework.stereotype.Component;

@Component
public class ReportConverter {
public Report toEntity(User reporter, User reportedUser, ReportRequest.CreateReportRequest request) {
return Report.builder()
.reporter(reporter)
.reportedUser(reportedUser)
.reportReason(request.getReportReason())
.reasonDetail(request.getReasonDetail())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.back.catchmate.domain.report.dto;

import com.back.catchmate.domain.report.entity.ReportReason;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

public abstract class ReportRequest {
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public static class CreateReportRequest {
@NotNull
private Long reportedUserId;
@NotNull
private ReportReason reportReason;
@NotNull
private String reasonDetail;
}
}
48 changes: 48 additions & 0 deletions src/main/java/com/back/catchmate/domain/report/entity/Report.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.back.catchmate.domain.report.entity;

import com.back.catchmate.domain.user.entity.User;
import com.back.catchmate.global.entity.BaseTimeEntity;
import jakarta.persistence.Id;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor
@Table(name = "reports")
public class Report extends BaseTimeEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "reported_user_id", nullable = false)
private User reportedUser; // 신고 대상

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "reporter_id", nullable = false)
private User reporter; // 신고자

@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 500)
private ReportReason reportReason; // 신고 사유

@Column(nullable = false, length = 500)
private String reasonDetail; // 신고 사유
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.back.catchmate.domain.report.entity;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum ReportReason {
PROFANITY("욕설 / 비하 발언"),
DEFAMATION("선수 혹은 특정인 비방"),
PRIVACY_INVASION("개인 사생활 침해"),
SPAM("게시글 도배"),
ADVERTISEMENT("홍보성 게시글"),
FALSE_INFORMATION("허위사실 유포"),
OTHER("기타");

private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.back.catchmate.domain.report.repository;

import com.back.catchmate.domain.report.entity.Report;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ReportRepository extends JpaRepository<Report, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.back.catchmate.domain.report.service;

import com.back.catchmate.domain.report.dto.ReportRequest.CreateReportRequest;
import com.back.catchmate.global.dto.StateResponse;

public interface ReportService {
StateResponse reportUser(Long reporterId, CreateReportRequest request);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.back.catchmate.domain.report.service;

import com.back.catchmate.domain.report.converter.ReportConverter;
import com.back.catchmate.domain.report.dto.ReportRequest;
import com.back.catchmate.domain.report.entity.Report;
import com.back.catchmate.domain.report.repository.ReportRepository;
import com.back.catchmate.domain.user.entity.User;
import com.back.catchmate.domain.user.repository.UserRepository;
import com.back.catchmate.global.dto.StateResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
public class ReportServiceImpl implements ReportService {
private final ReportRepository reportRepository;
private final UserRepository userRepository;
private final ReportConverter reportConverter;

@Override
@Transactional
public StateResponse reportUser(Long reporterId, ReportRequest.CreateReportRequest request) {
User reporter = userRepository.findById(reporterId)
.orElseThrow(() -> new IllegalArgumentException("신고자를 찾을 수 없습니다."));

User reportedUser = userRepository.findById(request.getReportedUserId())
.orElseThrow(() -> new IllegalArgumentException("신고 대상 사용자를 찾을 수 없습니다."));

Report report = reportConverter.toEntity(reporter, reportedUser, request);
reportRepository.save(report);

return new StateResponse(true);
}
}