|
|
|
|
@ -10,7 +10,6 @@ import static de.srsoftware.umbrella.core.model.Status.OPEN;
@@ -10,7 +10,6 @@ import static de.srsoftware.umbrella.core.model.Status.OPEN;
|
|
|
|
|
import static de.srsoftware.umbrella.project.Constants.CONFIG_DATABASE; |
|
|
|
|
import static java.lang.Boolean.TRUE; |
|
|
|
|
import static java.net.HttpURLConnection.HTTP_OK; |
|
|
|
|
import static java.util.Comparator.comparing; |
|
|
|
|
|
|
|
|
|
import com.sun.net.httpserver.HttpExchange; |
|
|
|
|
import de.srsoftware.configuration.Configuration; |
|
|
|
|
@ -57,10 +56,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -57,10 +56,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
|
|
|
|
default -> { |
|
|
|
|
var projectId = Long.parseLong(head); |
|
|
|
|
head = path.pop(); |
|
|
|
|
yield switch (head){ |
|
|
|
|
case null -> getProject(ex,projectId,user.get()); |
|
|
|
|
default -> super.doGet(path,ex); |
|
|
|
|
}; |
|
|
|
|
yield head == null ? getProject(ex,projectId,user.get()) : super.doGet(path,ex); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
} catch (UmbrellaException e){ |
|
|
|
|
@ -116,70 +112,61 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -116,70 +112,61 @@ 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 project = loadMembers(projects.load(projectId)); |
|
|
|
|
if (!project.hasMember(user)) throw forbidden("You are not a member of {0}",project.name()); |
|
|
|
|
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); |
|
|
|
|
project.companyId().map(companies::get).map(Company::toMap).ifPresent(data -> map.put(COMPANY,data)); |
|
|
|
|
return sendContent(ex,map); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean postProjectList(HttpExchange ex, UmbrellaUser user) throws IOException { |
|
|
|
|
var json = json(ex); |
|
|
|
|
var showClosed = json.has(SHOW_CLOSED) && json.get(SHOW_CLOSED) instanceof Boolean bool ? bool : false; |
|
|
|
|
if (json.has(COMPANY_ID) && json.get(COMPANY_ID) instanceof Number companyId) return listCompanyProjects(ex, user, companyId.longValue()); |
|
|
|
|
return listUserProjects(ex,user,showClosed); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public Collection<Project> listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException { |
|
|
|
|
return projects.ofCompany(companyId, includeClosed).values().stream().sorted(comparing(Project::name)).toList(); |
|
|
|
|
public Map<Long, Project> listCompanyProjects(long companyId, boolean includeClosed) throws UmbrellaException { |
|
|
|
|
var projectList = projects.ofCompany(companyId, includeClosed); |
|
|
|
|
loadMembers(projectList.values()); |
|
|
|
|
return projectList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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 projects = listCompanyProjects(companyId,false) |
|
|
|
|
.stream() |
|
|
|
|
.map(Project::toMap) |
|
|
|
|
.map(HashMap::new); |
|
|
|
|
return sendContent(ex,projects); |
|
|
|
|
var projects = listCompanyProjects(companyId,false); |
|
|
|
|
return sendContent(ex,mapProjects(projects)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<Long, Project> listUserProjects(long userId, boolean includeClosed) throws UmbrellaException { |
|
|
|
|
return projects.ofUser(userId, includeClosed); |
|
|
|
|
var projectMap = projects.ofUser(userId, includeClosed); |
|
|
|
|
loadMembers(projectMap.values()); |
|
|
|
|
return projectMap; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean listUserProjects(HttpExchange ex, UmbrellaUser user, boolean showClosed) throws IOException, UmbrellaException { |
|
|
|
|
var projects = new HashMap<Long,Map<String,Object>>(); |
|
|
|
|
for (var entry : listUserProjects(user.id(),showClosed).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)); |
|
|
|
|
var projects = listUserProjects(user.id(),showClosed); |
|
|
|
|
return sendContent(ex,mapProjects(projects)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Collection<Project> loadMembers(Collection<Project> projectList) { |
|
|
|
|
var userMap = new HashMap<Long,UmbrellaUser>(); |
|
|
|
|
for (var project : projectList){ |
|
|
|
|
for (var entry : projects.getMembers(project).entrySet()){ |
|
|
|
|
var userId = entry.getKey(); |
|
|
|
|
var permission = entry.getValue(); |
|
|
|
|
var user = userMap.computeIfAbsent(userId,k -> users.loadUser(userId)); |
|
|
|
|
project.members().add(new Member(user,permission)); |
|
|
|
|
} |
|
|
|
|
if (!members.isEmpty()) map.put(MEMBERS,members); |
|
|
|
|
projects.put(entry.getKey(),map); |
|
|
|
|
} |
|
|
|
|
return sendContent(ex,projects); |
|
|
|
|
return projectList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<Long, Map<String, Object>> mapProjects(Map<Long, Project> projects) { |
|
|
|
|
var mapped = new HashMap<Long,Map<String,Object>>(); |
|
|
|
|
for (var entry : projects.entrySet()) mapped.put(entry.getKey(),entry.getValue().toMap()); |
|
|
|
|
return mapped; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean patchProject(HttpExchange ex, long projectId, UmbrellaUser user) throws IOException, UmbrellaException { |
|
|
|
|
var project = projects.load(projectId); |
|
|
|
|
var project = loadMembers(projects.load(projectId)); |
|
|
|
|
if (!project.hasMember(user)) throw forbidden("You are not a member of {0}",project.name()); |
|
|
|
|
var json = json(ex); |
|
|
|
|
projects.save(project.patch(json)); |
|
|
|
|
@ -200,8 +187,15 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -200,8 +187,15 @@ 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, OPEN,companyId,showClosed, List.of(new Member(user.id(), OWNER))); |
|
|
|
|
var prj = new Project(0,name,description, OPEN,companyId,showClosed, List.of(new Member(user, OWNER))); |
|
|
|
|
prj = projects.save(prj); |
|
|
|
|
return sendContent(ex,prj); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean postProjectList(HttpExchange ex, UmbrellaUser user) throws IOException { |
|
|
|
|
var json = json(ex); |
|
|
|
|
var showClosed = json.has(SHOW_CLOSED) && json.get(SHOW_CLOSED) instanceof Boolean bool ? bool : false; |
|
|
|
|
if (json.has(COMPANY_ID) && json.get(COMPANY_ID) instanceof Number companyId) return listCompanyProjects(ex, user, companyId.longValue()); |
|
|
|
|
return listUserProjects(ex,user,showClosed); |
|
|
|
|
} |
|
|
|
|
} |