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
@@ -0,0 +1,35 @@
package com.devkor.ifive.nadab.domain.admin.api;

import com.devkor.ifive.nadab.domain.admin.api.dto.response.AdminAskChatWalletLogResponse;
import com.devkor.ifive.nadab.domain.admin.api.dto.response.AdminLogPageResponse;
import com.devkor.ifive.nadab.domain.admin.application.AdminAskChatWalletLogQueryService;
import com.devkor.ifive.nadab.domain.admin.application.AdminLogSearchCondition;
import com.devkor.ifive.nadab.global.core.response.ApiResponseDto;
import com.devkor.ifive.nadab.global.core.response.ApiResponseEntity;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Hidden
@RestController
@RequestMapping("/admin/api/logs/ask-chat-wallet")
@RequiredArgsConstructor
public class AdminAskChatWalletLogController {

private final AdminAskChatWalletLogQueryService adminAskChatWalletLogQueryService;

@GetMapping
public ResponseEntity<ApiResponseDto<AdminLogPageResponse<AdminAskChatWalletLogResponse>>> getLogs(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
@RequestParam(required = false) String nickname,
@RequestParam(required = false) String email
) {
AdminLogSearchCondition condition = AdminLogSearchCondition.of(page, size, nickname, email);
return ApiResponseEntity.ok(adminAskChatWalletLogQueryService.getLogs(condition));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.devkor.ifive.nadab.domain.admin.api;

import com.devkor.ifive.nadab.domain.admin.api.dto.response.AdminCrystalLogResponse;
import com.devkor.ifive.nadab.domain.admin.api.dto.response.AdminLogPageResponse;
import com.devkor.ifive.nadab.domain.admin.application.AdminCrystalLogQueryService;
import com.devkor.ifive.nadab.domain.admin.application.AdminLogSearchCondition;
import com.devkor.ifive.nadab.global.core.response.ApiResponseDto;
import com.devkor.ifive.nadab.global.core.response.ApiResponseEntity;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Hidden
@RestController
@RequestMapping("/admin/api/logs/crystal")
@RequiredArgsConstructor
public class AdminCrystalLogController {

private final AdminCrystalLogQueryService adminCrystalLogQueryService;

@GetMapping
public ResponseEntity<ApiResponseDto<AdminLogPageResponse<AdminCrystalLogResponse>>> getLogs(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
@RequestParam(required = false) String nickname,
@RequestParam(required = false) String email
) {
AdminLogSearchCondition condition = AdminLogSearchCondition.of(page, size, nickname, email);
return ApiResponseEntity.ok(adminCrystalLogQueryService.getLogs(condition));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,9 @@ public String adminVersionHistoryPage() {
public String adminAskChatRagPage() {
return "admin/ask-chat-rag";
}

@GetMapping("/admin/tabs/logs")
public String adminLogsPage() {
return "admin/logs";
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.devkor.ifive.nadab.domain.admin.api;

import com.devkor.ifive.nadab.domain.admin.api.dto.response.AdminLogPageResponse;
import com.devkor.ifive.nadab.domain.admin.api.dto.response.AdminReportGenerationLogResponse;
import com.devkor.ifive.nadab.domain.admin.application.AdminLogSearchCondition;
import com.devkor.ifive.nadab.domain.admin.application.AdminReportGenerationLogQueryService;
import com.devkor.ifive.nadab.global.core.response.ApiResponseDto;
import com.devkor.ifive.nadab.global.core.response.ApiResponseEntity;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Hidden
@RestController
@RequestMapping("/admin/api/logs/report-generation")
@RequiredArgsConstructor
public class AdminReportGenerationLogController {

private final AdminReportGenerationLogQueryService adminReportGenerationLogQueryService;

@GetMapping
public ResponseEntity<ApiResponseDto<AdminLogPageResponse<AdminReportGenerationLogResponse>>> getLogs(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "20") int size,
@RequestParam(required = false) String nickname,
@RequestParam(required = false) String email
) {
AdminLogSearchCondition condition = AdminLogSearchCondition.of(page, size, nickname, email);
return ApiResponseEntity.ok(adminReportGenerationLogQueryService.getLogs(condition));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
package com.devkor.ifive.nadab.domain.admin.api.dto.response;

import com.devkor.ifive.nadab.domain.askchat.core.entity.AskChatWalletLog;
import com.devkor.ifive.nadab.domain.askchat.core.entity.AskChatWalletLogReason;
import com.devkor.ifive.nadab.domain.askchat.core.entity.AskChatWalletLogStatus;
import io.swagger.v3.oas.annotations.media.Schema;

import java.time.OffsetDateTime;

@Schema(description = "관리자 Ask Chat 대화권 로그")
public record AdminAskChatWalletLogResponse(
@Schema(description = "로그 ID", example = "1001")
Long id,

@Schema(description = "로그 사용자")
AdminLogUserResponse user,

@Schema(description = "Ask Chat 세션 ID", example = "3001")
Long sessionId,

@Schema(description = "Ask Chat 메시지 ID", example = "4001")
Long messageId,

@Schema(description = "무료 대화권 변동량", example = "-1")
int freeTurnDelta,

@Schema(description = "유료 대화권 변동량", example = "0")
int paidTurnDelta,

@Schema(description = "변동 후 무료 대화권 잔액", example = "2")
int freeTurnBalanceAfter,

@Schema(description = "변동 후 유료 대화권 잔액", example = "10")
int paidTurnBalanceAfter,

@Schema(description = "변동 사유", example = "ANSWER_SUCCESS_CONSUME")
AskChatWalletLogReason reason,

@Schema(description = "로그 상태", example = "CONFIRMED")
AskChatWalletLogStatus status,

@Schema(description = "참조 유형", example = "ASK_CHAT_MESSAGE")
String refType,

@Schema(description = "참조 ID", example = "4001")
Long refId,

@Schema(description = "멱등성 키", example = "ask-chat-message-4001")
String idempotencyKey,

@Schema(description = "로그 생성 시각")
OffsetDateTime createdAt
) {

public static AdminAskChatWalletLogResponse from(AskChatWalletLog log) {
return new AdminAskChatWalletLogResponse(
log.getId(),
AdminLogUserResponse.from(log.getUser()),
log.getSession() == null ? null : log.getSession().getId(),
log.getMessage() == null ? null : log.getMessage().getId(),
log.getFreeTurnDelta(),
log.getPaidTurnDelta(),
log.getFreeTurnBalanceAfter(),
log.getPaidTurnBalanceAfter(),
log.getReason(),
log.getStatus(),
log.getRefType(),
log.getRefId(),
log.getIdempotencyKey(),
log.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.devkor.ifive.nadab.domain.admin.api.dto.response;

import com.devkor.ifive.nadab.domain.wallet.core.entity.CrystalLog;
import com.devkor.ifive.nadab.domain.wallet.core.entity.CrystalLogReason;
import com.devkor.ifive.nadab.domain.wallet.core.entity.CrystalLogStatus;
import io.swagger.v3.oas.annotations.media.Schema;

import java.time.OffsetDateTime;

@Schema(description = "관리자 크리스탈 로그")
public record AdminCrystalLogResponse(
@Schema(description = "로그 ID", example = "1001")
Long id,

@Schema(description = "로그 사용자")
AdminLogUserResponse user,

@Schema(description = "크리스탈 변동량", example = "-100")
long delta,

@Schema(description = "변동 후 크리스탈 잔액", example = "900")
long balanceAfter,

@Schema(description = "변동 사유", example = "REPORT_GENERATE_MONTHLY")
CrystalLogReason reason,

@Schema(description = "로그 상태", example = "CONFIRMED")
CrystalLogStatus status,

@Schema(description = "참조 유형", example = "MONTHLY_REPORT")
String refType,

@Schema(description = "참조 ID", example = "2001")
Long refId,

@Schema(description = "로그 생성 시각")
OffsetDateTime createdAt
) {

public static AdminCrystalLogResponse from(CrystalLog log) {
return new AdminCrystalLogResponse(
log.getId(),
AdminLogUserResponse.from(log.getUser()),
log.getDelta(),
log.getBalanceAfter(),
log.getReason(),
log.getStatus(),
log.getRefType(),
log.getRefId(),
log.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.devkor.ifive.nadab.domain.admin.api.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.data.domain.Page;

import java.util.List;

@Schema(description = "관리자 로그 페이지 응답")
public record AdminLogPageResponse<T>(
@Schema(description = "현재 페이지의 로그 목록")
List<T> items,

@Schema(description = "전체 로그 개수", example = "43")
long totalCount,

@Schema(description = "현재 페이지 번호(1부터 시작)", example = "1")
int currentPage,

@Schema(description = "요청한 페이지 크기", example = "20")
int pageSize,

@Schema(description = "전체 페이지 수", example = "3")
int totalPages,

@Schema(description = "이전 페이지 존재 여부", example = "false")
boolean hasPrevious,

@Schema(description = "다음 페이지 존재 여부", example = "true")
boolean hasNext
) {

public static <T> AdminLogPageResponse<T> from(Page<T> page) {
int currentPage = page.getNumber() + 1;
int totalPages = page.getTotalPages();

return new AdminLogPageResponse<>(
page.getContent(),
page.getTotalElements(),
currentPage,
page.getSize(),
totalPages,
currentPage > 1 && totalPages > 0,
totalPages > 0 && currentPage < totalPages
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.devkor.ifive.nadab.domain.admin.api.dto.response;

import com.devkor.ifive.nadab.domain.user.core.entity.User;
import io.swagger.v3.oas.annotations.media.Schema;

@Schema(description = "관리자 로그 사용자 정보")
public record AdminLogUserResponse(
@Schema(description = "사용자 ID", example = "101")
Long id,

@Schema(description = "닉네임", example = "nadab_user")
String nickname,

@Schema(description = "이메일", example = "user@example.com")
String email
) {

public static AdminLogUserResponse from(User user) {
if (user == null) {
return null;
}

return new AdminLogUserResponse(
user.getId(),
user.getNickname(),
user.getEmail()
);
}
}
Loading
Loading