refactoring
This commit is contained in:
@@ -1,14 +1,15 @@
|
||||
/* © SRSoftware 2025 */
|
||||
package de.srsoftware.umbrella.project;
|
||||
|
||||
import de.srsoftware.umbrella.core.api.UserService;
|
||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import de.srsoftware.umbrella.core.model.Project;
|
||||
import java.util.Map;
|
||||
|
||||
public interface ProjectDb {
|
||||
Map<Long, Project> ofCompany(long companyId, boolean includeClosed, UserService userService) throws UmbrellaException;
|
||||
Map<Long, Project> ofUser(long userId, boolean includeClosed, UserService userService) throws UmbrellaException;
|
||||
Map<Long, Project> ofCompany(long companyId, boolean includeClosed) throws UmbrellaException;
|
||||
Map<Long, Project> ofUser(long userId, boolean includeClosed) throws UmbrellaException;
|
||||
|
||||
Project save(Project prj) throws UmbrellaException;
|
||||
|
||||
Project load(long projectId) throws UmbrellaException;
|
||||
}
|
||||
|
||||
@@ -53,7 +53,14 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
||||
return switch (head) {
|
||||
case LIST -> listUserProjects(ex,user.get());
|
||||
case null -> postProject(ex,user.get());
|
||||
default -> super.doGet(path,ex);
|
||||
default -> {
|
||||
var projectId = Long.parseLong(head);
|
||||
head = path.pop();
|
||||
yield switch (head){
|
||||
case null -> getProject(ex,projectId,user.get());
|
||||
default -> super.doGet(path,ex);
|
||||
};
|
||||
}
|
||||
};
|
||||
} catch (UmbrellaException e){
|
||||
return send(ex,e);
|
||||
@@ -78,8 +85,23 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean getProject(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException, UmbrellaException {
|
||||
var project = projects.load(projectId);
|
||||
var map = project.toMap();
|
||||
var members = new HashMap<Long,Map<String,Object>>();
|
||||
for (var member : project.members()){
|
||||
var perm = member.permission().name();
|
||||
var userId = member.userId();
|
||||
members.put(userId,Map.of(USER,users.loadUser(userId).toMap(),PERMISSION,perm));
|
||||
}
|
||||
if (!members.isEmpty()) map.put(MEMBERS,members);
|
||||
|
||||
return sendContent(ex,map);
|
||||
}
|
||||
|
||||
|
||||
public Collection<Project> listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException {
|
||||
return projects.ofCompany(companyId, includeClosed, users).values().stream().sorted(comparing(Project::name)).toList();
|
||||
return projects.ofCompany(companyId, includeClosed).values().stream().sorted(comparing(Project::name)).toList();
|
||||
}
|
||||
|
||||
private boolean listCompanyProjects(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException {
|
||||
@@ -97,12 +119,26 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
||||
|
||||
@Override
|
||||
public Map<Long, Project> listUserProjects(long userId, boolean includeClosed) throws UmbrellaException {
|
||||
return projects.ofUser(userId, includeClosed, users);
|
||||
return projects.ofUser(userId, includeClosed);
|
||||
}
|
||||
|
||||
private boolean listUserProjects(HttpExchange ex, UmbrellaUser user) throws IOException, UmbrellaException {
|
||||
var projects = new HashMap<Long,Map<String,Object>>();
|
||||
for (var entry : listUserProjects(user.id(),false).entrySet()) projects.put(entry.getKey(),entry.getValue().toMap());
|
||||
for (var entry : listUserProjects(user.id(),false).entrySet()) {
|
||||
var project = entry.getValue();
|
||||
var map = project.toMap();
|
||||
var members = new HashMap<Long,Map<String,Object>>();
|
||||
var userMap = new HashMap<Long,UmbrellaUser>();
|
||||
for (var member : project.members()){
|
||||
var perm = member.permission().name();
|
||||
var userId = member.userId();
|
||||
var u = userMap.get(userId);
|
||||
if (u == null) userMap.put(userId,u = users.loadUser(userId));
|
||||
members.put(userId,Map.of(USER,u.toMap(),PERMISSION,perm));
|
||||
}
|
||||
if (!members.isEmpty()) map.put(MEMBERS,members);
|
||||
projects.put(entry.getKey(),map);
|
||||
}
|
||||
return sendContent(ex,projects);
|
||||
}
|
||||
|
||||
@@ -120,7 +156,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
||||
if (json.has(SETTINGS) && json.get(SETTINGS) instanceof JSONObject settingsJson){
|
||||
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)));
|
||||
var prj = new Project(0,name,description,Project.Status.Open,companyId,showClosed, List.of(new Member(user.id(), OWNER)));
|
||||
prj = projects.save(prj);
|
||||
return sendContent(ex,prj);
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import static java.lang.System.Logger.Level.INFO;
|
||||
import static java.text.MessageFormat.format;
|
||||
|
||||
import de.srsoftware.tools.jdbc.Query;
|
||||
import de.srsoftware.umbrella.core.api.UserService;
|
||||
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import de.srsoftware.umbrella.core.model.Member;
|
||||
import de.srsoftware.umbrella.core.model.Permission;
|
||||
@@ -23,6 +22,7 @@ import java.sql.Connection;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class SqliteDb implements ProjectDb {
|
||||
private static final System.Logger LOG = System.getLogger("Sqlite4Project");
|
||||
@@ -35,29 +35,16 @@ public class SqliteDb implements ProjectDb {
|
||||
init();
|
||||
}
|
||||
|
||||
private HashMap<Long, Project> addMembers(HashMap<Long, Project> projects, UserService userService) throws SQLException, UmbrellaException {
|
||||
private Map<Long, Project> addMembers(Map<Long, Project> projects) 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<Long,HashMap<Long, Permission>>();
|
||||
while (rs.next()){
|
||||
var userId = rs.getLong(USER_ID);
|
||||
var projectId = rs.getLong(PROJECT_ID);
|
||||
var permission = Permission.of(rs.getInt(PERMISSIONS));
|
||||
HashMap<Long, Permission> userMap = userIdMap.computeIfAbsent(userId, k -> new HashMap<>());
|
||||
userMap.put(projectId,permission);
|
||||
projects.get(projectId).members().add(new Member(userId,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;
|
||||
}
|
||||
|
||||
@@ -147,7 +134,22 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
||||
}
|
||||
|
||||
@Override
|
||||
public HashMap<Long, Project> ofCompany(long companyId, boolean includeClosed, UserService userService) throws UmbrellaException {
|
||||
public Project load(long projectId) throws UmbrellaException {
|
||||
try {
|
||||
var rs = select("*").from(TABLE_PROJECTS).where(ID, equal(projectId)).exec(db);
|
||||
Project result = null;
|
||||
if (rs.next()) result = Project.of(rs);
|
||||
rs.close();
|
||||
if (result == null) throw UmbrellaException.notFound("No project found for id {0}",projectId);
|
||||
addMembers(Map.of(projectId,result));
|
||||
return result;
|
||||
} catch (SQLException e) {
|
||||
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load items from database");
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Long, Project> ofCompany(long companyId, boolean includeClosed) throws UmbrellaException {
|
||||
try {
|
||||
var projects = new HashMap<Long,Project>();
|
||||
var query = select("*").from(TABLE_PROJECTS).where(COMPANY_ID, equal(companyId));
|
||||
@@ -158,7 +160,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
||||
projects.put(project.id(),project);
|
||||
}
|
||||
rs.close();
|
||||
return addMembers(projects,userService);
|
||||
return addMembers(projects);
|
||||
} catch (SQLException e) {
|
||||
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load items from database");
|
||||
}
|
||||
@@ -167,7 +169,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
||||
|
||||
|
||||
@Override
|
||||
public HashMap<Long, Project> ofUser(long userId, boolean includeClosed, UserService userService) throws UmbrellaException {
|
||||
public Map<Long, Project> ofUser(long userId, boolean includeClosed) throws UmbrellaException {
|
||||
try {
|
||||
var projects = new HashMap<Long,Project>();
|
||||
var query = select("*").from(TABLE_PROJECTS).leftJoin(ID,TABLE_PROJECT_USERS,PROJECT_ID).where(USER_ID, equal(userId));
|
||||
@@ -178,7 +180,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
||||
projects.put(project.id(),project);
|
||||
}
|
||||
rs.close();
|
||||
return addMembers(projects,userService);
|
||||
return addMembers(projects);
|
||||
} catch (SQLException e) {
|
||||
throw new UmbrellaException(HTTP_SERVER_ERROR,"Failed to load items from database");
|
||||
}
|
||||
@@ -195,8 +197,7 @@ CREATE TABLE IF NOT EXISTS {0} ( {1} VARCHAR(255) PRIMARY KEY, {2} VARCHAR(255)
|
||||
if (id != null){
|
||||
if (!prj.members().isEmpty()) {
|
||||
var query = insertInto(TABLE_PROJECT_USERS, PROJECT_ID, USER_ID, PERMISSIONS);
|
||||
for (var member : prj.members())
|
||||
query.values(id, member.user().id(), member.permission().code());
|
||||
for (var member : prj.members()) query.values(id, member.userId(), member.permission().code());
|
||||
query.execute(db).close();
|
||||
}
|
||||
return new Project(id, prj.name(), prj.description(),prj.status(),prj.companyId(),prj.showClosed(),prj.members());
|
||||
|
||||
Reference in New Issue
Block a user