diff --git a/backend/src/main/java/ervu/enums/ExcerptStatus.java b/backend/src/main/java/ervu/enums/ExcerptStatus.java new file mode 100644 index 00000000..4b4cc94e --- /dev/null +++ b/backend/src/main/java/ervu/enums/ExcerptStatus.java @@ -0,0 +1,14 @@ +package ervu.enums; + +import ru.cg.webbpm.modules.webkit.annotations.Model; + +/** + * @author gulnaz + */ +@Model +public enum ExcerptStatus { + NONE, + PENDING, + READY, + NOT_FOUND +} diff --git a/backend/src/main/java/ru/micord/ervu/dao/ExcerptHistoryDao.java b/backend/src/main/java/ru/micord/ervu/dao/ExcerptHistoryDao.java index ce8704a8..009e1938 100644 --- a/backend/src/main/java/ru/micord/ervu/dao/ExcerptHistoryDao.java +++ b/backend/src/main/java/ru/micord/ervu/dao/ExcerptHistoryDao.java @@ -5,6 +5,7 @@ import java.time.LocalDateTime; import java.time.temporal.ChronoUnit; import java.util.Optional; +import ervu.enums.ExcerptStatus; import ervu_lkrp_ul.ervu_lkrp_ul.db_beans.public_.tables.records.ExcerptHistoryRecord; import org.jooq.DSLContext; import org.jooq.impl.DSL; @@ -29,7 +30,7 @@ public class ExcerptHistoryDao { } public Optional get(String ervuId, String prnOid) { - return dslContext.select(EXCERPT_HISTORY.ID) + return dslContext.select(EXCERPT_HISTORY.ID, EXCERPT_HISTORY.URL) .from(EXCERPT_HISTORY) .where(EXCERPT_HISTORY.ID.eq( select(DSL.max(EXCERPT_HISTORY.ID)) @@ -43,19 +44,11 @@ public class ExcerptHistoryDao { public String getStatus(String ervuId, String prnOid) { return dslContext.select(coalesce( - field( - select( - case_() - .when(EXCERPT_HISTORY.DATETIME.isNull(), "in-progress") - .else_("ready") - ) + field(select(EXCERPT_HISTORY.STATUS) .from(EXCERPT_HISTORY) - .where( - EXCERPT_HISTORY.ERVU_ID.eq(ervuId) - .and(EXCERPT_HISTORY.PRN_OID.eq(prnOid)) - ) - ), - "none" + .where(EXCERPT_HISTORY.ERVU_ID.eq(ervuId) + .and(EXCERPT_HISTORY.PRN_OID.eq(prnOid))) + ), ExcerptStatus.NONE.name() )).fetchAnyInto(String.class); } @@ -63,21 +56,25 @@ public class ExcerptHistoryDao { dslContext.insertInto(EXCERPT_HISTORY) .set(EXCERPT_HISTORY.ERVU_ID, ervuId) .set(EXCERPT_HISTORY.PRN_OID, prnOid) - .execute(); - } - - public void insert(String ervuId, String prnOid, String url) { - dslContext.insertInto(EXCERPT_HISTORY) - .set(EXCERPT_HISTORY.ERVU_ID, ervuId) - .set(EXCERPT_HISTORY.PRN_OID, prnOid) - .set(EXCERPT_HISTORY.URL, url) + .set(EXCERPT_HISTORY.STATUS, ExcerptStatus.PENDING.name()) .set(EXCERPT_HISTORY.DATETIME, Timestamp.valueOf(LocalDateTime.now())) .execute(); } - public void update(Long id, String url) { + public void insert(String ervuId, String prnOid, String url, String status) { + dslContext.insertInto(EXCERPT_HISTORY) + .set(EXCERPT_HISTORY.ERVU_ID, ervuId) + .set(EXCERPT_HISTORY.PRN_OID, prnOid) + .set(EXCERPT_HISTORY.URL, url) + .set(EXCERPT_HISTORY.STATUS, status) + .set(EXCERPT_HISTORY.DATETIME, Timestamp.valueOf(LocalDateTime.now())) + .execute(); + } + + public void update(Long id, String url, String status) { dslContext.update(EXCERPT_HISTORY) .set(EXCERPT_HISTORY.URL, url) + .set(EXCERPT_HISTORY.STATUS, status) .set(EXCERPT_HISTORY.DATETIME, Timestamp.valueOf(LocalDateTime.now())) .where(EXCERPT_HISTORY.ID.eq(id)) .execute(); @@ -90,10 +87,14 @@ public class ExcerptHistoryDao { .execute(); } - public void deleteOlderThan(long hours) { + public void deleteOlderThan(long readyFileHours, long pendingFileHours) { dslContext.deleteFrom(EXCERPT_HISTORY) - .where(EXCERPT_HISTORY.DATETIME.le( - Timestamp.valueOf(LocalDateTime.now().minus(hours, ChronoUnit.HOURS)))) + .where(EXCERPT_HISTORY.STATUS.eq(ExcerptStatus.READY.name()) + .and(EXCERPT_HISTORY.DATETIME.le( + Timestamp.valueOf(LocalDateTime.now().minus(readyFileHours, ChronoUnit.HOURS))))) + .or(EXCERPT_HISTORY.STATUS.in(ExcerptStatus.PENDING.name(), ExcerptStatus.NOT_FOUND.name()) + .and(EXCERPT_HISTORY.DATETIME.le( + Timestamp.valueOf(LocalDateTime.now().minus(pendingFileHours, ChronoUnit.HOURS))))) .execute(); } } diff --git a/backend/src/main/java/ru/micord/ervu/kafka/listener/ExcerptListener.java b/backend/src/main/java/ru/micord/ervu/kafka/listener/ExcerptListener.java index 015c2783..c6cfb329 100644 --- a/backend/src/main/java/ru/micord/ervu/kafka/listener/ExcerptListener.java +++ b/backend/src/main/java/ru/micord/ervu/kafka/listener/ExcerptListener.java @@ -1,9 +1,9 @@ package ru.micord.ervu.kafka.listener; import java.util.UUID; -import java.util.concurrent.atomic.AtomicReference; import com.fasterxml.jackson.databind.ObjectMapper; +import ervu.enums.ExcerptStatus; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.kafka.annotation.KafkaListener; @@ -50,7 +50,7 @@ public class ExcerptListener { if (!excerptResponse.getSuccess()) { if (excerptResponse.getData() != null) { data = excerptResponse.getData(); - excerptHistoryDao.delete(data.getOrgId(), data.getPrnOid()); + saveUrl(data.getOrgId(), data.getPrnOid(), fileUrl); } throw new ExcerptResponseException( "Error with getting excerpt url " + excerptResponse.getMessage()); @@ -59,7 +59,7 @@ public class ExcerptListener { || excerptResponse.getData().getFileUrl().isEmpty()) { if (excerptResponse.getData() != null) { data = excerptResponse.getData(); - excerptHistoryDao.delete(data.getOrgId(), data.getPrnOid()); + saveUrl(data.getOrgId(), data.getPrnOid(), fileUrl); } auditService.processDownloadEvent(data, 0, fileName, 1, AuditConstants.FAILURE_STATUS_TYPE, fileUrl @@ -70,14 +70,7 @@ public class ExcerptListener { data = excerptResponse.getData(); fileUrl = data.getFileUrl(); fileName = UrlUtils.extractFileNameFromUrl(fileUrl); - String ervuId = excerptResponse.getData().getOrgId(); - String prnOid = excerptResponse.getData().getPrnOid(); - AtomicReference fileRef = new AtomicReference<>(fileUrl); - excerptHistoryDao.get(ervuId, prnOid) - .ifPresentOrElse( - record -> excerptHistoryDao.update(record.getId(), fileRef.get()), - () -> excerptHistoryDao.insert(ervuId, prnOid, fileRef.get()) - ); + saveUrl(data.getOrgId(), data.getPrnOid(), fileUrl); } catch (Exception e) { auditService.processDownloadEvent(data, 0, fileName, 1, @@ -90,4 +83,12 @@ public class ExcerptListener { public String getGroupId() { return groupId + "-" + UUID.randomUUID(); } + + private void saveUrl(String ervuId, String prnOid, String fileUrl) { + String status = fileUrl == null ? ExcerptStatus.NOT_FOUND.name() : ExcerptStatus.READY.name(); + excerptHistoryDao.get(ervuId, prnOid).ifPresentOrElse( + record -> excerptHistoryDao.update(record.getId(), fileUrl, status), + () -> excerptHistoryDao.insert(ervuId, prnOid, fileUrl, status) + ); + } } diff --git a/backend/src/main/java/ru/micord/ervu/scheduler/ExcerptCleanScheduler.java b/backend/src/main/java/ru/micord/ervu/scheduler/ExcerptCleanScheduler.java index daa4fddf..6563d146 100644 --- a/backend/src/main/java/ru/micord/ervu/scheduler/ExcerptCleanScheduler.java +++ b/backend/src/main/java/ru/micord/ervu/scheduler/ExcerptCleanScheduler.java @@ -14,16 +14,18 @@ public class ExcerptCleanScheduler { private final ExcerptHistoryDao excerptHistoryDao; - @Value("${excerpt.lifetime.hours:24}") - private long fileLifetime; + @Value("${excerpt.ready.lifetime.hours:24}") + private long readyFileLifetime; + @Value("${excerpt.pending.lifetime.hours:8}") + private long pendingFileLifetime; public ExcerptCleanScheduler(ExcerptHistoryDao excerptHistoryDao) { this.excerptHistoryDao = excerptHistoryDao; } - @Scheduled(fixedDelayString = "${excerpt.cleanup.delay:30000}") + @Scheduled(cron = "${excerpt.cleanup.cron:0 */30 * * * *}") @SchedulerLock(name = "oldExcerptFilesCleaning") public void cleanOld() { - excerptHistoryDao.deleteOlderThan(fileLifetime); + excerptHistoryDao.deleteOlderThan(readyFileLifetime, pendingFileLifetime); } } diff --git a/frontend/src/ts/ervu/component/button/ErvuFileRequestDialogButton.ts b/frontend/src/ts/ervu/component/button/ErvuFileRequestDialogButton.ts index e7cb2951..0c1b9503 100644 --- a/frontend/src/ts/ervu/component/button/ErvuFileRequestDialogButton.ts +++ b/frontend/src/ts/ervu/component/button/ErvuFileRequestDialogButton.ts @@ -3,7 +3,7 @@ import {Subscription} from "rxjs"; import {InMemoryStaticGrid} from "../grid/InMemoryStaticGrid"; import {OnDestroy} from "@angular/core"; import {HttpClient} from "@angular/common/http"; -import {ExcerptStatus} from "../enum/ExcerptStatus"; +import { ExcerptStatus } from "../../../generated/ervu/enums/ExcerptStatus"; @AnalyticalScope(AbstractButton) export class ErvuFileRequestDialogButton extends Behavior implements OnDestroy { @@ -34,7 +34,7 @@ export class ErvuFileRequestDialogButton extends Behavior implements OnDestroy { this.httpClient = this.injector.get(HttpClient); this.gridLoadedSubscription = this.grid.gridLoaded.subscribe(() => { this.button.setEnabled(this.grid.getRowDataSize() > 0 - && this.fileStatus !== ExcerptStatus.IN_PROGRESS); + && this.fileStatus !== ExcerptStatus.PENDING); this.button.setVisible(this.grid.getRowDataSize() > 0); }); } @@ -46,11 +46,11 @@ export class ErvuFileRequestDialogButton extends Behavior implements OnDestroy { this.fileStatus = status; if (this.grid.isInitialized() && this.grid.getRowDataSize() > 0) { - this.button.setEnabled(status !== ExcerptStatus.IN_PROGRESS); + this.button.setEnabled(status !== ExcerptStatus.PENDING); this.button.setVisible(true); } - if (status === ExcerptStatus.IN_PROGRESS) { + if (status === ExcerptStatus.PENDING) { this.button.setTooltip(this.requestSentMsg); this.text.setValue(this.requestSentMsg); diff --git a/frontend/src/ts/ervu/component/enum/ExcerptStatus.ts b/frontend/src/ts/ervu/component/enum/ExcerptStatus.ts deleted file mode 100644 index 4be38df5..00000000 --- a/frontend/src/ts/ervu/component/enum/ExcerptStatus.ts +++ /dev/null @@ -1,5 +0,0 @@ -export enum ExcerptStatus { - NONE = 'none', - IN_PROGRESS = 'in-progress', - READY = 'ready' -}