preparing to load events
Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
@@ -10,6 +10,9 @@ import static de.srsoftware.umbrella.messagebus.events.Event.EventType.MEMBER_AD
|
|||||||
|
|
||||||
import de.srsoftware.umbrella.core.constants.Field;
|
import de.srsoftware.umbrella.core.constants.Field;
|
||||||
import de.srsoftware.umbrella.core.model.*;
|
import de.srsoftware.umbrella.core.model.*;
|
||||||
|
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -96,6 +99,7 @@ public class TaskEvent extends Event<Task>{
|
|||||||
return t("You can view/edit this task at {base_url}/task/{id}/view",ID,payload().id());
|
return t("You can view/edit this task at {base_url}/task/{id}/view",ID,payload().id());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Translatable subject() {
|
public Translatable subject() {
|
||||||
return switch (eventType()){
|
return switch (eventType()){
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import de.srsoftware.umbrella.core.model.Session;
|
|||||||
import de.srsoftware.umbrella.core.model.Token;
|
import de.srsoftware.umbrella.core.model.Token;
|
||||||
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
|
|
||||||
@@ -15,6 +16,7 @@ public interface UserService {
|
|||||||
void dropSession(Token token) throws UmbrellaException;
|
void dropSession(Token token) throws UmbrellaException;
|
||||||
Session extend(Session session) throws UmbrellaException;
|
Session extend(Session session) throws UmbrellaException;
|
||||||
Map<Long, UmbrellaUser> list(Integer start, Integer limit, Collection<Long> ids) throws UmbrellaException;
|
Map<Long, UmbrellaUser> list(Integer start, Integer limit, Collection<Long> ids) throws UmbrellaException;
|
||||||
|
HashMap<Long,UmbrellaUser> loader();
|
||||||
Session load(Token token) throws UmbrellaException;
|
Session load(Token token) throws UmbrellaException;
|
||||||
UmbrellaUser load(Session session) throws UmbrellaException;
|
UmbrellaUser load(Session session) throws UmbrellaException;
|
||||||
Optional<UmbrellaUser> load(EmailAddress email) throws UmbrellaException;
|
Optional<UmbrellaUser> load(EmailAddress email) throws UmbrellaException;
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ public class Text {
|
|||||||
|
|
||||||
public static final String EMAILS_FOR_RECEIVER = "emails for {email}";
|
public static final String EMAILS_FOR_RECEIVER = "emails for {email}";
|
||||||
public static final String EVALUATION = "evaluation";
|
public static final String EVALUATION = "evaluation";
|
||||||
|
public static final String EVENT_LIST = "event list";
|
||||||
|
|
||||||
public static final String FILES = "files";
|
public static final String FILES = "files";
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,14 @@
|
|||||||
/* © SRSoftware 2025 */
|
/* © SRSoftware 2025 */
|
||||||
package de.srsoftware.umbrella.journal;
|
package de.srsoftware.umbrella.journal;
|
||||||
|
|
||||||
|
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||||
import de.srsoftware.umbrella.messagebus.events.Event;
|
import de.srsoftware.umbrella.messagebus.events.Event;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public interface JournalDb {
|
public interface JournalDb {
|
||||||
void logEvent(Event<?> event);
|
void logEvent(Event<?> event);
|
||||||
|
|
||||||
|
List<Event<?>> list(String module, long entityId, HashMap<Long, UmbrellaUser> userLoader);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,17 +2,33 @@
|
|||||||
package de.srsoftware.umbrella.journal;
|
package de.srsoftware.umbrella.journal;
|
||||||
|
|
||||||
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||||
|
import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
|
||||||
|
import static de.srsoftware.umbrella.core.constants.Path.PARENT_CANDIDATES;
|
||||||
|
import static de.srsoftware.umbrella.core.constants.Path.TAGGED;
|
||||||
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.invalidField;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
|
||||||
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 de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
|
||||||
import static java.lang.System.Logger.Level.DEBUG;
|
import static java.lang.System.Logger.Level.DEBUG;
|
||||||
|
|
||||||
|
import com.sun.net.httpserver.HttpExchange;
|
||||||
import de.srsoftware.configuration.Configuration;
|
import de.srsoftware.configuration.Configuration;
|
||||||
|
import de.srsoftware.tools.Path;
|
||||||
|
import de.srsoftware.tools.SessionToken;
|
||||||
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.constants.Field;
|
||||||
|
import de.srsoftware.umbrella.core.constants.Text;
|
||||||
|
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
|
||||||
|
import de.srsoftware.umbrella.core.model.Token;
|
||||||
|
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||||
import de.srsoftware.umbrella.messagebus.EventListener;
|
import de.srsoftware.umbrella.messagebus.EventListener;
|
||||||
import de.srsoftware.umbrella.messagebus.events.Event;
|
import de.srsoftware.umbrella.messagebus.events.Event;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
|
||||||
public class JournalModule extends BaseHandler implements EventListener {
|
public class JournalModule extends BaseHandler implements EventListener {
|
||||||
|
|
||||||
@@ -26,6 +42,28 @@ public class JournalModule extends BaseHandler implements EventListener {
|
|||||||
messageBus().register(this);
|
messageBus().register(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean doGet(Path path, HttpExchange ex) throws IOException {
|
||||||
|
addCors(ex);
|
||||||
|
try {
|
||||||
|
Optional<Token> token = SessionToken.from(ex).map(Token::of);
|
||||||
|
var user = userService().loadUser(token);
|
||||||
|
if (user.isEmpty()) return unauthorized(ex);
|
||||||
|
var module = path.pop();
|
||||||
|
if (module == null) throw missingField(Field.MODULE);
|
||||||
|
var head = path.pop();
|
||||||
|
if (head == null) throw missingField(Field.ENTITY_ID);
|
||||||
|
try {
|
||||||
|
var entityId = Long.parseLong(head);
|
||||||
|
journalDb.list(module, entityId, userService().loader());
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
throw invalidField(Field.ENTITY_ID, Text.NUMBER);
|
||||||
|
}
|
||||||
|
} catch (UmbrellaException e) {
|
||||||
|
return send(ex, e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEvent(Event<?> event) {
|
public void onEvent(Event<?> event) {
|
||||||
LOG.log(DEBUG,"{0} @ {1} (by {2})",event.eventType(),event.module(),event.initiator().name());
|
LOG.log(DEBUG,"{0} @ {1} (by {2})",event.eventType(),event.module(),event.initiator().name());
|
||||||
|
|||||||
@@ -1,20 +1,32 @@
|
|||||||
/* © SRSoftware 2025 */
|
/* © SRSoftware 2025 */
|
||||||
package de.srsoftware.umbrella.journal;
|
package de.srsoftware.umbrella.journal;
|
||||||
|
|
||||||
|
import static de.srsoftware.tools.NotImplemented.notImplemented;
|
||||||
|
import static de.srsoftware.tools.jdbc.Condition.equal;
|
||||||
|
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
|
||||||
import static de.srsoftware.tools.jdbc.Query.insertInto;
|
import static de.srsoftware.tools.jdbc.Query.insertInto;
|
||||||
|
import static de.srsoftware.tools.jdbc.Query.select;
|
||||||
import static de.srsoftware.umbrella.core.constants.Field.*;
|
import static de.srsoftware.umbrella.core.constants.Field.*;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
|
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
|
||||||
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.failedToCreateTable;
|
|
||||||
import static de.srsoftware.umbrella.journal.Constants.ERROR_WRITE_EVENT;
|
import static de.srsoftware.umbrella.journal.Constants.ERROR_WRITE_EVENT;
|
||||||
import static de.srsoftware.umbrella.journal.Constants.TABLE_JOURNAL;
|
import static de.srsoftware.umbrella.journal.Constants.TABLE_JOURNAL;
|
||||||
import static java.text.MessageFormat.format;
|
import static java.text.MessageFormat.format;
|
||||||
|
|
||||||
import de.srsoftware.umbrella.core.BaseDb;
|
import de.srsoftware.umbrella.core.BaseDb;
|
||||||
|
import de.srsoftware.umbrella.core.constants.Field;
|
||||||
|
import de.srsoftware.umbrella.core.constants.Module;
|
||||||
|
import de.srsoftware.umbrella.core.constants.Text;
|
||||||
|
import de.srsoftware.umbrella.core.model.UmbrellaUser;
|
||||||
import de.srsoftware.umbrella.messagebus.events.Event;
|
import de.srsoftware.umbrella.messagebus.events.Event;
|
||||||
|
import de.srsoftware.umbrella.messagebus.events.TaskEvent;
|
||||||
|
|
||||||
import java.sql.Connection;
|
import java.sql.Connection;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
import java.time.ZoneOffset;
|
import java.time.ZoneOffset;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class SqliteDb extends BaseDb implements JournalDb{
|
public class SqliteDb extends BaseDb implements JournalDb{
|
||||||
public SqliteDb(Connection connection) {
|
public SqliteDb(Connection connection) {
|
||||||
@@ -51,6 +63,33 @@ public class SqliteDb extends BaseDb implements JournalDb{
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Event<?>> list(String module, long entityId, HashMap<Long, UmbrellaUser> userLoader) {
|
||||||
|
try {
|
||||||
|
var rs = select(ALL).from(TABLE_JOURNAL).where(MODULE, equal(module)).where(ENTITY_ID,equal(entityId)).exec(db);
|
||||||
|
var list = new ArrayList<Event<?>>();
|
||||||
|
|
||||||
|
|
||||||
|
while (rs.next()){
|
||||||
|
var user = userLoader.get(rs.getLong(USER_ID));
|
||||||
|
var id = rs.getLong(Field.ID);
|
||||||
|
var timestamp = rs.getLong(TIMESTAMP);
|
||||||
|
var action = rs.getString(ACTION);
|
||||||
|
var descr = rs.getString(DESCRIPTION);
|
||||||
|
|
||||||
|
var event = switch (module){
|
||||||
|
case Module.TASK -> new TaskEvent(user,)
|
||||||
|
default -> throw notImplemented("No handler for "+module+" events!");
|
||||||
|
};
|
||||||
|
list.add(event);
|
||||||
|
}
|
||||||
|
rs.close();
|
||||||
|
return list;
|
||||||
|
} catch (SQLException e) {
|
||||||
|
throw failedToLoadObject(Text.EVENT_LIST);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void logEvent(Event<?> event) {
|
public void logEvent(Event<?> event) {
|
||||||
try {
|
try {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import static de.srsoftware.tools.Optionals.*;
|
|||||||
import static de.srsoftware.tools.Strings.uuid;
|
import static de.srsoftware.tools.Strings.uuid;
|
||||||
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
|
||||||
import static de.srsoftware.umbrella.core.ModuleRegistry.postBox;
|
import static de.srsoftware.umbrella.core.ModuleRegistry.postBox;
|
||||||
|
import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
|
||||||
import static de.srsoftware.umbrella.core.ResponseCode.*;
|
import static de.srsoftware.umbrella.core.ResponseCode.*;
|
||||||
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_SERVER_ERROR;
|
import static de.srsoftware.umbrella.core.ResponseCode.HTTP_SERVER_ERROR;
|
||||||
import static de.srsoftware.umbrella.core.Util.*;
|
import static de.srsoftware.umbrella.core.Util.*;
|
||||||
@@ -161,6 +162,17 @@ public class UserModule extends BaseHandler implements UserService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public HashMap<Long, UmbrellaUser> loader() {
|
||||||
|
return new HashMap<Long, UmbrellaUser>(){
|
||||||
|
public UmbrellaUser get(long id) {
|
||||||
|
var user = super.get(id);
|
||||||
|
if (user == null) put(id, user = loadUser(id));
|
||||||
|
return user;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UmbrellaUser loadUser(long userId) throws UmbrellaException {
|
public UmbrellaUser loadUser(long userId) throws UmbrellaException {
|
||||||
return users.load(userId);
|
return users.load(userId);
|
||||||
|
|||||||
Reference in New Issue
Block a user