Skip to content

Commit

Permalink
feat: add information page for exported report
Browse files Browse the repository at this point in the history
  • Loading branch information
Sotatek-ThinhVu committed Apr 25, 2024
1 parent d90bdd6 commit 5496576
Show file tree
Hide file tree
Showing 13 changed files with 394 additions and 20 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.cardanofoundation.job.common.enumeration;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;

@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
@RequiredArgsConstructor
@Getter
public enum EventType {
DELEGATION("Delegation"),
DE_REGISTRATION("Deregistration"),
REGISTRATION("Registration"),
REWARDS("Rewards"),
WITHDRAWAL("Withdrawal"),
POOL_UPDATE("Pool Update"),
POOL_SIZE("Pool Size");
String value;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package org.cardanofoundation.job.dto.report.pool;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import lombok.Builder;
import lombok.Data;

import org.cardanofoundation.job.util.report.ColumnFieldEnum;
import org.cardanofoundation.job.util.report.ColumnTitleEnum;
import org.cardanofoundation.job.util.report.ExportColumn;
import org.cardanofoundation.job.util.report.ExportColumn.Alignment;

@Builder
@Data
public class InformationReport {
private Date createdAt;

private String reportType;

private String poolId;

private String stakeAddress;

private String reportName;

private String dateRange;

private String epochRange;

private String dateTimeFormat;

private String events;

private String isADATransfers;

private String isPoolSize;

public static List<ExportColumn> buildExportColumn(Boolean isPoolReport) {
List<ExportColumn> columns = new ArrayList<>();
columns.add(
new ExportColumn(
ColumnFieldEnum.CREATED_AT_COLUMN, ColumnTitleEnum.CREATED_AT_TITLE, Alignment.LEFT));
columns.add(
new ExportColumn(
ColumnFieldEnum.REPORT_TYPE_COLUMN, ColumnTitleEnum.REPORT_TYPE_TITLE, Alignment.LEFT));
if (isPoolReport) {
columns.add(
new ExportColumn(
ColumnFieldEnum.POOL_ID_COLUMN, ColumnTitleEnum.POOL_ID_TITLE, Alignment.LEFT));
} else {
columns.add(
new ExportColumn(
ColumnFieldEnum.STAKE_ADDRESS_COLUMN,
ColumnTitleEnum.STAKE_ADDRESS_TITLE,
Alignment.LEFT));
}
columns.add(
new ExportColumn(
ColumnFieldEnum.REPORT_NAME_COLUMN, ColumnTitleEnum.REPORT_NAME_TITLE, Alignment.LEFT));
if (isPoolReport) {
columns.add(
new ExportColumn(
ColumnFieldEnum.EPOCH_RANGE_COLUMN,
ColumnTitleEnum.EPOCH_RANGE_TITLE,
Alignment.LEFT));
} else {
columns.add(
new ExportColumn(
ColumnFieldEnum.DATE_RANGE_COLUMN, ColumnTitleEnum.DATE_RANGE_TITLE, Alignment.LEFT));
}
columns.add(
new ExportColumn(
ColumnFieldEnum.DATE_TIME_FORTMAT_COLUMN,
ColumnTitleEnum.DATE_TIME_FORMAT_TITLE,
Alignment.LEFT));
columns.add(
new ExportColumn(
ColumnFieldEnum.EVENTS_COLUMN, ColumnTitleEnum.EVENTS_TITLE, Alignment.LEFT));
if (isPoolReport) {
columns.add(
new ExportColumn(
ColumnFieldEnum.POOL_SIZE_COLUMN, ColumnTitleEnum.POOL_SIZE_TITLE, Alignment.LEFT));
} else {
columns.add(
new ExportColumn(
ColumnFieldEnum.ADA_TRANSFERS_COLUMN,
ColumnTitleEnum.ADA_TRANSFERS_TITLE,
Alignment.LEFT));
}
return columns;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,21 @@ public void consume(
StakeKeyReportHistory stakeKeyReportHistory =
stakeKeyReportHistoryRepository.findByReportHistoryId(reportHistory.getId());
stakeKeyReportService.exportStakeKeyReport(
stakeKeyReportHistory, reportMessage.getZoneOffset(), reportMessage.getTimePattern());
stakeKeyReportHistory,
reportMessage.getZoneOffset(),
reportMessage.getTimePattern(),
reportMessage.getDateFormat(),
reportMessage.getStakeAddress());
break;
case POOL_ID:
PoolReportHistory poolReportHistory =
poolReportHistoryRepository.findByReportHistoryId(reportHistory.getId());
poolReportService.exportPoolReport(
poolReportHistory, reportMessage.getZoneOffset(), reportMessage.getTimePattern());
poolReportHistory,
reportMessage.getZoneOffset(),
reportMessage.getTimePattern(),
reportMessage.getDateFormat(),
reportMessage.getPoolId());
break;
default:
break;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@

public interface PoolReportService {

void exportPoolReport(PoolReportHistory poolReportHistory, Long zoneOffset, String timePattern)
void exportPoolReport(
PoolReportHistory poolReportHistory,
Long zoneOffset,
String timePattern,
String dateFormat,
String poolId)
throws Exception;
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.cardanofoundation.job.service;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CompletableFuture;
Expand All @@ -17,8 +19,15 @@
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

import org.apache.logging.log4j.util.Strings;

import org.cardanofoundation.explorer.common.entity.enumeration.ReportType;
import org.cardanofoundation.explorer.common.entity.explorer.PoolReportHistory;
import org.cardanofoundation.explorer.common.entity.explorer.ReportHistory;
import org.cardanofoundation.explorer.common.entity.explorer.StakeKeyReportHistory;
import org.cardanofoundation.job.common.enumeration.EventType;
import org.cardanofoundation.job.dto.report.pool.EpochSize;
import org.cardanofoundation.job.dto.report.pool.InformationReport;
import org.cardanofoundation.job.dto.report.pool.PoolDeregistration;
import org.cardanofoundation.job.dto.report.pool.PoolRegistration;
import org.cardanofoundation.job.dto.report.pool.PoolUpdate;
Expand All @@ -29,6 +38,9 @@
import org.cardanofoundation.job.dto.report.stake.StakeRewardResponse;
import org.cardanofoundation.job.dto.report.stake.StakeWalletActivityResponse;
import org.cardanofoundation.job.dto.report.stake.StakeWithdrawalFilterResponse;
import org.cardanofoundation.job.repository.explorer.PoolReportHistoryRepository;
import org.cardanofoundation.job.repository.explorer.StakeKeyReportHistoryRepository;
import org.cardanofoundation.job.util.DataUtil;
import org.cardanofoundation.job.util.report.ExportContent;

@Component
Expand All @@ -46,11 +58,15 @@ public class ReportHistoryServiceAsync {
private static final String OPERATOR_REWARDS_TITLE = "Operator Rewards";
private static final String DEREGISTRATION_TITLE = "Deregistration";
private static final String NOT_AVAILABLE = "Not available";
private static final String INFORMATION_ON_THE_REPORT_TITLE = "Information on the Report";

private final StakeKeyLifeCycleService stakeKeyLifeCycleService;

private final PoolLifecycleService poolLifecycleService;
private final FetchRewardDataService fetchRewardDataService;
private final StakeKeyReportHistoryRepository stakeKeyReportHistoryRepository;

private final PoolReportHistoryRepository poolReportHistoryRepository;

@Value("${jobs.limit-content}")
private int limitSize;
Expand Down Expand Up @@ -325,4 +341,135 @@ public CompletableFuture<ExportContent> exportPoolDeregistration(PoolReportHisto
.lstData(poolRegistrations)
.build());
}

@Async
public CompletableFuture<ExportContent> exportInformationOnTheReport(
ReportHistory reportHistory,
Long zoneOffset,
String timePattern,
String dateFormat,
String poolIdOrStakeAddress) {
boolean isPoolReport = ReportType.POOL_ID.equals(reportHistory.getType());
InformationReport informationReport =
buildInformationReport(
reportHistory, zoneOffset, timePattern, dateFormat, poolIdOrStakeAddress);

List<InformationReport> list = new ArrayList<>(List.of(informationReport));
return CompletableFuture.completedFuture(
ExportContent.builder()
.clazz(InformationReport.class)
.headerTitle(INFORMATION_ON_THE_REPORT_TITLE)
.lstColumn(InformationReport.buildExportColumn(isPoolReport))
.lstData(list)
.build());
}

private InformationReport buildInformationReport(
ReportHistory reportHistory,
Long zoneOffset,
String timePattern,
String dateFormat,
String poolIdOrStakeAddress) {
boolean isPoolReport = ReportType.POOL_ID.equals(reportHistory.getType());
if (isPoolReport) {
return buildPoolReport(reportHistory, dateFormat, poolIdOrStakeAddress);
} else {
return buildStakeReport(
reportHistory, zoneOffset, timePattern, dateFormat, poolIdOrStakeAddress);
}
}

private InformationReport buildPoolReport(
ReportHistory reportHistory, String dateFormat, String poolId) {
PoolReportHistory poolReportHistory =
poolReportHistoryRepository.findByReportHistoryId(reportHistory.getId());
Integer epochBegin = poolReportHistory.getBeginEpoch();
Integer epochEnd = poolReportHistory.getEndEpoch();

List<String> events = new ArrayList<>();

if (poolReportHistory.getEventPoolUpdate()) {
events.add(EventType.POOL_UPDATE.getValue());
}
if (poolReportHistory.getEventDeregistration()) {
events.add(EventType.DE_REGISTRATION.getValue());
}
if (poolReportHistory.getEventRegistration()) {
events.add(EventType.REGISTRATION.getValue());
}
if (poolReportHistory.getEventReward()) {
events.add(EventType.REWARDS.getValue());
}

String epochRange =
String.join(
" - ",
epochBegin == null ? "N/A" : Strings.concat("Epoch ", epochBegin.toString()),
epochEnd == null ? "N/A" : Strings.concat("Epoch ", epochEnd.toString()));

String eventsString = events.isEmpty() ? null : String.join(", ", events);
return InformationReport.builder()
.createdAt(reportHistory.getCreatedAt())
.reportType("Pool Report")
.poolId(poolId)
.reportName(reportHistory.getReportName())
.epochRange(epochRange)
.dateTimeFormat(dateFormat)
.events(eventsString)
.isPoolSize(Boolean.TRUE.equals(poolReportHistory.getIsPoolSize()) ? "Yes" : "No")
.build();
}

private InformationReport buildStakeReport(
ReportHistory reportHistory,
Long zoneOffset,
String timePattern,
String dateFormat,
String stakeAddress) {
StakeKeyReportHistory stakeKeyReportHistory =
stakeKeyReportHistoryRepository.findByReportHistoryId(reportHistory.getId());

Timestamp fromDate = stakeKeyReportHistory.getFromDate();
Timestamp toDate = stakeKeyReportHistory.getToDate();

String datePattern = timePattern.substring(0, timePattern.indexOf(','));

String dateRange =
String.join(
" - ",
fromDate == null ? "N/A" : DataUtil.dateToString(fromDate, zoneOffset, datePattern),
toDate == null ? "N/A" : DataUtil.dateToString(toDate, zoneOffset, datePattern));

List<String> stakeEvents = new ArrayList<>();

if (stakeKeyReportHistory.getEventRegistration()) {
stakeEvents.add(EventType.REGISTRATION.getValue());
}
if (stakeKeyReportHistory.getEventDelegation()) {
stakeEvents.add(EventType.DELEGATION.getValue());
}
if (stakeKeyReportHistory.getEventRewards()) {
stakeEvents.add(EventType.REWARDS.getValue());
}
if (stakeKeyReportHistory.getEventWithdrawal()) {
stakeEvents.add(EventType.WITHDRAWAL.getValue());
}
if (stakeKeyReportHistory.getEventDeregistration()) {
stakeEvents.add(EventType.DE_REGISTRATION.getValue());
}

String eventsString = stakeEvents.isEmpty() ? null : String.join(", ", stakeEvents);

return InformationReport.builder()
.createdAt(reportHistory.getCreatedAt())
.reportType("Stake Address Report")
.stakeAddress(stakeAddress)
.reportName(reportHistory.getReportName())
.dateRange(dateRange)
.dateTimeFormat(dateFormat)
.events(eventsString)
.isADATransfers(
Boolean.TRUE.equals(stakeKeyReportHistory.getIsADATransfer()) ? "Yes" : "No")
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,10 @@ public interface StakeKeyReportService {
* @param stakeKeyReportHistory stake key report history
*/
void exportStakeKeyReport(
StakeKeyReportHistory stakeKeyReportHistory, Long zoneOffset, String timePattern)
StakeKeyReportHistory stakeKeyReportHistory,
Long zoneOffset,
String timePattern,
String dateFormat,
String stakeAddress)
throws Exception;
}

0 comments on commit 5496576

Please sign in to comment.