introduced ModuleRegistry to easy inter-module dependencies

This commit is contained in:
2025-08-09 13:43:10 +02:00
parent 1d569b4962
commit 8fb94fea4b
25 changed files with 343 additions and 255 deletions

View File

@@ -20,6 +20,7 @@ import de.srsoftware.configuration.Configuration;
import de.srsoftware.tools.Path;
import de.srsoftware.tools.SessionToken;
import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.ModuleRegistry;
import de.srsoftware.umbrella.core.api.*;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*;
@@ -34,41 +35,28 @@ import org.json.JSONObject;
public class TaskModule extends BaseHandler implements TaskService {
private final TaskDb taskDb;
private final ProjectService projects;
private final UserService users;
private final CompanyService companies;
private final TagService tags;
private final NoteService notes;
private final ModuleRegistry registry;
public TaskModule(Configuration config, ProjectService projectService, TagService tagService, NoteService noteService) throws UmbrellaException {
public TaskModule(ModuleRegistry registry, Configuration config) throws UmbrellaException {
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE));
taskDb = new SqliteDb(connect(dbFile));
projects = projectService;
companies = projectService.companyService();
notes = noteService;
tags = tagService;
users = companies.userService();
this.registry = registry.add(this);
}
private void addMember(Task task, long userId) {
var user = users.loadUser(userId);
var user = registry.userService().loadUser(userId);
var member = new Member(user,READ_ONLY);
task.members().put(userId,member);
task.dirty(MEMBERS);
}
@Override
public CompanyService companyService() {
return companies;
}
private boolean deleteTask(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException {
var task = loadMembers(taskDb.load(taskId));
var member = task.members().get(user.id());
if (member == null || !member.mayWrite()) throw forbidden("You are not allowed to delete {0}",task.name());
taskDb.delete(task);
notes.deleteEntity(TASK,taskId);
tags.deleteEntity(TASK,taskId);
registry.noteService().deleteEntity(TASK,taskId);
registry.tagService().deleteEntity(TASK,taskId);
return sendContent(ex,Map.of(DELETED,taskId));
}
@@ -77,7 +65,7 @@ public class TaskModule extends BaseHandler implements TaskService {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registry.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -97,7 +85,7 @@ public class TaskModule extends BaseHandler implements TaskService {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registry.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -119,7 +107,7 @@ public class TaskModule extends BaseHandler implements TaskService {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registry.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -140,7 +128,7 @@ public class TaskModule extends BaseHandler implements TaskService {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registry.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -164,9 +152,9 @@ public class TaskModule extends BaseHandler implements TaskService {
var json = json(ex);
if (!(json.has(COMPANY_ID) && json.get(COMPANY_ID) instanceof Number cid)) throw missingFieldException(COMPANY_ID);
var companyId = cid.longValue();
var company = companies.get(companyId);
if (!companies.membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name());
var projectMap = this.projects.listCompanyProjects(companyId,false);
var company = registry.companyService().get(companyId);
if (!registry.companyService().membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name());
var projectMap = registry.projectService().listCompanyProjects(companyId,false);
var taskMap = taskDb.listTasks(projectMap.keySet());
var taskTree = new HashMap<Long,Map<String,Object>>();
taskMap.values().stream().filter(task -> !is0(task.estimatedTime())).forEach(task -> placeInTree(task,taskTree,taskMap));
@@ -201,7 +189,7 @@ public class TaskModule extends BaseHandler implements TaskService {
@Override
public HashMap<Long, Task> listCompanyTasks(long companyId) throws UmbrellaException {
var projectList = projects.listCompanyProjects(companyId,false);
var projectList = registry.projectService().listCompanyProjects(companyId,false);
return taskDb.listTasks(projectList.keySet());
}
@@ -217,7 +205,7 @@ public class TaskModule extends BaseHandler implements TaskService {
for (var entry : taskDb.getMembers(task).entrySet()){
var userId = entry.getKey();
var permission = entry.getValue();
var user = userMap.computeIfAbsent(userId,k -> users.loadUser(userId));
var user = userMap.computeIfAbsent(userId,k -> registry.userService().loadUser(userId));
task.members().put(userId,new Member(user,permission));
}
}
@@ -262,7 +250,7 @@ public class TaskModule extends BaseHandler implements TaskService {
if (member.permission() == ASSIGNEE) members.put(member.user().id(),new Member(member.user(),EDIT));
}
}
members.put(userId,new Member(users.loadUser(userId),permission));
members.put(userId,new Member(registry.userService().loadUser(userId),permission));
task.dirty(MEMBERS);
}
}
@@ -296,8 +284,8 @@ public class TaskModule extends BaseHandler implements TaskService {
if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID);
if (!(json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberData)) throw missingFieldException(MEMBERS);
long projectId = pid.longValue();
var project = projects.load(projectId);
projects.loadMembers(List.of(project));
var project = registry.projectService().load(projectId);
registry.projectService().loadMembers(List.of(project));
var member = project.members().get(user.id());
if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not allowed to create new tasks in this project");
for (var key : memberData.keySet()){
@@ -326,7 +314,7 @@ public class TaskModule extends BaseHandler implements TaskService {
}
if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){
var tagList = arr.toList().stream().filter(e -> e instanceof String).map(String.class::cast).toList();
tags.save(TASK,task.id(),null,tagList);
registry.tagService().save(TASK,task.id(),null,tagList);
}
return sendContent(ex,loadMembers(task));
}
@@ -347,14 +335,4 @@ public class TaskModule extends BaseHandler implements TaskService {
if (isSet(parentTaskId)) return sendContent(ex,mapValues(taskDb.listChildrenOf(parentTaskId,user,showClosed)));
return sendEmptyResponse(HTTP_NOT_IMPLEMENTED,ex);
}
@Override
public ProjectService projectService() {
return projects;
}
@Override
public UserService userService() {
return users;
}
}