From a06217517b74625886802b55283f5c8b45562d23 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Fri, 18 Jul 2025 23:23:14 +0200 Subject: [PATCH] freactoring to get company list work in efficient way --- .../umbrella/company/CompanyModule.java | 11 ++-- .../srsoftware/umbrella/company/SqliteDb.java | 11 +++- .../umbrella/company/api/CompanyDb.java | 3 +- .../srsoftware/umbrella/core/Constants.java | 5 +- .../umbrella/core/api/CompanyService.java | 3 +- .../umbrella/core/api/ProjectService.java | 5 +- .../umbrella/core/model/Member.java | 14 +++- .../umbrella/core/model/Project.java | 2 +- .../umbrella/documents/DocumentApi.java | 5 -- frontend/src/routes/document/Add.svelte | 6 +- frontend/src/routes/document/List.svelte | 2 +- frontend/src/routes/project/Create.svelte | 1 - frontend/src/routes/project/List.svelte | 58 +++++++++++++++++ .../umbrella/project/Constants.java | 2 +- .../umbrella/project/ProjectDb.java | 3 +- .../umbrella/project/ProjectModule.java | 45 ++++++++++--- .../srsoftware/umbrella/project/SqliteDb.java | 65 +++++++++++++------ .../srsoftware/umbrella/task/TaskModule.java | 4 +- translations/src/main/resources/de.json | 2 + .../srsoftware/umbrella/user/UserModule.java | 8 +-- .../umbrella/user/model/DbUser.java | 20 +++--- .../umbrella/user/sqlite/SqliteDB.java | 2 +- 22 files changed, 202 insertions(+), 75 deletions(-) diff --git a/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java b/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java index 7fef682..66752c7 100644 --- a/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java +++ b/company/src/main/java/de/srsoftware/umbrella/company/CompanyModule.java @@ -19,9 +19,7 @@ import de.srsoftware.umbrella.core.model.Company; import de.srsoftware.umbrella.core.model.Token; import de.srsoftware.umbrella.core.model.UmbrellaUser; import java.io.IOException; -import java.util.Collection; -import java.util.HashSet; -import java.util.Optional; +import java.util.*; public class CompanyModule extends BaseHandler implements CompanyService { @@ -58,8 +56,9 @@ public class CompanyModule extends BaseHandler implements CompanyService { } private boolean getCompanyList(UmbrellaUser user, HttpExchange ex) throws IOException, UmbrellaException { - var list = listCompaniesOf(user).stream().map(Company::toMap); - return sendContent(ex,list); + var result = new HashMap>(); + for (var entry : listCompaniesOf(user).entrySet()) result.put(entry.getKey(),entry.getValue().toMap()); + return sendContent(ex,result); } @@ -72,7 +71,7 @@ public class CompanyModule extends BaseHandler implements CompanyService { } @Override - public Collection listCompaniesOf(UmbrellaUser user) throws UmbrellaException { + public Map listCompaniesOf(UmbrellaUser user) throws UmbrellaException { return companyDb.listCompaniesOf(user.id()); } diff --git a/company/src/main/java/de/srsoftware/umbrella/company/SqliteDb.java b/company/src/main/java/de/srsoftware/umbrella/company/SqliteDb.java index 7368814..a497206 100644 --- a/company/src/main/java/de/srsoftware/umbrella/company/SqliteDb.java +++ b/company/src/main/java/de/srsoftware/umbrella/company/SqliteDb.java @@ -14,7 +14,9 @@ import de.srsoftware.umbrella.core.model.Company; import java.sql.Connection; import java.sql.SQLException; import java.util.Collection; +import java.util.HashMap; import java.util.HashSet; +import java.util.Map; public class SqliteDb implements CompanyDb { @@ -38,11 +40,14 @@ public class SqliteDb implements CompanyDb { } @Override - public Collection listCompaniesOf(long userId) throws UmbrellaException { + public Map listCompaniesOf(long userId) throws UmbrellaException { try { var rs = select("*").from(TABLE_COMPANIES).leftJoin(ID,TABLE_COMPANIES_USERS,COMPANY_ID).where(USER_ID,equal(userId)).exec(db); - var companies = new HashSet(); - while (rs.next()) companies.add(Company.of(rs)); + var companies = new HashMap(); + while (rs.next()) { + var company = Company.of(rs); + companies.put(company.id(),company); + } rs.close(); return companies; } catch (SQLException e) { diff --git a/company/src/main/java/de/srsoftware/umbrella/company/api/CompanyDb.java b/company/src/main/java/de/srsoftware/umbrella/company/api/CompanyDb.java index 58b7386..6267b4d 100644 --- a/company/src/main/java/de/srsoftware/umbrella/company/api/CompanyDb.java +++ b/company/src/main/java/de/srsoftware/umbrella/company/api/CompanyDb.java @@ -4,11 +4,12 @@ package de.srsoftware.umbrella.company.api; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Company; import java.util.Collection; +import java.util.Map; public interface CompanyDb { Collection getMembers(long companyId) throws UmbrellaException; - Collection listCompaniesOf(long id) throws UmbrellaException; + Map listCompaniesOf(long id) throws UmbrellaException; Company load(long companyId) throws UmbrellaException; } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java index 30778c2..77e1e36 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java @@ -52,12 +52,14 @@ public class Constants { public static final String PARENT_TASK_ID = "parent_task_id"; public static final String PASS = "pass"; public static final String PASSWORD = "password"; + public static final String PERMISSION = "permission"; public static final String POST = "POST"; public static final String PROJECT_ID = "project_id"; public static final String RECEIVERS = "receivers"; public static final String REDIRECT = "redirect"; public static final String RENDERED = "rendered"; + public static final String SENDER = "sender"; public static final String SETTINGS = "settings"; public static final String SHOW_CLOSED = "show_closed"; @@ -69,13 +71,14 @@ public class Constants { public static final String STATUS_CODE = "code"; public static final String STRING = "string"; public static final String SUBJECT = "subject"; - public static final String TABLE_SETTINGS = "settings"; + public static final String TABLE_SETTINGS = "settings"; public static final String TEMPLATE = "template"; public static final String TEXT = "text"; public static final String THEME = "theme"; public static final String TITLE = "title"; public static final String TOKEN = "token"; + public static final String UMBRELLA = "Umbrella"; public static final String URL = "url"; public static final String USER = "user"; diff --git a/core/src/main/java/de/srsoftware/umbrella/core/api/CompanyService.java b/core/src/main/java/de/srsoftware/umbrella/core/api/CompanyService.java index 2aee4ff..838e300 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/api/CompanyService.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/api/CompanyService.java @@ -5,13 +5,14 @@ import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Company; import de.srsoftware.umbrella.core.model.UmbrellaUser; import java.util.Collection; +import java.util.Map; public interface CompanyService { Company get(long companyId) throws UmbrellaException; Collection getMembers(long companyId) throws UmbrellaException; - Collection listCompaniesOf(UmbrellaUser user) throws UmbrellaException; + Map listCompaniesOf(UmbrellaUser user) throws UmbrellaException; boolean membership(long companyId, long userId) throws UmbrellaException; diff --git a/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java b/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java index f228bd4..822dc91 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/api/ProjectService.java @@ -4,9 +4,10 @@ package de.srsoftware.umbrella.core.api; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.Project; import java.util.Collection; +import java.util.Map; public interface ProjectService { - public Collection listProjectsOfCompany(long companyId, boolean includeClosed) throws UmbrellaException; - + public Collection listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException; + public Map listUserProjects(long userId, boolean includeClosed) throws UmbrellaException; CompanyService companyService(); } diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Member.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Member.java index 416f410..fa37a5a 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Member.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Member.java @@ -2,4 +2,16 @@ package de.srsoftware.umbrella.core.model; -public record Member(UmbrellaUser user, Permission permission){ } +import de.srsoftware.tools.Mappable; + +import java.util.Map; + +import static de.srsoftware.umbrella.core.Constants.PERMISSION; +import static de.srsoftware.umbrella.core.Constants.USER; + +public record Member(UmbrellaUser user, Permission permission) implements Mappable { + @Override + public Map toMap() { + return Map.of(USER,user.toMap(),PERMISSION,permission.name()); + } +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java index 549b7bd..9a7bf8b 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Project.java @@ -51,7 +51,7 @@ public record Project(long id, String name, String description, Status status, L map.put(STATUS,Map.of(STATUS_CODE,status.code(), NAME,status.name())); map.put(COMPANY_ID,companyId); map.put(SHOW_CLOSED,showClosed); - map.put(MEMBERS,members == null ? List.of() : members); + map.put(MEMBERS,members == null ? List.of() : members.stream().map(Member::toMap).toList()); return map; } } diff --git a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java index 87f15b8..7a831ae 100644 --- a/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java +++ b/documents/src/main/java/de/srsoftware/umbrella/documents/DocumentApi.java @@ -137,7 +137,6 @@ public class DocumentApi extends BaseHandler { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head){ - case COMPANIES -> getCompanies(ex,user.get(),token.orElse(null)); case CONTACTS -> getContacts(ex,user.get(),token.orElse(null)); case PATH_TYPES -> getDocTypes(ex); case STATES -> getDocStates(ex); @@ -232,10 +231,6 @@ public class DocumentApi extends BaseHandler { return ok(ex); } - private boolean getCompanies(HttpExchange ex, UmbrellaUser user, Token token) throws IOException, UmbrellaException { - return sendContent(ex,companies.listCompaniesOf(user).stream().map(Company::toMap)); - } - private boolean getContacts(HttpExchange ex, UmbrellaUser user, Token token) throws IOException, UmbrellaException { return sendContent(ex,getLegacyContacts(ex,user,token)); } diff --git a/frontend/src/routes/document/Add.svelte b/frontend/src/routes/document/Add.svelte index 9bdd8cf..27f3e79 100644 --- a/frontend/src/routes/document/Add.svelte +++ b/frontend/src/routes/document/Add.svelte @@ -20,13 +20,11 @@ }); async function loadCompanies(){ - const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/document/companies`; + const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/company/list`; var resp = await fetch(url,{ credentials: 'include'}); if (resp.ok){ const companies = await resp.json(); - for (let c of companies) { - if (c.id == document.sender.company) company = c; - } + company = companies[document.sender.company]; document.sender.name = ''; if (company.name) document.sender.name += company.name+"\n"; if (company.address) document.sender.name += company.address+"\n"; diff --git a/frontend/src/routes/document/List.svelte b/frontend/src/routes/document/List.svelte index be1745f..65d4e6a 100644 --- a/frontend/src/routes/document/List.svelte +++ b/frontend/src/routes/document/List.svelte @@ -15,7 +15,7 @@ let docType = 0; async function loadCompanies(){ - const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/document/companies`; + const url = `${location.protocol}//${location.host.replace('5173','8080')}/api/company/list`; var resp = await fetch(url,{ credentials: 'include'}); if (resp.ok){ companies = await resp.json(); diff --git a/frontend/src/routes/project/Create.svelte b/frontend/src/routes/project/Create.svelte index 85ad468..7800492 100644 --- a/frontend/src/routes/project/Create.svelte +++ b/frontend/src/routes/project/Create.svelte @@ -1,6 +1,5 @@ +{#if error} +{error} +{/if}
{t('projects')} + {#if projects} + + + + + + + + + + + + {#each Object.entries(projects) as [id,project]} + router.navigate(`/project/${project.id}/view`)}> + + + + + + {/each} + +
{t('name')}{t('company')}{t('state')}{t('members')}{t('actions')}
{project.name} + {#if project.company_id} + {companies[project.company_id].name} + {/if} + + {t("state_"+project.status.name.toLowerCase())} + + {#each project.members as member,idx} +
{member.user.name}
+ {/each} +
+ {/if}
\ No newline at end of file diff --git a/project/src/main/java/de/srsoftware/umbrella/project/Constants.java b/project/src/main/java/de/srsoftware/umbrella/project/Constants.java index e227f52..6d19571 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/Constants.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/Constants.java @@ -7,7 +7,7 @@ public class Constants { public static final String DB_VERSION = "project_db_version"; public static final String PERMISSIONS = "permissions"; public static final String TABLE_PROJECTS = "projects"; - public static final String TABLE_PROJECT_USERS = "project_users"; + public static final String TABLE_PROJECT_USERS = "projects_users"; } diff --git a/project/src/main/java/de/srsoftware/umbrella/project/ProjectDb.java b/project/src/main/java/de/srsoftware/umbrella/project/ProjectDb.java index a51cdc0..1725db7 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectDb.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectDb.java @@ -7,7 +7,8 @@ import de.srsoftware.umbrella.core.model.Project; import java.util.Map; public interface ProjectDb { - Map list(long companyId, boolean includeClosed, UserService userService) throws UmbrellaException; + Map ofCompany(long companyId, boolean includeClosed, UserService userService) throws UmbrellaException; + Map ofUser(long userId, boolean includeClosed, UserService userService) throws UmbrellaException; Project save(Project prj) throws UmbrellaException; } diff --git a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java index ffec3df..cb3ed2b 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/ProjectModule.java @@ -26,13 +26,13 @@ import org.json.JSONObject; public class ProjectModule extends BaseHandler implements ProjectService { - private final ProjectDb projectDb; + private final ProjectDb projects; private final CompanyService companies; private final UserService users; public ProjectModule(Configuration config, CompanyService companyService) throws UmbrellaException { var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE)); - projectDb = new SqliteDb(connect(dbFile)); + projects = new SqliteDb(connect(dbFile)); companies = companyService; users = companies.userService(); } @@ -42,6 +42,24 @@ public class ProjectModule extends BaseHandler implements ProjectService { return companies; } + @Override + public boolean doGet(Path path, HttpExchange ex) throws IOException { + addCors(ex); + try { + Optional token = SessionToken.from(ex).map(Token::of); + var user = users.loadUser(token); + if (user.isEmpty()) return unauthorized(ex); + var head = path.pop(); + return switch (head) { + case LIST -> listUserProjects(ex,user.get()); + case null -> postProject(ex,user.get()); + default -> super.doGet(path,ex); + }; + } catch (UmbrellaException e){ + return send(ex,e); + } + } + @Override public boolean doPost(Path path, HttpExchange ex) throws IOException { addCors(ex); @@ -51,7 +69,7 @@ public class ProjectModule extends BaseHandler implements ProjectService { if (user.isEmpty()) return unauthorized(ex); var head = path.pop(); return switch (head) { - case LIST -> listProjects(ex,user.get()); + case LIST -> listCompanyProjects(ex,user.get()); case null -> postProject(ex,user.get()); default -> super.doGet(path,ex); }; @@ -60,24 +78,35 @@ public class ProjectModule extends BaseHandler implements ProjectService { } } - private boolean listProjects(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException { + public Collection listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException { + return projects.ofCompany(companyId, includeClosed, users).values().stream().sorted(comparing(Project::name)).toList(); + } + + private boolean listCompanyProjects(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException { 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 projects = listProjectsOfCompany(companyId,false) + var projects = listCompanyProjects(companyId,false) .stream() .map(Project::toMap) .map(HashMap::new); return sendContent(ex,projects); } - public Collection listProjectsOfCompany(long companyId, boolean includeClosed) throws UmbrellaException { + @Override + public Map listUserProjects(long userId, boolean includeClosed) throws UmbrellaException { + return projects.ofUser(userId, includeClosed, users); + } - return projectDb.list(companyId, includeClosed, users).values().stream().sorted(comparing(Project::name)).toList(); + private boolean listUserProjects(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException { + var projects = new HashMap>(); + for (var entry : listUserProjects(user.id(),false).entrySet()) projects.put(entry.getKey(),entry.getValue().toMap()); + return sendContent(ex,projects); } + private boolean postProject(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException { var json = json(ex); if (!(json.has(NAME) && json.get(NAME) instanceof String name)) throw missingFieldException(NAME); @@ -92,7 +121,7 @@ public class ProjectModule extends BaseHandler implements ProjectService { showClosed = settingsJson.has(SHOW_CLOSED) && settingsJson.get(SHOW_CLOSED) == TRUE; } var prj = new Project(0,name,description,Project.Status.Open,companyId,showClosed, List.of(new Member(user, OWNER))); - prj = projectDb.save(prj); + prj = projects.save(prj); return sendContent(ex,prj); } } \ No newline at end of file diff --git a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java index 0d79667..b93bf4e 100644 --- a/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java +++ b/project/src/main/java/de/srsoftware/umbrella/project/SqliteDb.java @@ -7,7 +7,6 @@ import static de.srsoftware.tools.jdbc.Query.select; import static de.srsoftware.umbrella.core.Constants.*; import static de.srsoftware.umbrella.core.Constants.TABLE_SETTINGS; import static de.srsoftware.umbrella.core.ResponseCode.HTTP_SERVER_ERROR; -import static de.srsoftware.umbrella.core.Util.LOG; import static de.srsoftware.umbrella.core.model.Project.Status.Open; import static de.srsoftware.umbrella.project.Constants.*; import static java.lang.System.Logger.Level.ERROR; @@ -36,6 +35,31 @@ public class SqliteDb implements ProjectDb { init(); } + private HashMap addMembers(HashMap projects, UserService userService) throws SQLException, UmbrellaException { + Object[] ids = projects.keySet().toArray(); + var rs = select("*").from(TABLE_PROJECT_USERS).where(PROJECT_ID,in(ids)).exec(db); + var userIdMap = new HashMap>(); + while (rs.next()){ + var userId = rs.getLong(USER_ID); + var projectId = rs.getLong(PROJECT_ID); + var permission = Permission.of(rs.getInt(PERMISSIONS)); + HashMap userMap = userIdMap.computeIfAbsent(userId, k -> new HashMap<>()); + userMap.put(projectId,permission); + } + rs.close(); + var userMap = userService.list(userIdMap.keySet()); + for (var entry : userIdMap.entrySet()){ + var userId = entry.getKey(); + var user = userMap.get(userId); + for (var inner : entry.getValue().entrySet()){ + var projectId = inner.getKey(); + var perm = inner.getValue(); + var project = projects.get(projectId); + project.members().add(new Member(user,perm)); + } + } + return projects; + } private int createTables() { createProjectTables(); @@ -123,7 +147,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) } @Override - public HashMap list(long companyId, boolean includeClosed, UserService userService) throws UmbrellaException { + public HashMap ofCompany(long companyId, boolean includeClosed, UserService userService) throws UmbrellaException { try { var projects = new HashMap(); var query = select("*").from(TABLE_PROJECTS).where(COMPANY_ID, equal(companyId)); @@ -134,28 +158,27 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255) projects.put(project.id(),project); } rs.close(); - rs = select("*").from(TABLE_PROJECT_USERS).where(PROJECT_ID,in(projects.keySet())).exec(db); - var userIdMap = new HashMap>(); + return addMembers(projects,userService); + } catch (SQLException e) { + throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load items from database"); + } + } + + + + @Override + public HashMap ofUser(long userId, boolean includeClosed, UserService userService) throws UmbrellaException { + try { + var projects = new HashMap(); + var query = select("*").from(TABLE_PROJECTS).leftJoin(ID,TABLE_PROJECT_USERS,PROJECT_ID).where(USER_ID, equal(userId)); + if (!includeClosed) query = query.where(STATUS,lessThan(Project.Status.Complete.code())); + var rs = query.exec(db); while (rs.next()){ - var userId = rs.getLong(USER_ID); - var projectId = rs.getLong(PROJECT_ID); - var permission = Permission.of(rs.getInt(PERMISSIONS)); - HashMap userMap = userIdMap.computeIfAbsent(userId, k -> new HashMap<>()); - userMap.put(projectId,permission); + var project = Project.of(rs); + projects.put(project.id(),project); } rs.close(); - var userMap = userService.list(userIdMap.keySet()); - for (var entry : userIdMap.entrySet()){ - var userId = entry.getKey(); - var user = userMap.get(userId); - for (var inner : entry.getValue().entrySet()){ - var projectId = inner.getKey(); - var perm = inner.getValue(); - var project = projects.get(projectId); - project.members().add(new Member(user,perm)); - } - } - return projects; + return addMembers(projects,userService); } catch (SQLException e) { throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load items from database"); } diff --git a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java index 4d198e8..7c57815 100644 --- a/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java +++ b/task/src/main/java/de/srsoftware/umbrella/task/TaskModule.java @@ -70,7 +70,7 @@ public class TaskModule extends BaseHandler implements TaskService { 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 projects = this.projects.listProjectsOfCompany(companyId,false); + var projects = this.projects.listCompanyProjects(companyId,false); var taskList = taskDb.listTasks(projects.stream().map(Project::id).toList()); var map = taskList.stream().collect(toMap(Task::id, t -> t)); var tree = new HashMap>(); @@ -89,7 +89,7 @@ public class TaskModule extends BaseHandler implements TaskService { @Override public Collection listCompanyTasks(long companyId) throws UmbrellaException { - var projectList = projects.listProjectsOfCompany(companyId,false); + var projectList = projects.listCompanyProjects(companyId,false); return taskDb.listTasks(projectList.stream().map(Project::id).toList()); } diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 6f42c51..797d3cb 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -91,6 +91,7 @@ "logout": "Abmelden", "MANAGE_LOGIN_SERVICES": "Login-Services verwalten", + "members": "Mitarbeiter", "message": "Nachricht", "messages": "Benachrichtigungen", "model": "Modelle", @@ -141,6 +142,7 @@ "state_delayed": "verspätet", "state_error": "Fehler", "state_new":"neu", + "state_open": "offen", "state_payed": "bezahlt", "state_sent": "versendet", "status" : { diff --git a/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java b/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java index 62568b3..19aa7da 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/UserModule.java @@ -16,8 +16,8 @@ import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; import static de.srsoftware.umbrella.user.Constants.*; import static de.srsoftware.umbrella.user.Paths.*; import static de.srsoftware.umbrella.user.Paths.IMPERSONATE; -import static de.srsoftware.umbrella.user.model.DbUser.PERMISSION; -import static de.srsoftware.umbrella.user.model.DbUser.PERMISSION.*; +import static de.srsoftware.umbrella.user.model.DbUser.Permission.*; +import static de.srsoftware.umbrella.user.model.DbUser.Permission; import static java.lang.System.Logger.Level.*; import static java.net.HttpURLConnection.*; import static java.nio.charset.StandardCharsets.UTF_8; @@ -396,7 +396,7 @@ public class UserModule extends BaseHandler implements UserService { private boolean impersonate(HttpExchange ex, Long targetId) throws IOException, UmbrellaException { var requestingUser = loadUser(ex); if (!(requestingUser.isPresent() && requestingUser.get() instanceof DbUser dbUser)) return unauthorized(ex); - if (!dbUser.permissions().contains(PERMISSION.IMPERSONATE)) throw forbidden("You are not allowed to impersonate other users!"); + if (!dbUser.permissions().contains(Permission.IMPERSONATE)) throw forbidden("You are not allowed to impersonate other users!"); if (targetId == null) return sendContent(ex,HTTP_UNPROCESSABLE,"user id missing"); var targetUser = loadUser(targetId); users.getSession(targetUser).cookie().addTo(ex); @@ -456,7 +456,7 @@ public class UserModule extends BaseHandler implements UserService { private boolean postCreate(HttpExchange ex) throws IOException, UmbrellaException { var optUser = loadUser(ex); if (!(optUser.isPresent() && optUser.get() instanceof DbUser dbUser)) return unauthorized(ex); - if (!dbUser.permissions().contains(PERMISSION.CREATE_USERS)) throw forbidden("You are not allowed to create new users!"); + if (!dbUser.permissions().contains(Permission.CREATE_USERS)) throw forbidden("You are not allowed to create new users!"); var json = json(ex); if (json.has(USER)) json = json.getJSONObject(USER); diff --git a/user/src/main/java/de/srsoftware/umbrella/user/model/DbUser.java b/user/src/main/java/de/srsoftware/umbrella/user/model/DbUser.java index d366fde..4b247df 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/model/DbUser.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/model/DbUser.java @@ -2,10 +2,10 @@ package de.srsoftware.umbrella.user.model; -import static de.srsoftware.umbrella.user.model.DbUser.PERMISSION.*; -import static de.srsoftware.umbrella.user.model.DbUser.PERMISSION.IMPERSONATE; -import static de.srsoftware.umbrella.user.model.DbUser.PERMISSION.LIST_USERS; -import static de.srsoftware.umbrella.user.model.DbUser.PERMISSION.MANAGE_LOGIN_SERVICES; +import static de.srsoftware.umbrella.user.model.DbUser.Permission.*; +import static de.srsoftware.umbrella.user.model.DbUser.Permission.IMPERSONATE; +import static de.srsoftware.umbrella.user.model.DbUser.Permission.LIST_USERS; +import static de.srsoftware.umbrella.user.model.DbUser.Permission.MANAGE_LOGIN_SERVICES; import de.srsoftware.umbrella.core.model.EmailAddress; import de.srsoftware.umbrella.core.model.UmbrellaUser; @@ -14,7 +14,7 @@ import java.util.Set; public class DbUser extends UmbrellaUser { - public enum PERMISSION { + public enum Permission { CREATE_USERS, UPDATE_USERS, DELETE_USERS, @@ -23,13 +23,13 @@ public class DbUser extends UmbrellaUser { MANAGE_LOGIN_SERVICES } - public static Set ADMIN_PERMISSIONS = Set.of(CREATE_USERS, UPDATE_USERS, DELETE_USERS, IMPERSONATE, MANAGE_LOGIN_SERVICES,LIST_USERS); + public static Set ADMIN_PERMISSIONS = Set.of(CREATE_USERS, UPDATE_USERS, DELETE_USERS, IMPERSONATE, MANAGE_LOGIN_SERVICES,LIST_USERS); - private final Set permissions; + private final Set permissions; private final Password hashedPass; private final Long lastLogoff; - public DbUser(long id, String name, EmailAddress email, Password hashedPassword, String theme, String languageCode, Set permissions, Long lastLogoff) { + public DbUser(long id, String name, EmailAddress email, Password hashedPassword, String theme, String languageCode, Set permissions, Long lastLogoff) { super(id, name, email, theme, languageCode); this.hashedPass = hashedPassword; this.permissions = permissions; @@ -44,11 +44,11 @@ public class DbUser extends UmbrellaUser { return lastLogoff; } - public boolean may(PERMISSION permission){ + public boolean may(Permission permission){ return permissions.contains(permission); } - public Set permissions() { + public Set permissions() { return permissions; } diff --git a/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java b/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java index 458965f..b7f5ca6 100644 --- a/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java +++ b/user/src/main/java/de/srsoftware/umbrella/user/sqlite/SqliteDB.java @@ -524,7 +524,7 @@ CREATE TABLE IF NOT EXISTS {0} ( private DbUser toUser(ResultSet rs) throws SQLException, UmbrellaException { long id = rs.getLong(ID); - Set perms = id == 1 ? ADMIN_PERMISSIONS : Set.of(); + Set perms = id == 1 ? ADMIN_PERMISSIONS : Set.of(); return new DbUser( id, rs.getString(LOGIN),