feature: synchronize documents asynchronously (#97)

* feat: update jooq model

* feat: add project sync task

* feat: update frontend resources
This commit is contained in:
vran
2022-04-16 13:44:06 +08:00
committed by GitHub
parent d257a65664
commit 3e70346bb3
69 changed files with 1287 additions and 175 deletions

View File

@@ -0,0 +1,12 @@
package com.databasir.dao.converter;
import com.databasir.dao.enums.ProjectSyncTaskStatus;
import org.jooq.impl.EnumConverter;
public class ProjectSyncTaskStatusConverter extends EnumConverter<String, ProjectSyncTaskStatus> {
public ProjectSyncTaskStatusConverter() {
super(String.class, ProjectSyncTaskStatus.class);
}
}

View File

@@ -0,0 +1,9 @@
package com.databasir.dao.enums;
public enum ProjectSyncTaskStatus {
NEW,
RUNNING,
FINISHED,
FAILED,
CANCELLED
}

View File

@@ -0,0 +1,59 @@
package com.databasir.dao.impl;
import com.databasir.dao.enums.ProjectSyncTaskStatus;
import com.databasir.dao.tables.pojos.ProjectSyncTaskPojo;
import com.databasir.dao.tables.records.ProjectSyncTaskRecord;
import lombok.Getter;
import org.jooq.DSLContext;
import org.jooq.UpdateSetMoreStep;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import static com.databasir.dao.Tables.PROJECT_SYNC_TASK;
@Repository
public class ProjectSyncTaskDao extends BaseDao<ProjectSyncTaskPojo> {
@Autowired
@Getter
private DSLContext dslContext;
public ProjectSyncTaskDao() {
super(PROJECT_SYNC_TASK, ProjectSyncTaskPojo.class);
}
public boolean existsByProjectId(Integer projectId, Collection<ProjectSyncTaskStatus> statusIn) {
if (statusIn == null || statusIn.isEmpty()) {
throw new IllegalArgumentException("statusIn must not be empty");
}
return dslContext.fetchExists(PROJECT_SYNC_TASK,
PROJECT_SYNC_TASK.PROJECT_ID.eq(projectId).and(PROJECT_SYNC_TASK.STATUS.in(statusIn)));
}
public List<ProjectSyncTaskPojo> listNewTasks(Integer size) {
return dslContext
.selectFrom(PROJECT_SYNC_TASK)
.where(PROJECT_SYNC_TASK.STATUS.eq(ProjectSyncTaskStatus.NEW))
.orderBy(PROJECT_SYNC_TASK.ID.asc())
.limit(size)
.fetchInto(ProjectSyncTaskPojo.class);
}
public int updateStatusAndResultById(Integer taskId, ProjectSyncTaskStatus status, String result) {
UpdateSetMoreStep<ProjectSyncTaskRecord> updateStep = dslContext
.update(PROJECT_SYNC_TASK)
.set(PROJECT_SYNC_TASK.STATUS, status)
.set(PROJECT_SYNC_TASK.RESULT, result);
if (status == ProjectSyncTaskStatus.RUNNING) {
updateStep = updateStep.set(PROJECT_SYNC_TASK.RUN_AT, LocalDateTime.now());
}
return updateStep
.where(PROJECT_SYNC_TASK.ID.eq(taskId))
.execute();
}
}

View File

@@ -0,0 +1,14 @@
CREATE TABLE IF NOT EXISTS project_sync_task
(
`id` INT PRIMARY KEY AUTO_INCREMENT,
`project_id` INT NOT NULL,
`user_id` INT NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'NEW' COMMENT 'NEW \ RUNNING \ FINISHED \ FAILED \ CANCELED',
`result` VARCHAR(1024) NOT NULL DEFAULT '',
`run_at` DATETIME DEFAULT NULL,
`update_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`create_at` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
INDEX idx_project_id (project_id),
INDEX idx_user_id (user_id)
) CHARSET utf8mb4
COLLATE utf8mb4_unicode_ci;