mirror of
https://github.com/vran-dev/databasir.git
synced 2025-10-29 11:29:19 +08:00
feature: synchronize documents asynchronously (#97)
* feat: update jooq model * feat: add project sync task * feat: update frontend resources
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
package com.databasir.dao.enums;
|
||||
|
||||
public enum ProjectSyncTaskStatus {
|
||||
NEW,
|
||||
RUNNING,
|
||||
FINISHED,
|
||||
FAILED,
|
||||
CANCELLED
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
14
dao/src/main/resources/db/migration/V1.3__sync_task.sql
Normal file
14
dao/src/main/resources/db/migration/V1.3__sync_task.sql
Normal 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;
|
||||
Reference in New Issue
Block a user