Skip to content

Commit 5ca0b8f

Browse files
committed
added search
1 parent eee23b9 commit 5ca0b8f

File tree

10 files changed

+98
-38
lines changed

10 files changed

+98
-38
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
# Changelog
22

3+
## v1.4.2 - (2025-01-06)
4+
5+
- Fixed count by TaskId
6+
- added search by ID to the UI
7+
- added search by task to history
8+
39
## v1.4.1 - (2025-01-06)
410

511
- Added state to the TriggerLifeCycleEvent

core/src/main/java/org/sterl/spring/persistent_tasks/api/TriggerKey.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,16 +27,6 @@ public class TriggerKey implements Serializable {
2727
private String id;
2828
private String taskName;
2929

30-
public static TriggerKey of(@Nullable String id, String taskName) {
31-
if (StringUtils.trimToNull(id) == null
32-
&& StringUtils.trimToNull(taskName) == null) return null;
33-
34-
var taskId = StringUtils.trimToNull(taskName) == null
35-
? null
36-
: new TaskId<Serializable>(taskName.trim());
37-
return of(StringUtils.trimToNull(id), taskId);
38-
}
39-
4030
public static TriggerKey of(@Nullable String id, TaskId<? extends Serializable> taskId) {
4131
return new TriggerKey(id == null ? UUID.randomUUID().toString() : id, taskId.name());
4232
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/HistoryService.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ public long countTriggers(TriggerKey key) {
8080
public Page<TriggerHistoryLastStateEntity> findTriggerState(
8181
TriggerKey key, Pageable page) {
8282
if (key == null) return triggerHistoryDetailRepository.findAll(page);
83+
if (key.getId() == null && key.getTaskName() == null) return triggerHistoryDetailRepository.findAll(page);
8384
if (key.getId() == null && key.getTaskName() != null) {
8485
return triggerHistoryDetailRepository.findAll(key.getTaskName(), page);
8586
}

core/src/main/java/org/sterl/spring/persistent_tasks/history/api/TriggerHistoryResource.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import java.util.List;
44

5+
import org.apache.commons.lang3.StringUtils;
56
import org.springframework.data.domain.Pageable;
67
import org.springframework.data.domain.Sort.Direction;
78
import org.springframework.data.web.PageableDefault;
@@ -34,11 +35,13 @@ public List<Trigger> listInstances(@PathVariable("instanceId") long instanceId)
3435

3536
@GetMapping("history")
3637
public PagedModel<Trigger> list(
37-
@RequestParam(name = "id", required = false) String taskId,
38-
@RequestParam(name = "taskName", required = false) String name,
38+
@RequestParam(name = "id", required = false) String id,
39+
@RequestParam(name = "taskName", required = false) String taskName,
3940
@PageableDefault(size = 100, direction = Direction.DESC, sort = "id") Pageable pageable) {
4041

4142
return FromLastTriggerStateEntity.INSTANCE.toPage( //
42-
historyService.findTriggerState(TriggerKey.of(taskId, name), pageable));
43+
historyService.findTriggerState(
44+
new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName)),
45+
pageable));
4346
}
4447
}

core/src/main/java/org/sterl/spring/persistent_tasks/shared/repository/TriggerDataRepository.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818
public interface TriggerDataRepository<T extends HasTriggerData> extends JpaRepository<T, Long> {
1919
@Query("""
2020
SELECT e FROM #{#entityName} e
21-
WHERE (e.data.key.id LIKE :id% OR :id = NULL)
22-
OR (e.data.key.taskName = :taskName OR :taskName = NULL)
21+
WHERE (e.data.key.id LIKE :id% OR :id IS NULL)
22+
AND (e.data.key.taskName = :taskName OR :taskName IS NULL)
2323
""")
2424
Page<T> findAll(@Param("id") String id,
2525
@Param("taskName") String taskName, Pageable page);

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/api/TriggerResource.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import java.time.OffsetDateTime;
44
import java.util.Optional;
55

6+
import org.apache.commons.lang3.StringUtils;
67
import org.springframework.data.domain.Pageable;
78
import org.springframework.data.domain.Sort.Direction;
89
import org.springframework.data.web.PageableDefault;
@@ -15,7 +16,6 @@
1516
import org.springframework.web.bind.annotation.RequestMapping;
1617
import org.springframework.web.bind.annotation.RequestParam;
1718
import org.springframework.web.bind.annotation.RestController;
18-
import org.sterl.spring.persistent_tasks.api.TaskId;
1919
import org.sterl.spring.persistent_tasks.api.Trigger;
2020
import org.sterl.spring.persistent_tasks.api.TriggerKey;
2121
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
@@ -37,12 +37,14 @@ public long count() {
3737

3838
@GetMapping("triggers")
3939
public PagedModel<Trigger> list(
40-
@RequestParam(name = "id", required = false) String taskId,
41-
@RequestParam(name = "taskName", required = false) String name,
40+
@RequestParam(name = "id", required = false) String id,
41+
@RequestParam(name = "taskName", required = false) String taskName,
4242
@PageableDefault(size = 100, direction = Direction.DESC, sort = "id")
4343
Pageable pageable) {
4444
return FromTriggerEntity.INSTANCE.toPage(
45-
triggerService.findAllTriggers(TriggerKey.of(taskId, name), pageable));
45+
triggerService.findAllTriggers(
46+
new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName)),
47+
pageable));
4648
}
4749

4850
@PostMapping("triggers/{taskName}/{id}/run-at")

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/component/ReadTriggerComponent.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public List<TriggerEntity> findTriggersLastPingAfter(OffsetDateTime dateTime) {
5454
public Page<TriggerEntity> listTriggers(TriggerKey key, Pageable page) {
5555
if (key == null) return triggerRepository.findAll(page);
5656
if (key.getId() == null) return listTriggers(key.toTaskId(), page);
57-
return listTriggers(key.toTaskId(), page);
57+
return triggerRepository.findAll(key.getId(), key.getTaskName(), page);
5858
}
5959

6060
public Page<TriggerEntity> listTriggers(TaskId<? extends Serializable> task, Pageable page) {

core/src/test/java/org/sterl/spring/persistent_tasks/trigger/api/TriggerResourceTest.java

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,28 @@ void testList() {
4949
assertThat(response.getBody()).contains(triggerKey.getTaskName());
5050
}
5151

52+
@Test
53+
void testSearchById() {
54+
// GIVEN
55+
var key1 = triggerService.queue(TaskTriggerBuilder
56+
.newTrigger("task1").build()).getKey();
57+
var key2 = triggerService.queue(TaskTriggerBuilder
58+
.newTrigger("task1").build()).getKey();
59+
60+
// WHEN
61+
var response = template.exchange(
62+
baseUrl + "?id=" + key1.getId().substring(0, 30),
63+
HttpMethod.GET,
64+
null,
65+
String.class);
66+
67+
// THEN
68+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
69+
assertThat(response.getBody()).isNotNull();
70+
assertThat(response.getBody()).contains(key1.getId());
71+
assertThat(response.getBody()).doesNotContain(key2.getId());
72+
}
73+
5274
@Test
5375
void testCancel() {
5476
// GIVEN

ui/src/history/history.page.tsx

Lines changed: 31 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,55 @@
1-
import { useEffect, useState } from "react";
2-
import { useServerObject } from "@src/shared/http-request";
31
import { PagedModel, Trigger } from "@src/server-api";
4-
import { Col, Row, Stack } from "react-bootstrap";
2+
import { useServerObject } from "@src/shared/http-request";
3+
import useAutoRefresh from "@src/shared/use-auto-refresh";
54
import HttpErrorView from "@src/shared/view/http-error.view";
65
import PageView from "@src/shared/view/page.view";
76
import ReloadButton from "@src/shared/view/reload-button.view";
87
import TriggerItemView from "@src/shared/view/trigger-list-item.view";
8+
import TaskSelect from "@src/task/view/task-select.view";
9+
import { useState } from "react";
10+
import { Col, Form, Row, Stack } from "react-bootstrap";
911

1012
const HistoryPage = () => {
1113
const [page, setPage] = useState(0);
14+
const [taskName, setTaskName] = useState("");
15+
const [id, setId] = useState("");
16+
1217
const triggers = useServerObject<PagedModel<Trigger>>(
1318
"/spring-tasks-api/history"
1419
);
1520

1621
const doReload = () => {
17-
triggers.doGet("?size=10&page=" + page);
22+
triggers.doGet(
23+
"?size=10&page=" + page + "&taskName=" + taskName + "&id=" + id
24+
);
1825
};
1926

20-
useEffect(doReload, [page]);
21-
useEffect(() => {
22-
const intervalId = setInterval(doReload, 10000);
23-
return () => clearInterval(intervalId);
24-
}, [page]);
27+
useAutoRefresh(10000, doReload, [page, taskName, id]);
2528

2629
return (
2730
<>
2831
<Stack gap={1}>
2932
<HttpErrorView error={triggers.error} />
30-
<Row className="align-items-center">
31-
<div></div>
33+
<Row>
34+
<Col>
35+
<Form.Control
36+
type="text"
37+
placeholder="Search..."
38+
onKeyUp={(e) =>
39+
e.key == "Enter"
40+
? setId(
41+
(e.target as HTMLInputElement).value
42+
)
43+
: null
44+
}
45+
/>
46+
</Col>
47+
</Row>
48+
<Row className="align-items-center mb-2">
3249
<Col>
50+
<TaskSelect onTaskChange={setTaskName} />
51+
</Col>
52+
<Col className="align-items-center">
3353
<PageView
3454
onPage={(p) => setPage(p)}
3555
data={triggers.data}

ui/src/trigger/triggers.page.tsx

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,49 @@
11
import { PagedModel, Trigger } from "@src/server-api";
2-
import HttpErrorView from "@src/shared/view/http-error.view";
32
import { useServerObject } from "@src/shared/http-request";
3+
import useAutoRefresh from "@src/shared/use-auto-refresh";
4+
import HttpErrorView from "@src/shared/view/http-error.view";
45
import PageView from "@src/shared/view/page.view";
56
import ReloadButton from "@src/shared/view/reload-button.view";
6-
import useAutoRefresh from "@src/shared/use-auto-refresh";
77
import TaskSelect from "@src/task/view/task-select.view";
88
import { useState } from "react";
9-
import { Col, Row, Stack } from "react-bootstrap";
9+
import { Col, Form, Row, Stack } from "react-bootstrap";
1010
import TriggerItemView from "../shared/view/trigger-list-item.view";
1111

1212
const TriggersPage = () => {
1313
const [page, setPage] = useState(0);
14-
const [selectedTask, setSelectedTask] = useState("");
14+
const [taskName, setTaskName] = useState("");
15+
const [id, setId] = useState("");
1516
const triggers = useServerObject<PagedModel<Trigger>>(
1617
"/spring-tasks-api/triggers"
1718
);
1819

1920
const doReload = () => {
20-
triggers.doGet("?size=10&page=" + page + "&taskId=" + selectedTask);
21+
triggers.doGet(
22+
"?size=10&page=" + page + "&taskName=" + taskName + "&id=" + id
23+
);
2124
};
2225

23-
useAutoRefresh(10000, doReload, [page, selectedTask]);
26+
useAutoRefresh(10000, doReload, [page, taskName, id]);
2427

2528
return (
2629
<Stack gap={1}>
2730
<HttpErrorView error={triggers.error} />
31+
<Row>
32+
<Col>
33+
<Form.Control
34+
type="text"
35+
placeholder="Search..."
36+
onKeyUp={(e) =>
37+
e.key == "Enter"
38+
? setId((e.target as HTMLInputElement).value)
39+
: null
40+
}
41+
/>
42+
</Col>
43+
</Row>
2844
<Row className="align-items-center mb-2">
2945
<Col>
30-
<TaskSelect onTaskChange={setSelectedTask} />
46+
<TaskSelect onTaskChange={setTaskName} />
3147
</Col>
3248
<Col className="align-items-center">
3349
<PageView onPage={(p) => setPage(p)} data={triggers.data} />

0 commit comments

Comments
 (0)