Skip to content

Commit fe9a3cf

Browse files
committed
add event-driven architecture
1 parent c322514 commit fe9a3cf

6 files changed

Lines changed: 126 additions & 1 deletion

File tree

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.taskmanagerapi.event;
2+
3+
import org.springframework.context.ApplicationEvent;
4+
5+
public class TaskCompletedEvent extends ApplicationEvent {
6+
7+
private String id;
8+
private String name;
9+
10+
public TaskCompletedEvent(Object source, String id, String name) {
11+
super(source);
12+
this.id = id;
13+
this.name = name;
14+
}
15+
16+
public String getId() {
17+
return id;
18+
}
19+
20+
public String getName() {
21+
return name;
22+
}
23+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.taskmanagerapi.event;
2+
3+
import org.springframework.context.ApplicationEvent;
4+
5+
public class TaskCreatedEvent extends ApplicationEvent {
6+
7+
private String id;
8+
private String name;
9+
10+
public TaskCreatedEvent(Object source, String id, String name) {
11+
super(source);
12+
this.id = id;
13+
this.name = name;
14+
}
15+
16+
public String getId() {
17+
return id;
18+
}
19+
20+
public String getName() {
21+
return name;
22+
}
23+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.taskmanagerapi.event;
2+
3+
import org.springframework.context.ApplicationEvent;
4+
5+
public class TaskDeletedEvent extends ApplicationEvent {
6+
7+
private String id;
8+
9+
public TaskDeletedEvent(Object source, String id) {
10+
super(source);
11+
this.id = id;
12+
}
13+
14+
public String getId() {
15+
return id;
16+
}
17+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.taskmanagerapi.listener;
2+
3+
import com.taskmanagerapi.event.TaskCompletedEvent;
4+
import com.taskmanagerapi.event.TaskCreatedEvent;
5+
import com.taskmanagerapi.event.TaskDeletedEvent;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
import org.springframework.context.event.EventListener;
9+
import org.springframework.stereotype.Component;
10+
11+
@Component
12+
public class TaskEventListener {
13+
14+
private static final Logger log = LoggerFactory.getLogger(TaskEventListener.class);
15+
16+
@EventListener
17+
public void onTaskCreated(TaskCreatedEvent event) {
18+
log.info("Task created: id={}, name={}",
19+
event.getId(), event.getName());
20+
}
21+
22+
@EventListener
23+
public void onTaskCompleted(TaskCompletedEvent event) {
24+
log.info("Task completed: id={}, name={}",
25+
event.getId(), event.getName());
26+
}
27+
28+
@EventListener
29+
public void onTaskDeleted(TaskDeletedEvent event) {
30+
log.info("Task deleted: id={}", event.getId());
31+
}
32+
}

src/main/java/com/taskmanagerapi/service/TaskService.java

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package com.taskmanagerapi.service;
22

33
import com.taskmanagerapi.dto.TaskResponse;
4+
import com.taskmanagerapi.event.TaskCompletedEvent;
5+
import com.taskmanagerapi.event.TaskCreatedEvent;
6+
import com.taskmanagerapi.event.TaskDeletedEvent;
47
import com.taskmanagerapi.exception.TaskNotFoundException;
58
import com.taskmanagerapi.model.Task;
69
import com.taskmanagerapi.model.TaskStatus;
710
import com.taskmanagerapi.repository.TaskRepository;
811
import org.slf4j.Logger;
912
import org.slf4j.LoggerFactory;
13+
import org.springframework.context.ApplicationEventPublisher;
1014
import org.springframework.stereotype.Service;
1115
import org.springframework.transaction.annotation.Transactional;
1216

@@ -20,14 +24,23 @@ public class TaskService {
2024
private static final Logger log = LoggerFactory.getLogger(TaskService.class);
2125

2226
private final TaskRepository taskRepository;
27+
private final ApplicationEventPublisher eventPublisher;
2328

24-
public TaskService(TaskRepository taskRepository) {
29+
public TaskService(TaskRepository taskRepository, ApplicationEventPublisher eventPublisher) {
2530
this.taskRepository = taskRepository;
31+
this.eventPublisher = eventPublisher;
2632
}
2733

2834
public TaskResponse addTask(String name, String description) {
2935
Task task = new Task(name, description);
3036
TaskResponse response = TaskResponse.from(taskRepository.save(task));
37+
eventPublisher.publishEvent(
38+
new TaskCreatedEvent(
39+
this,
40+
task.getId(),
41+
task.getName()
42+
)
43+
);
3144
log.info("Task created: id={}, name={}", response.getId(), response.getName());
3245
return response;
3346
}
@@ -66,6 +79,13 @@ public TaskResponse completeTask(String id) {
6679
.orElseThrow(() -> new TaskNotFoundException(id));
6780
task.setStatus(DONE);
6881
log.info("Task completed: id={}", id);
82+
eventPublisher.publishEvent(
83+
new TaskCompletedEvent(
84+
this,
85+
task.getId(),
86+
task.getName()
87+
)
88+
);
6989
return TaskResponse.from(task);
7090
}
7191

@@ -75,6 +95,12 @@ public TaskResponse deleteTask(String id) {
7595
.orElseThrow(() -> new TaskNotFoundException(id));
7696
task.setStatus(DELETED);
7797
log.info("Task deleted: id={}", id);
98+
eventPublisher.publishEvent(
99+
new TaskDeletedEvent(
100+
this,
101+
task.getId()
102+
)
103+
);
78104
return TaskResponse.from(task);
79105
}
80106

src/test/java/com/taskmanagerapi/TaskServiceTest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.mockito.InjectMocks;
1212
import org.mockito.Mock;
1313
import org.mockito.junit.jupiter.MockitoExtension;
14+
import org.springframework.context.ApplicationEventPublisher;
1415

1516
import java.util.List;
1617
import java.util.Optional;
@@ -24,6 +25,9 @@ class TaskServiceTest {
2425
@Mock
2526
private TaskRepository taskRepository;
2627

28+
@Mock
29+
private ApplicationEventPublisher eventPublisher;
30+
2731
@InjectMocks
2832
private TaskService taskService;
2933

0 commit comments

Comments
 (0)