working on preparing journal loggin
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -4,5 +4,5 @@ package de.srsoftware.umbrella.messagebus;
|
|||||||
import de.srsoftware.umbrella.messagebus.events.Event;
|
import de.srsoftware.umbrella.messagebus.events.Event;
|
||||||
|
|
||||||
public interface EventListener {
|
public interface EventListener {
|
||||||
void onEvent(Event event);
|
void onEvent(Event<?> event);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import de.srsoftware.umbrella.messagebus.events.Event;
|
|||||||
import java.net.InetSocketAddress;
|
import java.net.InetSocketAddress;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
public class EventQueue extends LinkedList<Event> implements AutoCloseable, EventListener {
|
public class EventQueue extends LinkedList<Event<?>> implements AutoCloseable, EventListener {
|
||||||
|
|
||||||
private final InetSocketAddress addr;
|
private final InetSocketAddress addr;
|
||||||
|
|
||||||
@@ -29,7 +29,7 @@ public class EventQueue extends LinkedList<Event> implements AutoCloseable, Even
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(Event event) {
|
public void onEvent(Event<?> event) {
|
||||||
System.getLogger(addr.toString()).log(System.Logger.Level.INFO,"adding event to queue of {1}: {0}",event.eventType(),addr);
|
System.getLogger(addr.toString()).log(System.Logger.Level.INFO,"adding event to queue of {1}: {0}",event.eventType(),addr);
|
||||||
add(event);
|
add(event);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,8 +6,8 @@ import java.util.HashSet;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public class MessageBus {
|
public class MessageBus {
|
||||||
private static MessageBus SINGLETON = new MessageBus();
|
private static final MessageBus SINGLETON = new MessageBus();
|
||||||
private Set<EventListener> listeners = new HashSet<>();
|
private final Set<EventListener> listeners = new HashSet<>();
|
||||||
|
|
||||||
private MessageBus(){}
|
private MessageBus(){}
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import static java.lang.System.Logger.Level.ERROR;
|
|||||||
import static java.lang.System.Logger.Level.WARNING;
|
import static java.lang.System.Logger.Level.WARNING;
|
||||||
import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
|
import static java.net.HttpURLConnection.HTTP_FORBIDDEN;
|
||||||
import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
|
import static java.net.HttpURLConnection.HTTP_NOT_FOUND;
|
||||||
|
import static java.text.MessageFormat.format;
|
||||||
|
|
||||||
|
|
||||||
public class UmbrellaException extends RuntimeException{
|
public class UmbrellaException extends RuntimeException{
|
||||||
@@ -43,7 +44,12 @@ public class UmbrellaException extends RuntimeException{
|
|||||||
return new UmbrellaException(HTTP_FORBIDDEN,message,fills);
|
return new UmbrellaException(HTTP_FORBIDDEN,message,fills);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static UmbrellaException invalidFieldException(String field,String expected){
|
@Override
|
||||||
|
public String getMessage() {
|
||||||
|
return format(super.getMessage(),fills);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UmbrellaException invalidFieldException(String field, String expected){
|
||||||
return new UmbrellaException(HTTP_UNPROCESSABLE, ERROR_INVALID_FIELD, field, expected);
|
return new UmbrellaException(HTTP_UNPROCESSABLE, ERROR_INVALID_FIELD, field, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,5 +3,5 @@ package de.srsoftware.umbrella.journal;
|
|||||||
import de.srsoftware.umbrella.messagebus.events.Event;
|
import de.srsoftware.umbrella.messagebus.events.Event;
|
||||||
|
|
||||||
public interface JournalDb {
|
public interface JournalDb {
|
||||||
void logEvent(Event event);
|
void logEvent(Event<?> event);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,12 +3,16 @@ package de.srsoftware.umbrella.journal;
|
|||||||
import de.srsoftware.configuration.Configuration;
|
import de.srsoftware.configuration.Configuration;
|
||||||
import de.srsoftware.umbrella.core.BaseHandler;
|
import de.srsoftware.umbrella.core.BaseHandler;
|
||||||
import de.srsoftware.umbrella.core.ModuleRegistry;
|
import de.srsoftware.umbrella.core.ModuleRegistry;
|
||||||
|
import de.srsoftware.umbrella.core.model.Message;
|
||||||
import de.srsoftware.umbrella.messagebus.EventListener;
|
import de.srsoftware.umbrella.messagebus.EventListener;
|
||||||
|
import de.srsoftware.umbrella.messagebus.MessageBus;
|
||||||
import de.srsoftware.umbrella.messagebus.events.Event;
|
import de.srsoftware.umbrella.messagebus.events.Event;
|
||||||
|
|
||||||
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException;
|
||||||
import static de.srsoftware.umbrella.journal.Constants.CONFIG_DATABASE;
|
import static de.srsoftware.umbrella.journal.Constants.CONFIG_DATABASE;
|
||||||
|
import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
|
||||||
|
import static java.lang.System.Logger.Level.INFO;
|
||||||
|
|
||||||
|
|
||||||
public class JournalModule extends BaseHandler implements EventListener {
|
public class JournalModule extends BaseHandler implements EventListener {
|
||||||
@@ -20,11 +24,12 @@ public class JournalModule extends BaseHandler implements EventListener {
|
|||||||
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE));
|
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingFieldException(CONFIG_DATABASE));
|
||||||
journalDb = new SqliteDb(connect(dbFile));
|
journalDb = new SqliteDb(connect(dbFile));
|
||||||
ModuleRegistry.add(this);
|
ModuleRegistry.add(this);
|
||||||
|
messageBus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(Event event) {
|
public void onEvent(Event<?> event) {
|
||||||
LOG.log(System.Logger.Level.DEBUG,"{0} @ {1} ({2})",event.eventType(),event.module(),event.initiator());
|
LOG.log(DEBUG,"{0} @ {1} (by {2})",event.eventType(),event.module(),event.initiator().name());
|
||||||
journalDb.logEvent(event);
|
journalDb.logEvent(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,11 +32,11 @@ public class SqliteDb extends BaseDb implements JournalDb{
|
|||||||
|
|
||||||
private void createJournalTable() {
|
private void createJournalTable() {
|
||||||
var sql = """
|
var sql = """
|
||||||
CREATE TABLE {0} (
|
CREATE TABLE IF NOT EXISTS {0} (
|
||||||
{1} INT PRIMARY KEY,
|
{1} INT PRIMARY KEY,
|
||||||
{2} INT,
|
{2} INT,
|
||||||
{3} VARCHAR(255) NOT NULL,
|
{3} VARCHAR(255) NOT NULL,
|
||||||
{4} VARCHAR(16) NUT NULL,
|
{4} VARCHAR(16) NOT NULL,
|
||||||
{5} TEXT
|
{5} TEXT
|
||||||
);
|
);
|
||||||
""";
|
""";
|
||||||
@@ -49,7 +49,7 @@ public class SqliteDb extends BaseDb implements JournalDb{
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logEvent(Event event) {
|
public void logEvent(Event<?> event) {
|
||||||
try {
|
try {
|
||||||
insertInto(TABLE_JOURNAL,USER_ID,MODULE,ACTION,DESCRIPTION)
|
insertInto(TABLE_JOURNAL,USER_ID,MODULE,ACTION,DESCRIPTION)
|
||||||
.values(event.initiator().id(), event.module(), event.eventType(), event.describe())
|
.values(event.initiator().id(), event.module(), event.eventType(), event.describe())
|
||||||
|
|||||||
@@ -335,6 +335,7 @@ public class TaskModule extends BaseHandler implements TaskService {
|
|||||||
|
|
||||||
private boolean patchTask(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException {
|
private boolean patchTask(HttpExchange ex, long taskId, UmbrellaUser user) throws IOException {
|
||||||
var task = loadMembers(taskDb.load(taskId));
|
var task = loadMembers(taskDb.load(taskId));
|
||||||
|
var old = task.toMap();
|
||||||
var member = task.members().get(user.id());
|
var member = task.members().get(user.id());
|
||||||
if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not a allowed to edit {0}!", task.name());
|
if (member == null || member.permission() == READ_ONLY) throw forbidden("You are not a allowed to edit {0}!", task.name());
|
||||||
var json = json(ex);
|
var json = json(ex);
|
||||||
@@ -342,7 +343,8 @@ public class TaskModule extends BaseHandler implements TaskService {
|
|||||||
if (json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberJson) patchMembers(task, memberJson);
|
if (json.has(MEMBERS) && json.get(MEMBERS) instanceof JSONObject memberJson) patchMembers(task, memberJson);
|
||||||
if (json.has(NEW_MEMBER) && json.get(NEW_MEMBER) instanceof Number num) addMember(task, num.longValue());
|
if (json.has(NEW_MEMBER) && json.get(NEW_MEMBER) instanceof Number num) addMember(task, num.longValue());
|
||||||
if (json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number ptid && newParentIsSubtask(task, ptid.longValue())) throw forbidden("Task must not be sub-task of itself.");
|
if (json.has(PARENT_TASK_ID) && json.get(PARENT_TASK_ID) instanceof Number ptid && newParentIsSubtask(task, ptid.longValue())) throw forbidden("Task must not be sub-task of itself.");
|
||||||
taskDb.save(task.patch(json));
|
var curr = taskDb.save(task.patch(json)).toMap();
|
||||||
|
var diff = diff(old,curr);
|
||||||
var tagList = tagService().getTags(TASK, taskId, user);
|
var tagList = tagService().getTags(TASK, taskId, user);
|
||||||
messageBus().dispatch(new TaskEvent(user,new TaggedTask(task,tagList), UPDATE));
|
messageBus().dispatch(new TaskEvent(user,new TaggedTask(task,tagList), UPDATE));
|
||||||
return sendContent(ex, task);
|
return sendContent(ex, task);
|
||||||
|
|||||||
Reference in New Issue
Block a user