Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
@@ -1,14 +1,20 @@
|
||||
package ch.unisg.tapastasks;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.adapter.out.persistence.mongodb.TaskRepository;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableMongoRepositories(basePackageClasses = TaskRepository.class)
|
||||
public class TapasTasksApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication tapasTasksApp = new SpringApplication(TapasTasksApplication.class);
|
||||
tapasTasksApp.run(args);
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -0,0 +1,32 @@
|
||||
package ch.unisg.tapastasks.tasks.adapter.out.persistence.mongodb;
|
||||
|
||||
import lombok.Data;
|
||||
import org.springframework.data.annotation.Id;
|
||||
import org.springframework.data.mongodb.core.mapping.Document;
|
||||
|
||||
@Data
|
||||
@Document(collection = "tasks")
|
||||
public class MongoTaskDocument {
|
||||
|
||||
@Id
|
||||
public String taskId;
|
||||
|
||||
public String taskName;
|
||||
public String taskType;
|
||||
public String originalTaskUri;
|
||||
public String taskStatus;
|
||||
public String taskListName;
|
||||
|
||||
|
||||
public MongoTaskDocument(String taskId, String taskName, String taskType,
|
||||
String originalTaskUri,
|
||||
String taskStatus, String taskListName) {
|
||||
|
||||
this.taskId = taskId;
|
||||
this.taskName = taskName;
|
||||
this.taskType = taskType;
|
||||
this.originalTaskUri = originalTaskUri;
|
||||
this.taskStatus = taskStatus;
|
||||
this.taskListName = taskListName;
|
||||
}
|
||||
}
|
@@ -0,0 +1,30 @@
|
||||
package ch.unisg.tapastasks.tasks.adapter.out.persistence.mongodb;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.domain.Task;
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
class TaskMapper {
|
||||
|
||||
Task mapToDomainEntity(MongoTaskDocument task) {
|
||||
return Task.withIdNameTypeOriginaluriStatus(
|
||||
new Task.TaskId(task.taskId),
|
||||
new Task.TaskName(task.taskName),
|
||||
new Task.TaskType(task.taskType),
|
||||
new Task.OriginalTaskUri(task.originalTaskUri),
|
||||
new Task.TaskStatus(Task.Status.valueOf(task.taskStatus))
|
||||
);
|
||||
}
|
||||
|
||||
MongoTaskDocument mapToMongoDocument(Task task) {
|
||||
return new MongoTaskDocument(
|
||||
task.getTaskId().getValue(),
|
||||
task.getTaskName().getValue(),
|
||||
task.getTaskType().getValue(),
|
||||
task.getOriginalTaskUri().getValue(),
|
||||
task.getTaskStatus().getValue().toString(),
|
||||
TaskList.getTapasTaskList().getTaskListName().getValue()
|
||||
);
|
||||
}
|
||||
}
|
@@ -0,0 +1,34 @@
|
||||
package ch.unisg.tapastasks.tasks.adapter.out.persistence.mongodb;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.AddTaskPort;
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.LoadTaskPort;
|
||||
import ch.unisg.tapastasks.tasks.domain.Task;
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
@RequiredArgsConstructor
|
||||
public class TaskPersistenceAdapter implements
|
||||
AddTaskPort,
|
||||
LoadTaskPort {
|
||||
|
||||
@Autowired
|
||||
private final TaskRepository taskRepository;
|
||||
|
||||
private final TaskMapper taskMapper;
|
||||
|
||||
@Override
|
||||
public void addTask(Task task) {
|
||||
MongoTaskDocument mongoTaskDocument = taskMapper.mapToMongoDocument(task);
|
||||
taskRepository.save(mongoTaskDocument);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Task loadTask(Task.TaskId taskId, TaskList.TaskListName taskListName) {
|
||||
MongoTaskDocument mongoTaskDocument = taskRepository.findByTaskId(taskId.getValue(),taskListName.getValue());
|
||||
Task task = taskMapper.mapToDomainEntity(mongoTaskDocument);
|
||||
return task;
|
||||
}
|
||||
}
|
@@ -0,0 +1,14 @@
|
||||
package ch.unisg.tapastasks.tasks.adapter.out.persistence.mongodb;
|
||||
|
||||
import org.springframework.data.mongodb.repository.MongoRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@Repository
|
||||
public interface TaskRepository extends MongoRepository<MongoTaskDocument,String> {
|
||||
|
||||
public MongoTaskDocument findByTaskId(String taskId, String taskListName);
|
||||
|
||||
public List<MongoTaskDocument> findByTaskListName(String taskListName);
|
||||
}
|
@@ -0,0 +1,9 @@
|
||||
package ch.unisg.tapastasks.tasks.application.port.out;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.domain.Task;
|
||||
|
||||
public interface AddTaskPort {
|
||||
|
||||
void addTask(Task task);
|
||||
|
||||
}
|
@@ -0,0 +1,10 @@
|
||||
package ch.unisg.tapastasks.tasks.application.port.out;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.domain.Task;
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
|
||||
public interface LoadTaskPort {
|
||||
|
||||
Task loadTask(Task.TaskId taskId, TaskList.TaskListName taskListName);
|
||||
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
package ch.unisg.tapastasks.tasks.application.port.out;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
|
||||
public interface TaskListLock {
|
||||
|
||||
void lockTaskList(TaskList.TaskListName taskListName);
|
||||
|
||||
void releaseTaskList(TaskList.TaskListName taskListName);
|
||||
|
||||
}
|
@@ -2,26 +2,35 @@ package ch.unisg.tapastasks.tasks.application.service;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.application.port.in.AddNewTaskToTaskListCommand;
|
||||
import ch.unisg.tapastasks.tasks.application.port.in.AddNewTaskToTaskListUseCase;
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.AddTaskPort;
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.NewTaskAddedEventPort;
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.TaskListLock;
|
||||
import ch.unisg.tapastasks.tasks.domain.Task;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.domain.NewTaskAddedEvent;
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.transaction.Transactional;
|
||||
|
||||
@RequiredArgsConstructor
|
||||
@Component
|
||||
@Transactional
|
||||
@Service("AddNewTaskToTaskList")
|
||||
public class AddNewTaskToTaskListService implements AddNewTaskToTaskListUseCase {
|
||||
|
||||
private final NewTaskAddedEventPort newTaskAddedEventPort;
|
||||
private final AddTaskPort addTaskToRepositoryPort;
|
||||
private final TaskListLock taskListLock;
|
||||
|
||||
@Override
|
||||
public Task addNewTaskToTaskList(AddNewTaskToTaskListCommand command) {
|
||||
TaskList taskList = TaskList.getTapasTaskList();
|
||||
|
||||
taskListLock.lockTaskList(taskList.getTaskListName());
|
||||
|
||||
Task newTask;
|
||||
|
||||
if (command.getOriginalTaskUri().isPresent() && command.getInputData().isPresent()) {
|
||||
@@ -37,6 +46,9 @@ public class AddNewTaskToTaskListService implements AddNewTaskToTaskListUseCase
|
||||
newTask = taskList.addNewTaskWithNameAndType(command.getTaskName(), command.getTaskType());
|
||||
}
|
||||
|
||||
addTaskToRepositoryPort.addTask(newTask);
|
||||
taskListLock.releaseTaskList(taskList.getTaskListName());
|
||||
|
||||
//Here we are using the application service to emit the domain event to the outside of the bounded context.
|
||||
//This event should be considered as a light-weight "integration event" to communicate with other services.
|
||||
//Domain events are usually rather "fat". In our implementation we simplify at this point. In general, it is
|
||||
|
@@ -0,0 +1,18 @@
|
||||
package ch.unisg.tapastasks.tasks.application.service;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.TaskListLock;
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
@Component
|
||||
public class NoOpTaskListLock implements TaskListLock {
|
||||
@Override
|
||||
public void lockTaskList(TaskList.TaskListName taskListName) {
|
||||
//do nothing
|
||||
}
|
||||
|
||||
@Override
|
||||
public void releaseTaskList(TaskList.TaskListName taskListName) {
|
||||
//do nothing
|
||||
}
|
||||
}
|
@@ -2,10 +2,12 @@ package ch.unisg.tapastasks.tasks.application.service;
|
||||
|
||||
import ch.unisg.tapastasks.tasks.application.port.in.RetrieveTaskFromTaskListQuery;
|
||||
import ch.unisg.tapastasks.tasks.application.port.in.RetrieveTaskFromTaskListUseCase;
|
||||
import ch.unisg.tapastasks.tasks.application.port.out.LoadTaskPort;
|
||||
import ch.unisg.tapastasks.tasks.domain.Task;
|
||||
import ch.unisg.tapastasks.tasks.domain.TaskList;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springframework.stereotype.Component;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.transaction.Transactional;
|
||||
import java.util.Optional;
|
||||
@@ -13,10 +15,19 @@ import java.util.Optional;
|
||||
@RequiredArgsConstructor
|
||||
@Component
|
||||
@Transactional
|
||||
@Service("RetrieveTaskFromTaskList")
|
||||
public class RetrieveTaskFromTaskListService implements RetrieveTaskFromTaskListUseCase {
|
||||
|
||||
private final LoadTaskPort loadTaskFromRepositoryPort;
|
||||
|
||||
@Override
|
||||
public Optional<Task> retrieveTaskFromTaskList(RetrieveTaskFromTaskListQuery query) {
|
||||
TaskList taskList = TaskList.getTapasTaskList();
|
||||
return taskList.retrieveTaskById(query.getTaskId());
|
||||
|
||||
Optional<Task> task = taskList.retrieveTaskById(query.getTaskId());
|
||||
|
||||
Optional<Task> taskFromRepo = Optional.ofNullable(loadTaskFromRepositoryPort.loadTask(query.getTaskId(), taskList.getTaskListName()));
|
||||
|
||||
return taskFromRepo;
|
||||
}
|
||||
}
|
||||
|
@@ -80,11 +80,22 @@ public class Task {
|
||||
this.outputData = null;
|
||||
}
|
||||
|
||||
public Task(TaskId taskId, TaskName taskName, TaskType taskType, OriginalTaskUri taskUri,
|
||||
TaskStatus taskStatus) {
|
||||
this.taskId = taskId;
|
||||
this.taskName = taskName;
|
||||
this.taskType = taskType;
|
||||
this.originalTaskUri = taskUri;
|
||||
this.taskStatus = taskStatus;
|
||||
this.inputData = null;
|
||||
this.outputData = null;
|
||||
}
|
||||
protected static Task createTaskWithNameAndType(TaskName name, TaskType type) {
|
||||
return new Task(name, type);
|
||||
|
||||
}
|
||||
|
||||
protected static Task createTaskWithNameAndTypeAndOriginalTaskUri(TaskName name, TaskType type,
|
||||
public static Task createTaskWithNameAndTypeAndOriginalTaskUri(TaskName name, TaskType type,
|
||||
OriginalTaskUri originalTaskUri) {
|
||||
return new Task(name, type, originalTaskUri);
|
||||
}
|
||||
@@ -99,6 +110,13 @@ public class Task {
|
||||
return new Task(name, type, originalTaskUri, inputData);
|
||||
}
|
||||
|
||||
public static Task withIdNameTypeOriginaluriStatus(TaskId taskId, TaskName taskName,
|
||||
TaskType taskType,
|
||||
OriginalTaskUri originalTaskUri,
|
||||
TaskStatus taskStatus) {
|
||||
return new Task(taskId, taskName, taskType, originalTaskUri, taskStatus);
|
||||
}
|
||||
|
||||
@Value
|
||||
public static class TaskId {
|
||||
String value;
|
||||
|
@@ -1,3 +1,40 @@
|
||||
server.port=8081
|
||||
spring.data.mongodb.uri=mongodb://127.0.0.1:27017
|
||||
#spring.data.mongodb.uri=mongodb://root:8nP7s0a@mongodb:27017/
|
||||
spring.data.mongodb.database=tapas-tasks
|
||||
baseuri=https://tapas-tasks.86-119-34-23.nip.io/
|
||||
|
||||
roster.uri=http://127.0.0.1:8082
|
||||
|
||||
spring.profiles.active=chaos-monkey
|
||||
chaos.monkey.enabled=true
|
||||
management.endpoint.chaosmonkey.enabled=true
|
||||
management.endpoint.chaosmonkeyjmx.enabled=true
|
||||
# include specific endpoints
|
||||
management.endpoints.web.exposure.include=health,info,chaosmonkey
|
||||
chaos.monkey.watcher.controller=true
|
||||
chaos.monkey.watcher.restController=true
|
||||
chaos.monkey.watcher.service=true
|
||||
chaos.monkey.watcher.repository=true
|
||||
chaos.monkey.watcher.component=true
|
||||
|
||||
#Chaos Monkey configs taken from here: https://www.baeldung.com/spring-boot-chaos-monkey
|
||||
|
||||
#Latency Assault
|
||||
#chaos.monkey.assaults.latencyActive=true
|
||||
#chaos.monkey.assaults.latencyRangeStart=3000
|
||||
#chaos.monkey.assaults.latencyRangeEnd=15000
|
||||
|
||||
#Exception Assault
|
||||
#chaos.monkey.assaults.latencyActive=false
|
||||
#chaos.monkey.assaults.exceptionsActive=true
|
||||
#chaos.monkey.assaults.killApplicationActive=false
|
||||
|
||||
#AppKiller Assault
|
||||
#chaos.monkey.assaults.latencyActive=false
|
||||
#chaos.monkey.assaults.exceptionsActive=false
|
||||
#chaos.monkey.assaults.killApplicationActive=true
|
||||
|
||||
#Chaos Monkey assaults via REST to endpoint /actuator/chaosmonkey/assaults/
|
||||
#https://softwarehut.com/blog/tech/chaos-monkey
|
||||
#https://codecentric.github.io/chaos-monkey-spring-boot/latest/
|
||||
|
Reference in New Issue
Block a user