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 @@ -17,6 +17,9 @@
import com.dodo.backend.common.exception.ErrorResponse;
import com.dodo.backend.notification.dto.request.NotificationRequest.NotificationScheduleCreateRequest;
import com.dodo.backend.notification.dto.response.NotificationResponse.NotificationScheduleCreateResponse;
import com.dodo.backend.notification.dto.response.NotificationResponse.NotificationScheduleListResponse;
import com.dodo.backend.notification.dto.response.NotificationResponse.NotificationSimpleResponse;
import com.dodo.backend.notification.entity.NotificationScheduleStatus;
import com.dodo.backend.notification.service.NotificationScheduleService;
import com.dodo.backend.report.entity.ReportStatus;
import com.dodo.backend.user.entity.UserStatus;
Expand Down Expand Up @@ -460,6 +463,13 @@ public ResponseEntity<AdminSimpleResponse> createAnnouncement(
.body(adminService.createAnnouncement(adminId, request));
}

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ λ“±λ‘ν•©λ‹ˆλ‹€.
*
* @param request μ•Œλ¦Ό μŠ€μΌ€μ€„ 등둝 μš”μ²­
* @param userDetails 인증 κ΄€λ¦¬μž 정보
* @return μ•Œλ¦Ό μŠ€μΌ€μ€„ 등둝 κ²°κ³Ό
*/
@Operation(summary = "μ•Œλ¦Ό μŠ€μΌ€μ€„ 등둝", description = "κ΄€λ¦¬μžκ°€ μ§€μ • μ‹œκ°„μ— λ°œμ†‘λ  μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ λ“±λ‘ν•©λ‹ˆλ‹€.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ 등둝 성곡",
Expand Down Expand Up @@ -491,6 +501,55 @@ public ResponseEntity<NotificationScheduleCreateResponse> createNotificationSche
return ResponseEntity.ok(notificationScheduleService.createSchedule(adminId, request));
}

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€.
*
* @param page μ‘°νšŒν•  νŽ˜μ΄μ§€ 번호
* @param size νŽ˜μ΄μ§€λ‹Ή μ•Œλ¦Ό μŠ€μΌ€μ€„ 수
* @param status μ•Œλ¦Ό μŠ€μΌ€μ€„ μƒνƒœ ν•„ν„°
* @param userDetails 인증 κ΄€λ¦¬μž 정보
* @return μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회 κ²°κ³Ό
*/
@Operation(summary = "μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회", description = "κ΄€λ¦¬μžκ°€ λ“±λ‘λœ μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회 성곡",
content = @Content(schema = @Schema(implementation = NotificationScheduleListResponse.class)))
})
@GetMapping("/notification-schedules")
public ResponseEntity<NotificationScheduleListResponse> getNotificationSchedules(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
@RequestParam(required = false) NotificationScheduleStatus status,
@AuthenticationPrincipal UserDetails userDetails
) {
UUID adminId = UUID.fromString(userDetails.getUsername());
log.info("κ΄€λ¦¬μž μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회 μš”μ²­ - AdminId: {}, Page: {}, Size: {}, Status: {}",
adminId, page, size, status);
return ResponseEntity.ok(notificationScheduleService.getSchedules(adminId, page, size, status));
}

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ μ·¨μ†Œν•©λ‹ˆλ‹€.
*
* @param scheduleId μ·¨μ†Œν•  μ•Œλ¦Ό μŠ€μΌ€μ€„ ID
* @param userDetails 인증 κ΄€λ¦¬μž 정보
* @return μ•Œλ¦Ό μŠ€μΌ€μ€„ μ·¨μ†Œ 성곡 λ©”μ‹œμ§€
*/
@Operation(summary = "μ•Œλ¦Ό μŠ€μΌ€μ€„ μ·¨μ†Œ", description = "κ΄€λ¦¬μžκ°€ λ“±λ‘λœ μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ μ·¨μ†Œν•©λ‹ˆλ‹€.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ μ·¨μ†Œ 성곡",
content = @Content(schema = @Schema(implementation = NotificationSimpleResponse.class)))
})
@DeleteMapping("/notification-schedules/{scheduleId}")
public ResponseEntity<NotificationSimpleResponse> cancelNotificationSchedule(
@PathVariable Long scheduleId,
@AuthenticationPrincipal UserDetails userDetails
) {
UUID adminId = UUID.fromString(userDetails.getUsername());
log.info("κ΄€λ¦¬μž μ•Œλ¦Ό μŠ€μΌ€μ€„ μ·¨μ†Œ μš”μ²­ - AdminId: {}, ScheduleId: {}", adminId, scheduleId);
return ResponseEntity.ok(notificationScheduleService.cancelSchedule(adminId, scheduleId));
}

/**
* 곡지λ₯Ό μ‚­μ œν•©λ‹ˆλ‹€.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import com.dodo.backend.comment.exception.CommentException;
import com.dodo.backend.comment.mapper.CommentMapper;
import com.dodo.backend.comment.repository.CommentRepository;
import com.dodo.backend.notification.service.NotificationService;
import com.dodo.backend.user.entity.User;
import com.dodo.backend.user.service.UserService;
import lombok.RequiredArgsConstructor;
Expand Down Expand Up @@ -45,6 +46,7 @@ public class CommentServiceImpl implements CommentService {
private final CommentMapper commentMapper;
private final BoardService boardService;
private final UserService userService;
private final NotificationService notificationService;

/**
* λŒ“κΈ€μ„ μž‘μ„±ν•©λ‹ˆλ‹€.
Expand Down Expand Up @@ -72,6 +74,7 @@ public CommentCreateResponse createComment(UUID userId, CommentCreateRequest req

Comment comment = request.toEntity(board, user, parentComment);
Comment savedComment = commentRepository.save(comment);
notificationService.notifyCommentCreated(savedComment);

return CommentCreateResponse.toDto(savedComment, "λŒ“κΈ€μ΄ μ„±κ³΅μ μœΌλ‘œ μž‘μ„±λ˜μ—ˆμŠ΅λ‹ˆλ‹€.");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public class NotificationController {
})
@GetMapping
public ResponseEntity<NotificationListResponse> getNotifications(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
@RequestParam(required = false) Boolean isRead,
@RequestParam(required = false) String type,
Expand Down Expand Up @@ -131,12 +131,12 @@ public ResponseEntity<NotificationSimpleResponse> updateReadStatus(
*
* @param notificationId μ‚­μ œν•  μ•Œλ¦Ό ID
* @param userDetails 인증 μ‚¬μš©μž 정보
* @return μ•Œλ¦Ό μ‚­μ œ 성곡 λ©”μ‹œμ§€
* @return 응닡 본문이 μ—†λŠ” 204 응닡
*/
@Operation(summary = "μ•Œλ¦Ό μ‚­μ œ", description = "νŠΉμ • μ•Œλ¦Όμ„ μ‚­μ œν•©λ‹ˆλ‹€.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "μ•Œλ¦Όμ΄ μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
content = @Content(schema = @Schema(implementation = NotificationSimpleResponse.class))),
@ApiResponse(responseCode = "204", description = "μ•Œλ¦Όμ΄ μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
content = @Content),
@ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­μž…λ‹ˆλ‹€.",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class),
Expand All @@ -159,14 +159,14 @@ public ResponseEntity<NotificationSimpleResponse> updateReadStatus(
examples = @ExampleObject(name = "μ„œλ²„ λ‚΄λΆ€ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.", value = "{\"status\": 500, \"message\": \"μ„œλ²„ λ‚΄λΆ€ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.\"}")))
})
@DeleteMapping("/{notificationId}")
public ResponseEntity<NotificationSimpleResponse> deleteNotification(
public ResponseEntity<Void> deleteNotification(
@PathVariable Long notificationId,
@AuthenticationPrincipal UserDetails userDetails
) {
UUID userId = UUID.fromString(userDetails.getUsername());
log.info("μ•Œλ¦Ό μ‚­μ œ μš”μ²­ - UserId: {}, NotificationId: {}", userId, notificationId);
notificationService.deleteNotification(userId, notificationId);
return ResponseEntity.ok(NotificationSimpleResponse.toDto("μ•Œλ¦Όμ΄ μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€."));
return ResponseEntity.noContent().build();
}

/**
Expand Down Expand Up @@ -237,12 +237,12 @@ public ResponseEntity<NotificationSimpleResponse> readAll(
* λͺ¨λ“  μ•Œλ¦Όμ„ μ‚­μ œν•©λ‹ˆλ‹€.
*
* @param userDetails 인증 μ‚¬μš©μž 정보
* @return 전체 μ•Œλ¦Ό μ‚­μ œ 성곡 λ©”μ‹œμ§€
* @return 응닡 본문이 μ—†λŠ” 204 응닡
*/
@Operation(summary = "λͺ¨λ“  μ•Œλ¦Ό μ‚­μ œ", description = "둜그인 μ‚¬μš©μžμ˜ λͺ¨λ“  μ•Œλ¦Όμ„ μ‚­μ œν•©λ‹ˆλ‹€.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "λͺ¨λ“  μ•Œλ¦Όμ΄ μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
content = @Content(schema = @Schema(implementation = NotificationSimpleResponse.class))),
@ApiResponse(responseCode = "204", description = "λͺ¨λ“  μ•Œλ¦Όμ΄ μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€.",
content = @Content),
@ApiResponse(responseCode = "400", description = "잘λͺ»λœ μš”μ²­μž…λ‹ˆλ‹€.",
content = @Content(mediaType = "application/json",
schema = @Schema(implementation = ErrorResponse.class),
Expand All @@ -257,12 +257,12 @@ public ResponseEntity<NotificationSimpleResponse> readAll(
examples = @ExampleObject(name = "μ„œλ²„ λ‚΄λΆ€ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.", value = "{\"status\": 500, \"message\": \"μ„œλ²„ λ‚΄λΆ€ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.\"}")))
})
@DeleteMapping("/all")
public ResponseEntity<NotificationSimpleResponse> deleteAll(
public ResponseEntity<Void> deleteAll(
@AuthenticationPrincipal UserDetails userDetails
) {
UUID userId = UUID.fromString(userDetails.getUsername());
log.info("λͺ¨λ“  μ•Œλ¦Ό μ‚­μ œ μš”μ²­ - UserId: {}", userId);
notificationService.deleteAll(userId);
return ResponseEntity.ok(NotificationSimpleResponse.toDto("λͺ¨λ“  μ•Œλ¦Όμ΄ μ„±κ³΅μ μœΌλ‘œ μ‚­μ œλ˜μ—ˆμŠ΅λ‹ˆλ‹€."));
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.dodo.backend.notification.entity.Notification;
import com.dodo.backend.notification.entity.NotificationSchedule;
import com.dodo.backend.notification.entity.NotificationScheduleRepeatType;
import com.dodo.backend.notification.entity.NotificationScheduleStatus;
import com.dodo.backend.notification.entity.NotificationScheduleTargetType;
import com.dodo.backend.notification.entity.NotificationType;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
Expand All @@ -11,7 +13,9 @@
import org.springframework.data.domain.Page;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;

/**
* μ•Œλ¦Ό APIμ—μ„œ μ‚¬μš©ν•˜λŠ” 응닡 DTOλ₯Ό λͺ¨μ•„ λ‘” ν΄λž˜μŠ€μž…λ‹ˆλ‹€.
Expand Down Expand Up @@ -80,7 +84,7 @@ public static class NotificationItemResponse {
private String notificationBody;
@Schema(description = "μ•Œλ¦Ό μœ ν˜•", example = "SYSTEM")
private NotificationType notificationType;
@Schema(description = "μ•Œλ¦Όκ³Ό μ—°κ²°λœ λ¦¬μ†ŒμŠ€ ID. μ—°κ²° λŒ€μƒμ΄ μ—†μœΌλ©΄ nullμž…λ‹ˆλ‹€.", example = "31", nullable = true)
@Schema(description = "μ•Œλ¦Όκ³Ό μ—°κ²°λœ λ¦¬μ†ŒμŠ€ ID. COMMENT/κ²Œμ‹œκΈ€ REACTION은 boardId, ν™œλ™κΈ°λ‘ REACTION은 historyIdμž…λ‹ˆλ‹€.", example = "31", nullable = true)
private Long relatedId;
@Schema(description = "μ•Œλ¦Ό 읽음 μ—¬λΆ€", example = "false")
private Boolean isRead;
Expand Down Expand Up @@ -132,6 +136,9 @@ public static UnreadNotificationCountResponse toDto(long unreadCount) {
}
}

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„ 등둝 응닡 DTOμž…λ‹ˆλ‹€.
*/
@Getter
@Builder
@AllArgsConstructor
Expand All @@ -155,4 +162,77 @@ public static NotificationScheduleCreateResponse toDto(NotificationSchedule sche
.build();
}
}

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ μ•„μ΄ν…œ 응닡 DTOμž…λ‹ˆλ‹€.
*/
@Getter
@Builder
@AllArgsConstructor
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ μ•„μ΄ν…œ")
public static class NotificationScheduleItemResponse {
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ ID", example = "10")
private Long scheduleId;
@Schema(description = "μ•Œλ¦Ό 제λͺ©", example = "곡지 μ•Œλ¦Ό")
private String notificationTitle;
@Schema(description = "μ•Œλ¦Ό λ³Έλ¬Έ", example = "μƒˆλ‘œμš΄ 곡지가 λ“±λ‘λ˜μ—ˆμŠ΅λ‹ˆλ‹€.")
private String notificationBody;
@Schema(description = "μ•Œλ¦Ό μœ ν˜•", example = "SYSTEM")
private NotificationType notificationType;
@Schema(description = "λ°œμ†‘ λŒ€μƒ μœ ν˜•", example = "ALL")
private NotificationScheduleTargetType targetType;
@Schema(description = "targetType이 USERS일 λ•Œ λ°œμ†‘ λŒ€μƒ μ‚¬μš©μž ID λͺ©λ‘")
private List<UUID> targetUserIds;
@Schema(description = "반볡 μœ ν˜•", example = "NONE")
private NotificationScheduleRepeatType repeatType;
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ 처리 μƒνƒœ", example = "PENDING")
private NotificationScheduleStatus scheduleStatus;
@Schema(description = "μ•Œλ¦Ό λ°œμ†‘ μ˜ˆμ • μΌμ‹œ", example = "2026-09-20T09:00:00")
private LocalDateTime scheduledAt;
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ 생성 μΌμ‹œ", example = "2026-09-14T15:30:00")
private LocalDateTime createdAt;
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ λ§ˆμ§€λ§‰ μ‹€ν–‰ μΌμ‹œ", example = "2026-09-20T09:00:00", nullable = true)
private LocalDateTime executedAt;

public static NotificationScheduleItemResponse toDto(NotificationSchedule schedule) {
return NotificationScheduleItemResponse.builder()
.scheduleId(schedule.getNotificationScheduleId())
.notificationTitle(schedule.getNotificationTitle())
.notificationBody(schedule.getNotificationBody())
.notificationType(schedule.getNotificationType())
.targetType(schedule.getTargetType())
.targetUserIds(parseTargetUserIds(schedule.getTargetUserIds()))
.repeatType(schedule.getRepeatType())
.scheduleStatus(schedule.getScheduleStatus())
.scheduledAt(schedule.getScheduledAt())
.createdAt(schedule.getCreatedAt())
.executedAt(schedule.getExecutedAt())
.build();
}

private static List<UUID> parseTargetUserIds(String targetUserIds) {
if (targetUserIds == null || targetUserIds.isBlank()) {
return List.of();
}
return Arrays.stream(targetUserIds.split(","))
.map(String::trim)
.filter(value -> !value.isBlank())
.map(UUID::fromString)
.toList();
}
}

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회 응닡 DTOμž…λ‹ˆλ‹€.
*/
@Getter
@Builder
@AllArgsConstructor
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회 응닡")
public static class NotificationScheduleListResponse {
@Schema(description = "μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘μ˜ νŽ˜μ΄μ§€ 정보")
private PageInfoResponse pageInfo;
@Schema(description = "쑰회된 μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘")
private List<NotificationScheduleItemResponse> data;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -100,6 +100,11 @@ public void reschedule(LocalDateTime nextScheduledAt, LocalDateTime executedAt)
clearProcessing();
}

public void cancel() {
this.scheduleStatus = NotificationScheduleStatus.CANCELED;
clearProcessing();
}

private void clearProcessing() {
this.processingToken = null;
this.processingStartedAt = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,11 @@ public enum NotificationErrorCode implements BaseErrorCode {
*/
NOTIFICATION_NOT_FOUND(HttpStatus.NOT_FOUND, "ν•΄λ‹Ή ID의 μ•Œλ¦Όμ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ 찾을 수 μ—†λŠ” 경우 μ‚¬μš©ν•©λ‹ˆλ‹€.
*/
NOTIFICATION_SCHEDULE_NOT_FOUND(HttpStatus.NOT_FOUND, "ν•΄λ‹Ή ID의 μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ 찾을 수 μ—†μŠ΅λ‹ˆλ‹€."),

/**
* μ•Œλ¦Ό μˆ˜μ • κΆŒν•œμ΄ μ—†λŠ” 경우 μ‚¬μš©ν•©λ‹ˆλ‹€.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.dodo.backend.notification.entity.NotificationSchedule;
import com.dodo.backend.notification.entity.NotificationScheduleStatus;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
Expand All @@ -16,6 +17,8 @@
@Repository
public interface NotificationScheduleRepository extends JpaRepository<NotificationSchedule, Long> {

Page<NotificationSchedule> findAllByScheduleStatus(NotificationScheduleStatus scheduleStatus, Pageable pageable);

@Query("""
select ns.notificationScheduleId
from NotificationSchedule ns
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,43 @@

import com.dodo.backend.notification.dto.request.NotificationRequest.NotificationScheduleCreateRequest;
import com.dodo.backend.notification.dto.response.NotificationResponse.NotificationScheduleCreateResponse;
import com.dodo.backend.notification.dto.response.NotificationResponse.NotificationScheduleListResponse;
import com.dodo.backend.notification.dto.response.NotificationResponse.NotificationSimpleResponse;
import com.dodo.backend.notification.entity.NotificationScheduleStatus;

import java.util.UUID;

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μ •μ˜ν•˜λŠ” μ„œλΉ„μŠ€ μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.
*/
public interface NotificationScheduleService {

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ μƒμ„±ν•©λ‹ˆλ‹€.
*
* @param adminId μš”μ²­ κ΄€λ¦¬μž ID
* @param request μ•Œλ¦Ό μŠ€μΌ€μ€„ 생성 μš”μ²­
* @return μ•Œλ¦Ό μŠ€μΌ€μ€„ 생성 κ²°κ³Ό
*/
NotificationScheduleCreateResponse createSchedule(UUID adminId, NotificationScheduleCreateRequest request);

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘μ„ μ‘°νšŒν•©λ‹ˆλ‹€.
*
* @param adminId μš”μ²­ κ΄€λ¦¬μž ID
* @param page μ‘°νšŒν•  νŽ˜μ΄μ§€ 번호
* @param size νŽ˜μ΄μ§€λ‹Ή μ•Œλ¦Ό μŠ€μΌ€μ€„ 수
* @param status μ•Œλ¦Ό μŠ€μΌ€μ€„ μƒνƒœ ν•„ν„°
* @return μ•Œλ¦Ό μŠ€μΌ€μ€„ λͺ©λ‘ 쑰회 κ²°κ³Ό
*/
NotificationScheduleListResponse getSchedules(UUID adminId, int page, int size, NotificationScheduleStatus status);

/**
* μ•Œλ¦Ό μŠ€μΌ€μ€„μ„ μ·¨μ†Œν•©λ‹ˆλ‹€.
*
* @param adminId μš”μ²­ κ΄€λ¦¬μž ID
* @param scheduleId μ·¨μ†Œν•  μ•Œλ¦Ό μŠ€μΌ€μ€„ ID
* @return μ•Œλ¦Ό μŠ€μΌ€μ€„ μ·¨μ†Œ 성곡 λ©”μ‹œμ§€
*/
NotificationSimpleResponse cancelSchedule(UUID adminId, Long scheduleId);
}
Loading
Loading