improved task list

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2025-08-15 00:50:08 +02:00
parent 6ee5f587de
commit 84075b4634
8 changed files with 75 additions and 48 deletions

View File

@@ -7,7 +7,7 @@ import static de.srsoftware.tools.jdbc.Query.*;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
import static de.srsoftware.umbrella.core.model.Status.OPEN;
import static de.srsoftware.umbrella.core.model.Status.*;
import static de.srsoftware.umbrella.project.Constants.*;
import static de.srsoftware.umbrella.task.Constants.*;
import static java.lang.System.Logger.Level.*;
@@ -20,9 +20,7 @@ import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.*;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.*;
public class SqliteDb extends BaseDb implements TaskDb {
@@ -158,7 +156,7 @@ CREATE TABLE IF NOT EXISTS {0} (
.where(PROJECT_ID,equal(projectId))
.where(USER_ID,equal(user.id()))
.where(PARENT_TASK_ID,isNull());
if (!showClosed) query.where(STATUS,lessThan(Status.COMPLETE.code()));
if (!showClosed) query.where(STATUS,lessThan(COMPLETE.code()));
var rs = query.exec(db);
while (rs.next()){
var task = Task.of(rs);
@@ -178,7 +176,7 @@ CREATE TABLE IF NOT EXISTS {0} (
var query = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID)
.where(PARENT_TASK_ID,equal(parentTaskId))
.where(USER_ID,equal(user.id()));
if (!showClosed) query.where(STATUS,lessThan(Status.COMPLETE.code()));
if (!showClosed) query.where(STATUS,lessThan(COMPLETE.code()));
var rs = query.exec(db);
while (rs.next()){
var task = Task.of(rs);
@@ -197,7 +195,7 @@ CREATE TABLE IF NOT EXISTS {0} (
try {
var query = select(ALL).from(TABLE_TASKS).where(PROJECT_ID,equal(projectId));
if (parentTaskId != 0) query.where(PARENT_TASK_ID,equal(parentTaskId));
if (noIndex) query.where(NO_INDEX,equal(false));
if (!noIndex) query.where(NO_INDEX,notIn(1));
var tasks = new HashMap<Long,Task>();
var rs = query.exec(db);
while (rs.next()){
@@ -212,14 +210,13 @@ CREATE TABLE IF NOT EXISTS {0} (
}
@Override
public HashMap<Long, Task> listUserTasks(long userId) {
public List<Task> listUserTasks(long userId, Long limit, long offset, boolean showClosed) {
try {
var rs = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID).where(USER_ID,equal(userId)).exec(db);
var map = new HashMap<Long,Task>();
while (rs.next()) {
var task = Task.of(rs);
map.put(task.id(),task);
}
var query = select(ALL).from(TABLE_TASKS).leftJoin(ID,TABLE_TASKS_USERS,TASK_ID).where(USER_ID,equal(userId));
if (!showClosed) query.where(STATUS,lessThan(COMPLETE.code()));
var rs = query.sort("(CASE due_date WHEN \"\" THEN '9999-99-99' ELSE IFNULL(due_date,'9999-99-99') END), status COLLATE NOCASE").limit(limit).skip(offset).exec(db);
var map = new ArrayList<Task>();
while (rs.next()) map.add(Task.of(rs));
rs.close();
return map;
} catch (SQLException e) {

View File

@@ -8,6 +8,7 @@ import de.srsoftware.umbrella.core.model.Task;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public interface TaskDb {
@@ -19,7 +20,7 @@ public interface TaskDb {
HashMap<Long, Task> listProjectTasks(Long projectId, Long parentTaskId, boolean noIndex) throws UmbrellaException;
HashMap<Long, Task> listRootTasks(Long projectId, UmbrellaUser user, boolean showClosed);
HashMap<Long, Task> listTasks(Collection<Long> projectIds) throws UmbrellaException;
HashMap<Long, Task> listUserTasks(long userId);
List<Task> listUserTasks(long userId, Long limit, long offset, boolean showClosed);
Task load(long taskId) throws UmbrellaException;

View File

@@ -183,8 +183,25 @@ public class TaskModule extends BaseHandler implements TaskService {
}
private boolean getUserTasks(UmbrellaUser user, HttpExchange ex) throws IOException {
var list = taskDb.listUserTasks(user.id());
return sendContent(ex,mapValues(list));
long offset = 0;
Long limit = null;
var params = queryParam(ex);
if (params.get(OFFSET) instanceof String o) try {
offset = Long.parseLong(o);
} catch (NumberFormatException e) {
throw invalidFieldException(OFFSET,"number");
}
if (params.get(LIMIT) instanceof String l) try {
limit = Long.parseLong(l);
} catch (NumberFormatException e) {
throw invalidFieldException(LIMIT,"number");
}
Set<Long> projectIds = registry.projectService().listUserProjects(user.id(), true).keySet();
var list = taskDb.listUserTasks(user.id(), limit, offset, false).stream()
.filter(task -> projectIds.contains(task.projectId())) // drop tasks assigned to project we are not member of
.map(Task::toMap)
.toList();
return sendContent(ex,list);
}
@Override