@Override public boolean isValid() { return getDuration() > 0; }
public long getFetchCount(GraphGranularityType granularity) { switch (granularity) { case DAILY: return TimeUnit.DAYS.toDays(getDuration()); case HOURLY: return TimeUnit.DAYS.toHours(getDuration()); default: return TimeUnit.DAYS.toMinutes(getDuration()); } }
@Override public void addReportSpecificAtTime(StringBuilder sb, ZoneId zoneId) { super.addReportSpecificAtTime(sb, zoneId); sb.append(" ").append(dayOfMonth.label); }
@Override public void buildDynamicSection(StringBuilder sb, ZoneId zoneId) { sb.append("Period: ").append(getDurationLabel()); addReportSpecificAtTime(sb, zoneId); if (durationType == ReportDurationType.CUSTOM) { sb.append("<br>"); ZonedDateTime date; date = getZonedFromTs(startTs, zoneId); sb.append("Start date: ").append(date.toLocalDate()).append("<br>"); date = ZonedDateTime.ofInstant(Instant.ofEpochMilli(endTs), zoneId); sb.append("End date: ").append(date.toLocalDate()).append("<br>"); } }
public long calculateDelayInSeconds() throws IllegalCommandBodyException { DailyReport basePeriodicReportType = (DailyReport) reportType; ZonedDateTime zonedNow = ZonedDateTime.now(tzName); ZonedDateTime zonedStartAt = basePeriodicReportType.getNextTriggerTime(zonedNow, tzName); if (basePeriodicReportType.isExpired(zonedStartAt, tzName)) { throw new IllegalCommandBodyException("Report is expired."); } Duration duration = Duration.between(zonedNow, zonedStartAt); long initialDelaySeconds = duration.getSeconds(); if (initialDelaySeconds < 0) { throw new IllegalCommandBodyException("Initial delay in less than zero."); } return initialDelaySeconds; }
private ReportResult generateReport(Path userCsvFolder, Profile profile, DashBoard dash, long now) throws Exception { int fetchCount = (int) report.reportType.getFetchCount(report.granularityType); long startFrom = now - TimeUnit.DAYS.toMillis(report.reportType.getDuration()); //truncate second, minute, hour, depending of granularity in order to do not filter first point. //https://github.com/blynkkk/blynk-server/issues/1149 startFrom = (startFrom / report.granularityType.period) * report.granularityType.period; Path output = Paths.get(userCsvFolder.toString() + ".zip"); boolean hasData = generateReport(output, profile, dash, fetchCount, startFrom); if (hasData) { sendEmail(output); return ReportResult.OK; } log.info("No data for report for user {} and reportId {}.", key.user.email, report.id); return ReportResult.NO_DATA; }
ZonedDateTime buildZonedStartAt(ZonedDateTime zonedNow, ZoneId zoneId) { ZonedDateTime zonedStartAt = getZonedFromTs(atTime, zoneId); zonedStartAt = zonedNow .withHour(zonedStartAt.getHour()) .withMinute(zonedStartAt.getMinute()) .withSecond(zonedStartAt.getSecond()); return adjustToStartDate(zonedStartAt, zonedNow, zoneId); }
public boolean isExpired(ZonedDateTime zonedNow, ZoneId zoneId) { if (durationType == ReportDurationType.CUSTOM) { ZonedDateTime zonedEndDate = getZonedFromTs(endTs, zoneId).with(LocalTime.MAX); return zonedEndDate.isBefore(zonedNow); } return false; }
@Override public void buildDynamicSection(StringBuilder sb, ZoneId zoneId) { sb.append("Period: ").append(getDurationLabel()); }
public boolean isValid() { return reportType != null && reportType.isValid() && reportSources != null && reportSources.length > 0 && BlynkEmailValidator.isValidEmails(recipients); }
String buildDynamicSection() { StringBuilder sb = new StringBuilder(); sb.append("Report name: ").append(getReportName()).append("<br>"); reportType.buildDynamicSection(sb, tzName); return sb.toString(); }
@Override public ZonedDateTime getNextTriggerTime(ZonedDateTime zonedNow, ZoneId zoneId) { ZonedDateTime zonedStartAt = buildZonedStartAt(zonedNow, zoneId); return zonedStartAt.isAfter(zonedNow) ? zonedStartAt : zonedStartAt.plusDays(1); } }
private void sendEmail(Path output) throws Exception { String durationLabel = report.reportType.getDurationLabel().toLowerCase(); String subj = "Your " + durationLabel + " " + report.getReportName() + " is ready"; String gzipDownloadUrl = downloadUrl + output.getFileName(); String dynamicSection = report.buildDynamicSection(); mailWrapper.sendReportEmail(report.recipients, subj, gzipDownloadUrl, dynamicSection); }
@Override public ZonedDateTime getNextTriggerTime(ZonedDateTime zonedNow, ZoneId zoneId) { ZonedDateTime zonedStartAt = buildZonedStartAt(zonedNow, zoneId); DayOfWeek dayOfWeek = DayOfWeek.of(dayOfTheWeek); zonedStartAt = zonedStartAt.with(TemporalAdjusters.nextOrSame(dayOfWeek)); return zonedStartAt.isAfter(zonedNow) ? zonedStartAt : zonedStartAt.with(TemporalAdjusters.next(dayOfWeek)); } }
@Override public ZonedDateTime getNextTriggerTime(ZonedDateTime zonedNow, ZoneId zoneId) { ZonedDateTime zonedStartAt = buildZonedStartAt(zonedNow, zoneId); switch (dayOfMonth) { case LAST: zonedStartAt = zonedStartAt.with(TemporalAdjusters.lastDayOfMonth()); return zonedStartAt.isAfter(zonedNow) ? zonedStartAt : zonedStartAt.plusDays(1).with(TemporalAdjusters.lastDayOfMonth()); case FIRST: default: zonedStartAt = zonedStartAt.with(TemporalAdjusters.firstDayOfMonth()); return zonedStartAt.isAfter(zonedNow) ? zonedStartAt : zonedStartAt.with(TemporalAdjusters.firstDayOfNextMonth()); } } }
public void addReportSpecificAtTime(StringBuilder sb, ZoneId zoneId) { ZonedDateTime zonedAt = getZonedFromTs(atTime, zoneId); LocalTime localTime = zonedAt.toLocalTime(); sb.append(", ").append("at ").append(LocalTime.of(localTime.getHour(), localTime.getMinute())); }
@Override public void addReportSpecificAtTime(StringBuilder sb, ZoneId zoneId) { super.addReportSpecificAtTime(sb, zoneId); DayOfWeek dayOfWeek = DayOfWeek.of(dayOfTheWeek); String dayOfWeekDisplayName = dayOfWeek.getDisplayName(TextStyle.FULL, Locale.US); sb.append(" every ").append(dayOfWeekDisplayName); }
private ZonedDateTime adjustToStartDate(ZonedDateTime zonedStartAt, ZonedDateTime zonedNow, ZoneId zoneId) { if (durationType == ReportDurationType.CUSTOM) { ZonedDateTime zonedStartDate = getZonedFromTs(startTs, zoneId).with(LocalTime.MIN); if (zonedStartDate.isAfter(zonedNow)) { zonedStartAt = zonedStartAt .withDayOfMonth(zonedStartDate.getDayOfMonth()) .withMonth(zonedStartDate.getMonthValue()) .withYear(zonedStartDate.getYear()); } } return zonedStartAt; }