introduced ModuleRegistry to easy inter-module dependencies

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

View File

@@ -18,10 +18,8 @@ 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.api.CompanyService;
import de.srsoftware.umbrella.core.ModuleRegistry;
import de.srsoftware.umbrella.core.api.ProjectService;
import de.srsoftware.umbrella.core.api.TagService;
import de.srsoftware.umbrella.core.api.UserService;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*;
import java.io.IOException;
@@ -32,37 +30,27 @@ import org.json.JSONObject;
public class ProjectModule extends BaseHandler implements ProjectService {
private final ProjectDb projects;
private final CompanyService companies;
private final UserService users;
private final TagService tags;
private final ModuleRegistry registy;
public ProjectModule(Configuration config, CompanyService companyService, TagService tagService) throws UmbrellaException {
public ProjectModule(ModuleRegistry registry, Configuration config) throws UmbrellaException {
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE));
projects = new SqliteDb(connect(dbFile));
companies = companyService;
tags = tagService;
users = companies.userService();
this.registy = registry.add(this);
}
private void addMember(Project project, long userId) {
var user = users.loadUser(userId);
var user = registy.userService().loadUser(userId);
var member = new Member(user,READ_ONLY);
project.members().put(userId,member);
project.dirty(MEMBERS);
}
@Override
public CompanyService companyService() {
return companies;
}
@Override
public boolean doGet(Path path, HttpExchange ex) throws IOException {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registy.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -86,7 +74,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registy.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -109,7 +97,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
addCors(ex);
try {
Optional<Token> token = SessionToken.from(ex).map(Token::of);
var user = users.loadUser(token);
var user = registy.userService().loadUser(token);
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
@@ -141,7 +129,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
var project = loadMembers(projects.load(projectId));
if (!project.hasMember(user)) throw forbidden("You are not a member of {0}",project.name());
var map = project.toMap();
project.companyId().map(companies::get).map(Company::toMap).ifPresent(data -> map.put(COMPANY,data));
project.companyId().map(registy.companyService()::get).map(Company::toMap).ifPresent(data -> map.put(COMPANY,data));
return sendContent(ex,map);
}
@@ -152,8 +140,8 @@ public class ProjectModule extends BaseHandler implements ProjectService {
}
private boolean listCompanyProjects(HttpExchange ex, UmbrellaUser user, long companyId) throws IOException, UmbrellaException {
var company = companies.get(companyId);
if (!companies.membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name());
var company = registy.companyService().get(companyId);
if (!registy.companyService().membership(companyId,user.id())) throw forbidden("You are mot a member of company {0}",company.name());
var projects = listCompanyProjects(companyId,false);
return sendContent(ex,mapValues(projects));
}
@@ -182,7 +170,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
for (var entry : projects.getMembers(project).entrySet()){
var userId = entry.getKey();
var permission = entry.getValue();
var user = userMap.computeIfAbsent(userId,k -> users.loadUser(userId));
var user = userMap.computeIfAbsent(userId,k -> registy.userService().loadUser(userId));
project.members().put(userId,new Member(user,permission));
}
}
@@ -206,7 +194,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
if (member.permission() == OWNER) members.put(member.user().id(),new Member(member.user(),EDIT));
}
}
members.put(userId,new Member(users.loadUser(userId),permission));
members.put(userId,new Member(registy.userService().loadUser(userId),permission));
project.dirty(MEMBERS);
}
}
@@ -245,7 +233,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
}
Long companyId = null;
if (json.has(COMPANY_ID) && json.get(COMPANY_ID) instanceof Number number){
if (!companies.membership(number.longValue(), user.id())) throw forbidden("You are not a member of company {0}!",number);
if (!registy.companyService().membership(number.longValue(), user.id())) throw forbidden("You are not a member of company {0}!",number);
companyId = number.longValue();
}
var showClosed = false;
@@ -258,7 +246,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){
var tagList = arr.toList().stream().filter(elem -> elem instanceof String).map(String.class::cast).toList();
tags.save(PROJECT,prj.id(),null,tagList);
registy.tagService().save(PROJECT,prj.id(),null,tagList);
}
return sendContent(ex,prj);