refactored member assignment for new tasks
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -13,8 +13,9 @@ import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||
import org.json.JSONObject;
|
||||
|
||||
public class User {
|
||||
private String lang, name;
|
||||
private EmailAddress email;
|
||||
private final String lang;
|
||||
private final String name;
|
||||
private final EmailAddress email;
|
||||
|
||||
public User(String name, EmailAddress email, String languageCode){
|
||||
lang = languageCode;
|
||||
@@ -51,6 +52,6 @@ public class User {
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return format("{0} ({1})",name,email);
|
||||
return email == null ? name : format("{0} ({1})",name,email);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
due_date : null,
|
||||
estimated_time : null,
|
||||
no_index : false,
|
||||
members : {},
|
||||
show_closed : false,
|
||||
start_date : null,
|
||||
tags : []
|
||||
@@ -36,22 +35,6 @@
|
||||
return JSON.parse(JSON.stringify(json));
|
||||
}
|
||||
|
||||
function copyMembers(source){
|
||||
task.members = {};
|
||||
let owner = null;
|
||||
let me = null;
|
||||
for (let [uid, member] of Object.entries(source)){
|
||||
task.members[uid] = member;
|
||||
if (member.permission.name == 'OWNER') owner = flat(member);
|
||||
if (uid == user.id) me = flat(member);
|
||||
}
|
||||
if (owner && me) {
|
||||
// of someone else is owner of the parent task or project, make current user the owner
|
||||
task.members[me.user.id].permission = owner.permission;
|
||||
task.members[owner.user.id].permission = me.permission;
|
||||
}
|
||||
}
|
||||
|
||||
function dropMember(member){
|
||||
delete task.members[member.user.id];
|
||||
console.log({drop:member.user.id});
|
||||
@@ -84,8 +67,6 @@
|
||||
if (resp.ok){
|
||||
project = await resp.json();
|
||||
task.project_id = +project_id;
|
||||
let member_source = parent_task?parent_task.members:project.members;
|
||||
copyMembers(member_source);
|
||||
error = null;
|
||||
} else {
|
||||
error = await resp.text();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user