|
|
|
|
@ -316,36 +316,51 @@ public class TaskModule extends BaseHandler implements TaskService {
@@ -316,36 +316,51 @@ public class TaskModule extends BaseHandler implements TaskService {
|
|
|
|
|
private boolean postNewTask(UmbrellaUser user, HttpExchange ex) throws IOException { |
|
|
|
|
var json = json(ex); |
|
|
|
|
if (!(json.has(PROJECT_ID) && json.get(PROJECT_ID) instanceof Number pid)) throw missingFieldException(PROJECT_ID); |
|
|
|
|
if (!(json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberData)) throw missingFieldException(MEMBERS); |
|
|
|
|
|
|
|
|
|
long projectId = pid.longValue(); |
|
|
|
|
var project = projectService().load(projectId); |
|
|
|
|
projectService().loadMembers(List.of(project)); |
|
|
|
|
var member = project.members().get(user.id()); |
|
|
|
|
var members = project.members(); |
|
|
|
|
var member = members.get(user.id()); |
|
|
|
|
if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not allowed to create new tasks in this project"); |
|
|
|
|
for (var key : memberData.keySet()){ |
|
|
|
|
long userId = Long.parseLong(key); |
|
|
|
|
if (!(memberData.get(key) instanceof JSONObject nested)) throw invalidFieldException("members."+userId,"JSON"); |
|
|
|
|
if (!(nested.has(PERMISSION) && nested.get(PERMISSION) instanceof JSONObject permission)) throw invalidFieldException("members."+userId+".permission","JSON"); |
|
|
|
|
Permission perm = null; |
|
|
|
|
if (permission.has(CODE) && permission.get(CODE) instanceof Number code) perm = Permission.of(code.intValue()); |
|
|
|
|
if (permission.has(NAME) && permission.get(NAME) instanceof String name) perm = Permission.valueOf(name); |
|
|
|
|
if (perm == null) throw invalidFieldException("members."+userId+".permission.code","int"); |
|
|
|
|
if (!project.members().containsKey(userId)) { |
|
|
|
|
String username = nested.has(USER) && nested.get(USER) instanceof JSONObject userData && userData.get(NAME) instanceof String n ? n : key; |
|
|
|
|
throw new UmbrellaException(HTTP_BAD_REQUEST,"User {0} is no member of the leading project and cannot be assigned to this task",username); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var parentTask = json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number par ? taskService().load(Set.of(par.longValue())).get(par.longValue()) : null; |
|
|
|
|
if (parentTask != null){ |
|
|
|
|
taskService().loadMembers(parentTask); |
|
|
|
|
members = parentTask.members(); |
|
|
|
|
member = members.get(user.id()); |
|
|
|
|
if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not allowed to add sub-stasks to {0}",parentTask.name()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var newMembers = new HashMap<Long,Permission>(); |
|
|
|
|
for (var mem : members.values()){ // Assign members from project or parent task
|
|
|
|
|
var permission = mem.permission() == OWNER ? EDIT : mem.permission(); |
|
|
|
|
newMembers.put(mem.user().id(),permission); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (json.has(MEMBERS) &&json.get(MEMBERS) instanceof JSONObject mems){ |
|
|
|
|
// check of assignee has been set by client
|
|
|
|
|
for (var k : mems.keySet()){ |
|
|
|
|
try { |
|
|
|
|
var userId = Long.parseLong(k); |
|
|
|
|
var permName = mems.getJSONObject(k).getJSONObject(PERMISSION).getString(NAME); |
|
|
|
|
if (Permission.valueOf(permName) == ASSIGNEE) newMembers.put(userId, ASSIGNEE); |
|
|
|
|
} catch (Exception ignored){ |
|
|
|
|
LOG.log(WARNING,"Failed to parse {0}",mems.get(k)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
// set ownership to current user
|
|
|
|
|
newMembers.put(user.id(),OWNER); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
json.put(MEMBERS,Map.of()); // reset member map for task-to-be-created
|
|
|
|
|
Task task = Task.of(json); |
|
|
|
|
task = taskDb.save(task); |
|
|
|
|
var memberIds = new HashSet<Long>(); |
|
|
|
|
for (var key : memberData.keySet()){ |
|
|
|
|
long userId = Long.parseLong(key); |
|
|
|
|
memberIds.add(userId); |
|
|
|
|
var nested = memberData.getJSONObject(key).getJSONObject(PERMISSION); |
|
|
|
|
var permission = nested.has(CODE) ? Permission.of(nested.getInt(CODE)) : Permission.valueOf(nested.getString(NAME)); |
|
|
|
|
taskDb.setMember(task.id(),userId,permission); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// do actual member assignment
|
|
|
|
|
for (var entry : newMembers.entrySet()) taskDb.setMember(task.id(),entry.getKey(),entry.getValue()); |
|
|
|
|
|
|
|
|
|
if (json.has(TAGS) && json.get(TAGS) instanceof JSONArray arr){ |
|
|
|
|
var tagList = arr.toList().stream().filter(e -> e instanceof String).map(String.class::cast).toList(); |
|
|
|
|
tagService().save(TASK,task.id(),null,tagList); |
|
|
|
|
|