implemented display of wiki pages

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2025-09-09 21:08:51 +02:00
parent 4c441b1e46
commit 4f6f969041
10 changed files with 131 additions and 9 deletions

View File

@@ -5,10 +5,8 @@ public class Constants {
private Constants(){}
public static final String CONFIG_DATABASE = "umbrella.modules.wiki.database";
public static final String CONTENT = "content";
public static final String PAGE_ID = "page_id";
public static final String PERMISSIONS = "permissions";
public static final String TABLE_PAGES = "pages";
public static final String TABLE_PAGES_USERS = "page_users";
public static final String VERSION = "version";
}

View File

@@ -2,15 +2,20 @@ package de.srsoftware.umbrella.wiki;
import de.srsoftware.tools.jdbc.Condition;
import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.core.model.Hash;
import de.srsoftware.umbrella.core.model.Permission;
import de.srsoftware.umbrella.core.model.WikiPage;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
import static de.srsoftware.tools.jdbc.Query.select;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.Constants.ERROR_FAILED_CREATE_TABLE;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.databaseException;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.notFound;
import static de.srsoftware.umbrella.wiki.Constants.*;
import static java.lang.System.Logger.Level.ERROR;
import static java.text.MessageFormat.format;
@@ -71,4 +76,42 @@ public class SqliteDb extends BaseDb implements WikiDb {
throw databaseException("Failed to list wiki articles for user {0}",userId);
}
}
@Override
public WikiPage load(String id) {
try {
var rs = select(ALL).from(TABLE_PAGES).where(ID,Condition.equal(id)).sort(VERSION).limit(1).exec(db);
WikiPage page = null;
if (rs.next()) page = WikiPage.of(rs);
rs.close();
if (page == null) throw notFound("Failed to load wiki page \"{0}\" from databse!",id);
rs = select(VERSION).from(TABLE_PAGES).where(ID,Condition.equal(id)).sort(VERSION).exec(db);
var versions = page.versions();
while (rs.next()) versions.add(rs.getInt(VERSION));
rs.close();
return page;
} catch (SQLException e) {
throw databaseException("Failed to load wiki page \"{0}\" from database!",id);
}
}
@Override
public Map<Long, Permission> loadMembers(WikiPage page) {
try {
var map = new HashMap<Long, Permission>();
var rs = select(ALL).from(TABLE_PAGES_USERS).where(PAGE_ID,Condition.equal(page.id())).exec(db);
while (rs.next()){
var permission = switch (rs.getInt(PERMISSIONS)){
case 1 -> Permission.READ_ONLY;
case 2, 3 -> Permission.EDIT;
default -> null;
};
if (permission != null) map.put(rs.getLong(USER_ID),permission);
}
rs.close();
return map;
} catch (SQLException e) {
throw databaseException("Failed to load members of \"{0}\" from database!",page.id());
}
}
}

View File

@@ -2,9 +2,17 @@
package de.srsoftware.umbrella.wiki;
import de.srsoftware.umbrella.core.model.Permission;
import de.srsoftware.umbrella.core.model.WikiPage;
import java.util.List;
import java.util.Map;
public interface WikiDb {
List<String> listUserPages(long userId);
WikiPage load(String id);
Map<Long, Permission> loadMembers(WikiPage page);
}

View File

@@ -8,16 +8,20 @@ import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.ModuleRegistry;
import de.srsoftware.umbrella.core.api.WikiService;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.Member;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.core.model.WikiPage;
import java.io.IOException;
import java.util.Optional;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.Paths.PAGE;
import static de.srsoftware.umbrella.core.Paths.VIEW;
import static de.srsoftware.umbrella.core.Util.mapValues;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingFieldException;
import static de.srsoftware.umbrella.wiki.Constants.CONFIG_DATABASE;
import static de.srsoftware.umbrella.wiki.Constants.*;
public class WikiModule extends BaseHandler implements WikiService {
private final WikiDb wikiDb;
@@ -39,6 +43,7 @@ public class WikiModule extends BaseHandler implements WikiService {
var head = path.pop();
return switch (head) {
case null -> getUserPages(user.get(),ex);
case PAGE -> getPage(path, user.get(), ex);
default -> super.doGet(path,ex);
};
} catch (UmbrellaException e){
@@ -46,6 +51,26 @@ public class WikiModule extends BaseHandler implements WikiService {
}
}
private boolean getPage(Path path, UmbrellaUser user, HttpExchange ex) throws IOException {
var id = path.pop();
if (id == null) throw missingFieldException(PAGE_ID);
return sendContent(ex, loadMembers(wikiDb.load(id)));
}
private WikiPage loadMembers(WikiPage page) {
var members = wikiDb.loadMembers(page);
var users = userService().list(null,null,members.keySet());
var pageMembers = page.members();
for (var entry : members.entrySet()){
var userId = entry.getKey();
var permission = entry.getValue();
var user = users.get(userId);
pageMembers.put(userId,new Member(user,permission));
}
return page;
}
private boolean getUserPages(UmbrellaUser user, HttpExchange ex) throws IOException {
var pageList = wikiDb.listUserPages(user.id());
return sendContent(ex,pageList);