Skip to content

Commit 6f9ee76

Browse files
authored
Filter by status for trigger and history (#8)
* added filter by status * filter trigger by status * filter added to history page
1 parent 339090d commit 6f9ee76

File tree

18 files changed

+251
-84
lines changed

18 files changed

+251
-84
lines changed

CHANGELOG.md

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

3+
## v1.5.1 - (2025-01-12)
4+
5+
- filter trigger by status
6+
- filter history by status
7+
38
## v1.5.0 - (2025-01-11)
49

510
- Adjusted transaction handling for trigger life cycle events

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

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,15 @@ public long countTriggers(TriggerKey key) {
9696
* @return the found data, looking only the last states
9797
*/
9898
public Page<TriggerHistoryLastStateEntity> findTriggerState(
99-
@Nullable TriggerKey key, Pageable page) {
100-
99+
@Nullable TriggerKey key, @Nullable TriggerStatus status, Pageable page) {
100+
101101
page = applyDefaultSortIfNeeded(page);
102-
if (key == null) return triggerHistoryLastStateRepository.findAll(page);
103-
if (key.getId() == null && key.getTaskName() == null) return triggerHistoryLastStateRepository.findAll(page);
104-
if (key.getId() == null && key.getTaskName() != null) {
105-
return triggerHistoryLastStateRepository.findAll(key.getTaskName(), page);
102+
if (key == null && status == null) {
103+
return triggerHistoryLastStateRepository.findAll(page);
106104
}
107-
return triggerHistoryLastStateRepository.findAll(
108-
key.getId(),
109-
key.getTaskName(),
110-
page);
105+
final var id = key == null ? null : key.getId();
106+
final var name = key == null ? null : key.getTaskName();
107+
return triggerHistoryLastStateRepository.findAll(id, name, status, page);
111108
}
112109

113110
private Pageable applyDefaultSortIfNeeded(Pageable page) {

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.sterl.spring.persistent_tasks.api.TaskStatusHistoryOverview;
1515
import org.sterl.spring.persistent_tasks.api.Trigger;
1616
import org.sterl.spring.persistent_tasks.api.TriggerKey;
17+
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
1718
import org.sterl.spring.persistent_tasks.history.HistoryService;
1819
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromLastTriggerStateEntity;
1920
import org.sterl.spring.persistent_tasks.history.api.HistoryConverter.FromTriggerStateDetailEntity;
@@ -41,11 +42,11 @@ public List<TaskStatusHistoryOverview> taskStatusHistory() {
4142
public PagedModel<Trigger> list(
4243
@RequestParam(name = "id", required = false) String id,
4344
@RequestParam(name = "taskName", required = false) String taskName,
44-
@PageableDefault(size = 100) Pageable pageable) {
45+
@RequestParam(name = "status", required = false) TriggerStatus status,
46+
@PageableDefault(size = 100) Pageable page) {
4547

48+
var key = new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName));
4649
return FromLastTriggerStateEntity.INSTANCE.toPage( //
47-
historyService.findTriggerState(
48-
new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName)),
49-
pageable));
50+
historyService.findTriggerState(key, status, page));
5051
}
5152
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ public interface TriggerDataRepository<T extends HasTriggerData> extends JpaRepo
2020
SELECT e FROM #{#entityName} e
2121
WHERE (e.data.key.id LIKE :id% OR :id IS NULL)
2222
AND (e.data.key.taskName = :taskName OR :taskName IS NULL)
23+
AND (e.data.status = :status OR :status IS NULL)
2324
""")
2425
Page<T> findAll(@Param("id") String id,
25-
@Param("taskName") String taskName, Pageable page);
26+
@Param("taskName") String taskName,
27+
@Param("status") TriggerStatus status,
28+
Pageable page);
2629

2730
@Query("""
2831
SELECT e FROM #{#entityName} e

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/TriggerService.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,9 @@ public Optional<TriggerEntity> get(TriggerKey triggerKey) {
9494
}
9595

9696
@Transactional(readOnly = true , timeout = 10)
97-
public Page<TriggerEntity> findAllTriggers(TriggerKey key, Pageable page) {
98-
return this.readTrigger.listTriggers(key, page);
97+
public Page<TriggerEntity> findAllTriggers(
98+
@Nullable TriggerKey key, @Nullable TriggerStatus status, Pageable page) {
99+
return this.readTrigger.listTriggers(key, status, page);
99100
}
100101

101102
@Transactional(readOnly = true , timeout = 10)

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.springframework.web.bind.annotation.RestController;
1919
import org.sterl.spring.persistent_tasks.api.Trigger;
2020
import org.sterl.spring.persistent_tasks.api.TriggerKey;
21+
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
2122
import org.sterl.spring.persistent_tasks.trigger.TriggerService;
2223
import org.sterl.spring.persistent_tasks.trigger.api.TriggerConverter.FromTriggerEntity;
2324

@@ -39,12 +40,12 @@ public long count() {
3940
public PagedModel<Trigger> list(
4041
@RequestParam(name = "id", required = false) String id,
4142
@RequestParam(name = "taskName", required = false) String taskName,
43+
@RequestParam(name = "status", required = false) TriggerStatus status,
4244
@PageableDefault(size = 100, direction = Direction.ASC, sort = "data.runAt")
4345
Pageable pageable) {
46+
var key = new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName));
4447
return FromTriggerEntity.INSTANCE.toPage(
45-
triggerService.findAllTriggers(
46-
new TriggerKey(StringUtils.trimToNull(id), StringUtils.trimToNull(taskName)),
47-
pageable));
48+
triggerService.findAllTriggers(key, status, pageable));
4849
}
4950

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

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,12 @@ public List<TriggerEntity> findTriggersLastPingAfter(OffsetDateTime dateTime) {
5050
return triggerRepository.findTriggersLastPingAfter(dateTime);
5151
}
5252

53-
public Page<TriggerEntity> listTriggers(TriggerKey key, Pageable page) {
54-
if (key == null) return triggerRepository.findAll(page);
55-
if (key.getId() == null) return listTriggers(key.toTaskId(), page);
56-
return triggerRepository.findAll(key.getId(), key.getTaskName(), page);
53+
public Page<TriggerEntity> listTriggers(@Nullable TriggerKey key,
54+
@Nullable TriggerStatus status, Pageable page) {
55+
if (key == null && status == null) return triggerRepository.findAll(page);
56+
final var id = key == null ? null : key.getId();
57+
final var name = key == null ? null : key.getTaskName();
58+
return triggerRepository.findAll(id, name, status, page);
5759
}
5860

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

core/src/main/java/org/sterl/spring/persistent_tasks/trigger/model/TriggerEntity.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,7 @@ public TriggerEntity complete(Exception e) {
104104
public TriggerEntity runAt(OffsetDateTime runAt) {
105105
data.setStatus(TriggerStatus.WAITING);
106106
data.setRunAt(runAt);
107+
setRunningOn(null);
107108
return this;
108109
}
109110

core/src/test/java/org/sterl/spring/persistent_tasks/scheduler/SchedulerServiceTransactionTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,8 @@ void test_fail_in_transaction() throws Exception {
161161
// AND
162162
var data = persistentTaskService.getLastDetailData(trigger.key());
163163
assertThat(data.get().getStatus()).isEqualTo(TriggerStatus.FAILED);
164+
assertThat(triggerService.get(trigger.getKey()).get().getRunningOn()).isNull();
165+
assertThat(triggerService.get(trigger.getKey()).get().status()).isEqualTo(TriggerStatus.WAITING);
164166
// AND
165167
var history = historyService.findAllDetailsForKey(trigger.key()).getContent();
166168
assertThat(history.get(0).getData().getStatus()).isEqualTo(TriggerStatus.FAILED);

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

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

88
import org.junit.jupiter.api.BeforeEach;
99
import org.junit.jupiter.api.Test;
10+
import org.springframework.beans.factory.annotation.Autowired;
1011
import org.springframework.boot.test.web.server.LocalServerPort;
1112
import org.springframework.http.HttpEntity;
1213
import org.springframework.http.HttpMethod;
@@ -16,12 +17,18 @@
1617
import org.sterl.spring.persistent_tasks.AbstractSpringTest.TaskConfig.Task3;
1718
import org.sterl.spring.persistent_tasks.api.TaskId.TaskTriggerBuilder;
1819
import org.sterl.spring.persistent_tasks.api.Trigger;
20+
import org.sterl.spring.persistent_tasks.api.TriggerKey;
1921
import org.sterl.spring.persistent_tasks.api.TriggerStatus;
22+
import org.sterl.spring.persistent_tasks.shared.model.TriggerData;
23+
import org.sterl.spring.persistent_tasks.trigger.model.TriggerEntity;
24+
import org.sterl.spring.persistent_tasks.trigger.repository.TriggerRepository;
2025

2126
class TriggerResourceTest extends AbstractSpringTest {
2227

2328
@LocalServerPort
2429
private int port;
30+
@Autowired
31+
private TriggerRepository triggerRepository;
2532
private String baseUrl;
2633
private final RestTemplate template = new RestTemplate();
2734

@@ -33,7 +40,8 @@ void setupRest() {
3340
@Test
3441
void testList() {
3542
// GIVEN
36-
var triggerKey = triggerService.queue(TaskTriggerBuilder.newTrigger("task1").build()).getKey();
43+
var k1 = createStatus(new TriggerKey("1-foo", "foo"), TriggerStatus.WAITING).getKey();
44+
var k2 = createStatus(new TriggerKey("2-foo", "bar"), TriggerStatus.WAITING).getKey();
3745

3846
// WHEN
3947
var response = template.exchange(
@@ -45,8 +53,11 @@ void testList() {
4553
// THEN
4654
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
4755
assertThat(response.getBody()).isNotNull();
48-
assertThat(response.getBody()).contains(triggerKey.getId());
49-
assertThat(response.getBody()).contains(triggerKey.getTaskName());
56+
assertThat(response.getBody()).contains(k1.getId());
57+
assertThat(response.getBody()).contains(k1.getTaskName());
58+
// AND
59+
assertThat(response.getBody()).contains(k2.getId());
60+
assertThat(response.getBody()).contains(k2.getTaskName());
5061
}
5162

5263
@Test
@@ -71,6 +82,26 @@ void testSearchById() {
7182
assertThat(response.getBody()).doesNotContain(key2.getId());
7283
}
7384

85+
@Test
86+
void testSearchByStatus() {
87+
// GIVEN
88+
var k1 = createStatus(new TriggerKey("1-foo", "foo"), TriggerStatus.WAITING).getKey();
89+
var k2 = createStatus(new TriggerKey("2-foo", "bar"), TriggerStatus.RUNNING).getKey();
90+
91+
// WHEN
92+
var response = template.exchange(
93+
baseUrl + "?status=" + TriggerStatus.RUNNING,
94+
HttpMethod.GET,
95+
null,
96+
String.class);
97+
98+
// THEN
99+
assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK);
100+
assertThat(response.getBody()).isNotNull();
101+
assertThat(response.getBody()).contains(k2.getId());
102+
assertThat(response.getBody()).doesNotContain(k1.getId());
103+
}
104+
74105
@Test
75106
void testCancel() {
76107
// GIVEN
@@ -115,5 +146,25 @@ void testUpdateRunAt() {
115146
assertThat(triggerService.countTriggers(TriggerStatus.WAITING)).isOne();
116147
assertThat(response.getBody().getKey()).isEqualTo(triggerKey);
117148
}
149+
150+
151+
private TriggerEntity createStatus(TriggerKey key, TriggerStatus status) {
152+
final var now = OffsetDateTime.now();
153+
final var isCancel = status == TriggerStatus.CANCELED;
154+
155+
TriggerEntity result = new TriggerEntity();
156+
result.setData(TriggerData
157+
.builder()
158+
.start(isCancel ? null : now.minusMinutes(1))
159+
.end(isCancel ? null : now)
160+
.createdTime(now)
161+
.key(key)
162+
.status(status)
163+
.runningDurationInMs(isCancel ? null : 600L)
164+
.build()
165+
);
166+
167+
return triggerRepository.save(result);
168+
}
118169

119170
}

0 commit comments

Comments
 (0)