Skip to content

Commit

Permalink
Merge branch 'dev' into feat/#740
Browse files Browse the repository at this point in the history
  • Loading branch information
chsua authored Oct 18, 2023
2 parents df5ee74 + 628c116 commit 77236dd
Show file tree
Hide file tree
Showing 159 changed files with 33,774 additions and 17,793 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package com.votogether.domain.alarm.controller;

import com.votogether.domain.alarm.dto.ReportActionAlarmResponse;
import com.votogether.domain.alarm.dto.ReportActionResponse;
import com.votogether.domain.alarm.service.AlarmService;
import com.votogether.domain.member.entity.Member;
import com.votogether.global.jwt.Auth;
import jakarta.validation.constraints.PositiveOrZero;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Validated
@RequiredArgsConstructor
@RequestMapping("/alarms")
@RestController
public class AlarmCommandController implements AlarmCommandControllerDocs {

private final AlarmService alarmService;

@RequestMapping("/report")
public ResponseEntity<List<ReportActionAlarmResponse>> getReportActionAlarms(
@RequestParam @PositiveOrZero(message = "페이지는 0이상 정수만 가능합니다.") final int page,
@Auth final Member member
) {
final List<ReportActionAlarmResponse> response = alarmService.getReportActionAlarms(member, page);
return ResponseEntity.ok(response);
}

@RequestMapping("/report/{id}")
public ResponseEntity<ReportActionResponse> getReportActionAlarm(
@PathVariable("id") final Long reportActionAlarmId,
@Auth final Member member
) {
final ReportActionResponse response = alarmService.getReportActionAlarm(reportActionAlarmId, member);
return ResponseEntity.ok(response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.votogether.domain.alarm.controller;

import com.votogether.domain.alarm.dto.ReportActionAlarmResponse;
import com.votogether.domain.alarm.dto.ReportActionResponse;
import com.votogether.domain.member.entity.Member;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.constraints.PositiveOrZero;
import java.util.List;
import org.springframework.http.ResponseEntity;

@Tag(name = "알림", description = "알림 API")
public interface AlarmCommandControllerDocs {

@Operation(summary = "신고조치알림 조회", description = "신고조치알림목록을 조회한다.")
@ApiResponse(responseCode = "201", description = "조회 성공")
ResponseEntity<List<ReportActionAlarmResponse>> getReportActionAlarms(
@Parameter(description = "현재 페이지 위치", example = "0")
@PositiveOrZero(message = "페이지는 0이상 정수만 가능합니다.") final int page,
final Member member
);

@Operation(summary = "신고조치알림 상세 조회", description = "신고조치알림를 상세 조회한다.")
@ApiResponse(responseCode = "201", description = "조회 성공")
public ResponseEntity<ReportActionResponse> getReportActionAlarm(
@Parameter(description = "신고조치알림 ID", example = "1") final Long reportActionAlarmId,
final Member member
);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.votogether.domain.alarm.dto;

import com.votogether.domain.alarm.entity.ReportActionAlarm;
import io.swagger.v3.oas.annotations.media.Schema;

@Schema(description = "신고조치알림 응답")
public record ReportActionAlarmResponse(
@Schema(description = "알림 ID", example = "1")
Long alarmId,

@Schema(description = "확인 여부", example = "false")
boolean isChecked,

@Schema(description = "신고조치 세부정보")
ReportActionResponse detail
) {

public static ReportActionAlarmResponse from(
final ReportActionAlarm reportActionAlarm
) {
return new ReportActionAlarmResponse(
reportActionAlarm.getId(),
reportActionAlarm.isChecked(),
ReportActionResponse.from(reportActionAlarm)
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package com.votogether.domain.alarm.dto;

import com.votogether.domain.alarm.entity.ReportActionAlarm;
import com.votogether.domain.report.entity.vo.ReportType;
import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDateTime;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;

@Schema(description = "신고조치 응답")
public record ReportActionResponse(
@Schema(description = "신고조치 ID", example = "1")
Long reportActionId,

@Schema(description = "신고조치타입", example = "POST")
ReportType type,

@Schema(description = "신고대상내용", example = "1")
String content,

@Schema(description = "신고사유")
Set<String> reasons,

@Schema(description = "신고조치시간", example = "2023-08-01 13:56")
LocalDateTime createdAt
) {

public static ReportActionResponse from(final ReportActionAlarm reportActionAlarm) {
final Set<String> reasons = Stream.of(reportActionAlarm.getReasons().split(","))
.map(String::strip)
.collect(Collectors.toSet());

return new ReportActionResponse(
reportActionAlarm.getId(),
reportActionAlarm.getReportType(),
reportActionAlarm.getTarget(),
reasons,
reportActionAlarm.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
package com.votogether.domain.alarm.entity;

import com.votogether.domain.common.BaseEntity;
import com.votogether.domain.member.entity.Member;
import com.votogether.domain.report.entity.vo.ReportType;
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.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@EqualsAndHashCode(of = {"id"}, callSuper = false)
public class ReportActionAlarm extends BaseEntity {

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
private Member member;

@Enumerated(value = EnumType.STRING)
@Column(length = 20, nullable = false)
private ReportType reportType;

@Column(length = 500, nullable = false)
private String target;

@Column(length = 500, nullable = false)
private String reasons;

@Column(nullable = false)
private boolean isChecked;

@Builder
private ReportActionAlarm(
final Member member,
final ReportType reportType,
final String target,
final String reasons,
final boolean isChecked
) {
this.member = member;
this.reportType = reportType;
this.target = target;
this.reasons = reasons;
this.isChecked = isChecked;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.votogether.domain.alarm.exception;

import com.votogether.global.exception.ExceptionType;
import lombok.Getter;

@Getter
public enum ReportActionAlarmExceptionType implements ExceptionType {

NOT_FOUND(1300, "신고조치알림이 존재하지 않습니다."),
;

private final int code;
private final String message;

ReportActionAlarmExceptionType(final int code, final String message) {
this.code = code;
this.message = message;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.votogether.domain.alarm.repository;

import com.votogether.domain.alarm.entity.ReportActionAlarm;
import com.votogether.domain.member.entity.Member;
import java.util.List;
import java.util.Optional;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ReportActionAlarmRepository extends JpaRepository<ReportActionAlarm, Long> {

List<ReportActionAlarm> findByMember(final Member member, final Pageable pageable);

Optional<ReportActionAlarm> findByIdAndMember(final Long Id, final Member member);

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package com.votogether.domain.alarm.service;

import com.votogether.domain.alarm.dto.ReportActionAlarmResponse;
import com.votogether.domain.alarm.dto.ReportActionResponse;
import com.votogether.domain.alarm.entity.ReportActionAlarm;
import com.votogether.domain.alarm.exception.ReportActionAlarmExceptionType;
import com.votogether.domain.alarm.repository.ReportActionAlarmRepository;
import com.votogether.domain.member.entity.Member;
import com.votogether.global.exception.NotFoundException;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Service
public class AlarmService {

private static final int BASIC_PAGE_SIZE = 10;
private final ReportActionAlarmRepository reportActionAlarmRepository;

@Transactional(readOnly = true)
public List<ReportActionAlarmResponse> getReportActionAlarms(final Member member, final int page) {
final PageRequest pageRequest = PageRequest.of(page, BASIC_PAGE_SIZE,
Sort.by(Sort.Direction.DESC, "createdAt"));
final List<ReportActionAlarm> reportActionAlarms = reportActionAlarmRepository
.findByMember(member, pageRequest);

return reportActionAlarms.stream()
.map(ReportActionAlarmResponse::from)
.toList();
}

@Transactional(readOnly = true)
public ReportActionResponse getReportActionAlarm(final Long reportActionAlarmId, final Member member) {
final ReportActionAlarm reportActionAlarm = reportActionAlarmRepository
.findByIdAndMember(reportActionAlarmId, member)
.orElseThrow(() -> new NotFoundException(ReportActionAlarmExceptionType.NOT_FOUND));

return ReportActionResponse.from(reportActionAlarm);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package com.votogether.domain.notice.controller;

import com.votogether.domain.member.entity.Member;
import com.votogether.domain.notice.dto.request.NoticeRequest;
import com.votogether.domain.notice.service.NoticeCommandService;
import com.votogether.global.jwt.Auth;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import java.net.URI;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Validated
@RequiredArgsConstructor
@RequestMapping("/notices")
@RestController
public class NoticeCommandController implements NoticeCommandControllerDocs {

private final NoticeCommandService noticeCommandService;

@PostMapping
public ResponseEntity<Void> createNotice(
@RequestBody @Valid final NoticeRequest noticeRequest,
@Auth final Member loginMember
) {
final Long noticeId = noticeCommandService.createNotice(noticeRequest, loginMember);
return ResponseEntity.created(URI.create("/notices/" + noticeId)).build();
}

@PutMapping("/{id}")
public ResponseEntity<Void> updateNotice(
@PathVariable("id") @Positive(message = "공지사항 ID는 양수만 가능합니다.") final Long noticeId,
@RequestBody @Valid final NoticeRequest noticeRequest
) {
noticeCommandService.updateNotice(noticeId, noticeRequest);
return ResponseEntity.noContent().build();
}

@DeleteMapping("/{id}")
public ResponseEntity<Void> deleteNotice(
@PathVariable("id") @Positive(message = "공지사항 ID는 양수만 가능합니다.") final Long noticeId
) {
noticeCommandService.deleteNotice(noticeId);
return ResponseEntity.noContent().build();
}

}
Loading

0 comments on commit 77236dd

Please sign in to comment.