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 @@ -6,11 +6,14 @@
import static java.util.Comparator.comparingInt;
import static lombok.AccessLevel.PROTECTED;

import com.listywave.admin.Admin;
import com.listywave.common.BaseEntity;
import com.listywave.common.exception.CustomException;
import jakarta.persistence.Column;
import jakarta.persistence.Embedded;
import jakarta.persistence.Entity;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.OneToMany;
import java.util.ArrayList;
import java.util.List;
Expand All @@ -36,13 +39,23 @@ public class Notice extends BaseEntity {

private boolean didSendAlarm;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "create_admin_id")
private Admin createAdmin;

@ManyToOne(fetch = LAZY)
@JoinColumn(name = "update_admin_id")
private Admin lastUpdateAdmin;

@OneToMany(mappedBy = "notice", fetch = LAZY, cascade = ALL, orphanRemoval = true)
private final List<NoticeContent> contents = new ArrayList<>();

public Notice(NoticeType type, NoticeTitle title, NoticeDescription description) {
public Notice(NoticeType type, NoticeTitle title, NoticeDescription description, Admin createAdmin) {
this.type = type;
this.title = title;
this.description = description;
this.createAdmin = createAdmin;
this.lastUpdateAdmin = createAdmin;
Comment on lines +53 to +58
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

맞아요 어드민은 무조건 어떤 관리자가 수정했는지 기록이 남아야한다고 하더라고여 책임 때문에

}

public void addContents(List<NoticeContent> contents) {
Expand All @@ -58,17 +71,25 @@ public String getFirstImageUrl() {
return result.orElse(null);
}

public void update(NoticeType type, NoticeTitle title, NoticeDescription description, List<NoticeContent> contents) {
public void update(
NoticeType type,
NoticeTitle title,
NoticeDescription description,
List<NoticeContent> contents,
Admin updateAdmin
) {
this.type = type;
this.title = title;
this.description = description;
this.lastUpdateAdmin = updateAdmin;

this.contents.clear();
this.contents.addAll(contents);
}

public void changeExposure() {
public void changeExposure(Admin updateAdmin) {
this.isExposed = !this.isExposed;
this.lastUpdateAdmin = updateAdmin;
}

public void sendAlarm() {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.listywave.notice.application.service;

import com.listywave.admin.Admin;
import com.listywave.admin.AdminRepository;
import com.listywave.alarm.application.domain.AlarmCreateEvent;
import com.listywave.notice.application.domain.Notice;
import com.listywave.notice.application.domain.NoticeContent;
Expand Down Expand Up @@ -30,16 +32,19 @@ public class NoticeService {
private final UserRepository userRepository;
private final NoticeRepository noticeRepository;
private final ApplicationEventPublisher applicationEventPublisher;
private final AdminRepository adminRepository;

public Long create(NoticeCreateRequest request) {
Notice notice = request.toNotice();
public Long create(Long adminId, NoticeCreateRequest request) {
Admin admin = adminRepository.getById(adminId);
Notice notice = request.toNotice(admin);
List<NoticeContent> noticeContents = request.toNoticeContents(notice);
notice.addContents(noticeContents);
return noticeRepository.save(notice).getId();
}

@Transactional(readOnly = true)
public List<NoticeFindAllResponseToAdmin> findAllToAdmin() {
public List<NoticeFindAllResponseToAdmin> findAllToAdmin(Long adminId) {
adminRepository.getById(adminId);
List<Notice> notices = noticeRepository.findAll();
return NoticeFindAllResponseToAdmin.toList(notices);
}
Expand All @@ -58,30 +63,36 @@ public NoticeFindResponse findOneSpecific(Long id) {
return NoticeFindResponse.of(result, prevNotice, nextNotice);
}

public void update(NoticeUpdateRequest request, Long noticeId) {
public void update(Long adminId, NoticeUpdateRequest request, Long noticeId) {
Admin admin = adminRepository.getById(adminId);
Notice notice = noticeRepository.findByIdWithFetch(noticeId);
List<NoticeContent> newNoticeContents = request.toNoticeContents(notice);

notice.update(
NoticeType.codeOf(request.categoryCode()),
new NoticeTitle(request.title()),
new NoticeDescription(request.description()),
newNoticeContents
newNoticeContents,
admin
);
}

public void updateExposure(Long id) {
Notice notice = noticeRepository.findByIdWithFetch(id);
notice.changeExposure();
public void updateExposure(Long adminId, Long noticeId) {
Admin admin = adminRepository.getById(adminId);
Notice notice = noticeRepository.findByIdWithFetch(noticeId);
notice.changeExposure(admin);
}

public void delete(Long id) {
noticeRepository.deleteById(id);
public void delete(Long adminId, Long noticeID) {
adminRepository.getById(adminId);
noticeRepository.deleteById(noticeID);
}

public void sendAlarm(Long id) {
public void sendAlarm(Long adminId, Long noticeId) {
adminRepository.getById(adminId);

User officialUser = userRepository.findByNicknameValue(OFFICIAL_USER_NICKNAME);
Notice notice = noticeRepository.getById(id);
Notice notice = noticeRepository.getById(noticeId);
notice.sendAlarm();

AlarmCreateEvent event = AlarmCreateEvent.notice(officialUser, notice);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.listywave.notice.application.service.dto;

import com.listywave.admin.Admin;
import com.listywave.notice.application.domain.ContentType;
import com.listywave.notice.application.domain.Notice;
import com.listywave.notice.application.domain.NoticeContent;
Expand All @@ -26,8 +27,8 @@ public record ContentDto(
) {
}

public Notice toNotice() {
return new Notice(NoticeType.codeOf(categoryCode), new NoticeTitle(title), new NoticeDescription(description));
public Notice toNotice(Admin admin) {
return new Notice(NoticeType.codeOf(categoryCode), new NoticeTitle(title), new NoticeDescription(description), admin);
}

public List<NoticeContent> toNoticeContents(Notice notice) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.listywave.notice.presentation;

import com.listywave.common.auth.Auth;
import com.listywave.notice.application.domain.NoticeType;
import com.listywave.notice.application.service.NoticeService;
import com.listywave.notice.application.service.dto.NoticeCreateRequest;
Expand Down Expand Up @@ -29,21 +30,21 @@ public class NoticeController {
private final NoticeService noticeService;

@GetMapping("/admin/notices/categories")
ResponseEntity<List<NoticeCategoryFindResponse>> findNoticeCategories() {
ResponseEntity<List<NoticeCategoryFindResponse>> findNoticeCategories(@Auth Long adminId) {
List<NoticeCategoryFindResponse> result = NoticeCategoryFindResponse.toList(NoticeType.values());
return ResponseEntity.ok(result);
}

@PostMapping("/admin/notices")
ResponseEntity<NoticeCreateResponse> create(@RequestBody NoticeCreateRequest request) {
Long id = noticeService.create(request);
ResponseEntity<NoticeCreateResponse> create(@Auth Long adminId, @RequestBody NoticeCreateRequest request) {
Long id = noticeService.create(adminId, request);
NoticeCreateResponse response = new NoticeCreateResponse(id);
return ResponseEntity.created(URI.create("/admin/notices/" + id)).body(response);
}

@GetMapping("/admin/notices")
ResponseEntity<List<NoticeFindAllResponseToAdmin>> findAllToAdmin() {
List<NoticeFindAllResponseToAdmin> result = noticeService.findAllToAdmin();
ResponseEntity<List<NoticeFindAllResponseToAdmin>> findAllToAdmin(@Auth Long adminId) {
List<NoticeFindAllResponseToAdmin> result = noticeService.findAllToAdmin(adminId);
return ResponseEntity.ok(result);
}

Expand All @@ -60,26 +61,26 @@ ResponseEntity<NoticeFindResponse> findOneSpecific(@PathVariable Long noticeId)
}

@PutMapping("/admin/notices/{noticeId}")
ResponseEntity<Void> update(@RequestBody NoticeUpdateRequest request, @PathVariable Long noticeId) {
noticeService.update(request, noticeId);
ResponseEntity<Void> update(@Auth Long adminId, @RequestBody NoticeUpdateRequest request, @PathVariable Long noticeId) {
noticeService.update(adminId, request, noticeId);
return ResponseEntity.noContent().build();
}

@PatchMapping("/admin/notices/{noticeId}")
ResponseEntity<Void> updateExposure(@PathVariable Long noticeId) {
noticeService.updateExposure(noticeId);
ResponseEntity<Void> updateExposure(@Auth Long adminId, @PathVariable Long noticeId) {
noticeService.updateExposure(adminId, noticeId);
return ResponseEntity.noContent().build();
}

@DeleteMapping("/admin/notices/{noticeId}")
ResponseEntity<Void> delete(@PathVariable Long noticeId) {
noticeService.delete(noticeId);
ResponseEntity<Void> delete(@Auth Long adminId, @PathVariable Long noticeId) {
noticeService.delete(adminId, noticeId);
return ResponseEntity.noContent().build();
}

@PostMapping("/admin/notices/{noticeId}/alarm")
ResponseEntity<Void> sendAlarm(@PathVariable Long noticeId) {
noticeService.sendAlarm(noticeId);
ResponseEntity<Void> sendAlarm(@Auth Long adminId, @PathVariable Long noticeId) {
noticeService.sendAlarm(adminId, noticeId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.listywave.topic.application.service;

import com.listywave.admin.AdminRepository;
import com.listywave.list.application.domain.category.CategoryType;
import com.listywave.topic.application.domain.Topic;
import com.listywave.topic.application.service.dto.ExposedTopicFindResponse;
Expand All @@ -23,6 +24,7 @@ public class TopicService {

private final UserRepository userRepository;
private final TopicRepository topicRepository;
private final AdminRepository adminRepository;

public void create(TopicCreateRequest request, Long userId) {
User user = userRepository.getById(userId);
Expand All @@ -37,7 +39,8 @@ public ExposedTopicFindResponse findAllExposed(@Nullable Long cursorId, int size
}

@Transactional(readOnly = true)
public TopicFindResponse findAll(@Nullable Long cursorId, int size) {
public TopicFindResponse findAll(Long adminId, @Nullable Long cursorId, int size) {
adminRepository.getById(adminId);
List<Topic> result = topicRepository.findAll(cursorId, size);
long totalCount = (topicRepository.count() / size) + 1;
return TopicFindResponse.from(result, size, totalCount);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,15 +49,16 @@ ResponseEntity<List<RecommendTopicFindResponse>> recommendTopics(

@GetMapping("/admin/topics")
ResponseEntity<TopicFindResponse> findAll(
@Auth Long adminId,
@RequestParam(required = false) Long cursorId,
@RequestParam(defaultValue = "5") int size
) {
TopicFindResponse result = topicService.findAll(cursorId, size);
TopicFindResponse result = topicService.findAll(adminId, cursorId, size);
return ResponseEntity.ok(result);
}

@PutMapping("/admin/topics/{topicId}")
ResponseEntity<Void> update(@PathVariable Long topicId, @RequestBody TopicUpdateRequest request) {
ResponseEntity<Void> update(@Auth Long adminId, @PathVariable Long topicId, @RequestBody TopicUpdateRequest request) {
topicService.update(topicId, request.isExposed(), request.categoryCode(), request.title());
return ResponseEntity.noContent().build();
}
Expand Down
24 changes: 13 additions & 11 deletions src/test/java/com/listywave/alarm/AlarmServiceTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertThrows;

import com.listywave.admin.Admin;
import com.listywave.alarm.application.domain.AlarmCreateEvent;
import com.listywave.alarm.application.dto.AlarmCheckResponse;
import com.listywave.alarm.application.dto.AlarmFindResponse;
Expand All @@ -24,7 +25,7 @@
import com.listywave.notice.application.domain.Notice;
import com.listywave.notice.application.service.dto.NoticeCreateRequest;
import java.util.List;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;

Expand Down Expand Up @@ -268,11 +269,18 @@ class 팔로우 {
@Nested
class 공지 {

private Admin admin;

@BeforeEach
void setUp() {
this.admin = adminRepository.save(new Admin(null, "1.2.3.4", "account", "1234"));
}

@Test
void 공지_알람을_발송한다() {
// given
NoticeCreateRequest noticeCreateRequest = createNoticeCreateRequest();
Long noticeId = noticeService.create(noticeCreateRequest);
Long noticeId = noticeService.create(admin.getId(), noticeCreateRequest);
Notice notice = noticeRepository.getById(noticeId);

// when
Expand Down Expand Up @@ -301,11 +309,11 @@ class 공지 {
void 공지는_1개당_최대_1회만_알람을_보낼_수_있다() {
// given
NoticeCreateRequest noticeCreateRequest = createNoticeCreateRequest();
Long noticeId = noticeService.create(noticeCreateRequest);
noticeService.sendAlarm(noticeId);
Long noticeId = noticeService.create(admin.getId(), noticeCreateRequest);
noticeService.sendAlarm(admin.getId(), noticeId);

// when
ErrorCode result = assertThrows(CustomException.class, () -> noticeService.sendAlarm(noticeId))
ErrorCode result = assertThrows(CustomException.class, () -> noticeService.sendAlarm(admin.getId(), noticeId))
.getErrorCode();

// then
Expand Down Expand Up @@ -444,12 +452,6 @@ class 알람_읽기 {
@Nested
class 알람_삭제 {

@Test
@Disabled
void _30일이_지난_알람은_자동_삭제된다() {
// TODO: 테스트 작성
}

@Test
void 댓글이_삭제될_경우_관련_알람도_모두_삭제된다() {
// when
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/com/listywave/common/IntegrationTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,7 @@ public abstract class IntegrationTest {
protected ListEntity list;

@BeforeEach
void setUp() {
protected void setUp() {
alarmRepository.deleteAllInBatch();
noticeRepository.deleteAll();
adminRepository.deleteAllInBatch();
Expand Down
Loading
Loading