|
|
|
|
@ -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; |
|
|
|
|
@ -39,19 +38,6 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -39,19 +38,6 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
|
|
|
|
users = companies.userService(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean addMembers(Project project, HttpExchange ex) throws IOException { |
|
|
|
|
var map = project.toMap(); |
|
|
|
|
var members = new HashMap<Long,Map<String,Object>>(); |
|
|
|
|
for (var entry : project.members().entrySet()){ |
|
|
|
|
var userId = entry.getKey(); |
|
|
|
|
var perm = entry.getValue().permission().toMap(); |
|
|
|
|
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); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public CompanyService companyService() { |
|
|
|
|
return companies; |
|
|
|
|
@ -70,10 +56,7 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -70,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){ |
|
|
|
|
@ -129,56 +112,81 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -129,56 +112,81 @@ 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()); |
|
|
|
|
return addMembers(project,ex); |
|
|
|
|
var map = project.toMap(); |
|
|
|
|
project.companyId().map(companies::get).map(Company::toMap).ifPresent(data -> map.put(COMPANY,data)); |
|
|
|
|
return sendContent(ex,map); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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 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 memberEntry : project.members().entrySet()){ |
|
|
|
|
var perm = memberEntry.getValue().permission().name(); |
|
|
|
|
var userId = memberEntry.getKey(); |
|
|
|
|
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)); |
|
|
|
|
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().put(userId,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 void patchMembers(Project project, JSONObject json) { |
|
|
|
|
var members = project.members(); |
|
|
|
|
for (var key : json.keySet()){ |
|
|
|
|
long userId; |
|
|
|
|
try { |
|
|
|
|
userId = Long.parseLong(key); |
|
|
|
|
} catch (NumberFormatException e) { |
|
|
|
|
throw invalidFieldException(USER_ID,"long"); |
|
|
|
|
} |
|
|
|
|
if (!(json.get(key) instanceof Number number)) throw invalidFieldException(PERMISSION,"int"); |
|
|
|
|
var permission = Permission.of(number.intValue()); |
|
|
|
|
members.put(userId,new Member(users.loadUser(userId),permission)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
if (json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberJson) patchMembers(project,memberJson); |
|
|
|
|
projects.save(project.patch(json)); |
|
|
|
|
return addMembers(project,ex); |
|
|
|
|
return sendContent(ex,project.toMap()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -195,7 +203,8 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -195,7 +203,8 @@ 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, Map.of(user.id(),new Member(user.id(), OWNER))); |
|
|
|
|
var owner = Map.of(user.id(),new Member(user,OWNER)); |
|
|
|
|
var prj = new Project(0,name,description, OPEN,companyId,showClosed, owner); |
|
|
|
|
prj = projects.save(prj); |
|
|
|
|
return sendContent(ex,prj); |
|
|
|
|
} |
|
|
|
|
@ -205,6 +214,5 @@ public class ProjectModule extends BaseHandler implements ProjectService {
@@ -205,6 +214,5 @@ public class ProjectModule extends BaseHandler implements ProjectService {
|
|
|
|
|
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); |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
} |