started implementing poll backend

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-02-13 09:15:19 +01:00
parent 0db2ad8b0e
commit dbc4525e80
10 changed files with 138 additions and 21 deletions

View File

@@ -1,9 +1,11 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.poll;
public class Constants {
public static final String CONFIG_DATABASE = "de.umbrella.module.polls";
public static final String CONFIG_DATABASE = "umbrella.modules.poll.database";
public static final String TABLE_OPTIONS = "options";
public static final String TABLE_POLLS = "polls";
public static final String TABLE_SELECTIONS = "selections";
public static final String TABLE_SHARES = "shares";
public static final String TABLE_WEIGHTS = "weights";
}

View File

@@ -1,4 +1,11 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.poll;
import de.srsoftware.umbrella.core.model.Poll;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.util.Collection;
public interface PollDb {
Collection<Poll> listPolls(UmbrellaUser user);
}

View File

@@ -1,23 +1,56 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.poll;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.ModuleRegistry.userService;
import static de.srsoftware.umbrella.core.constants.Path.LIST;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
import static de.srsoftware.umbrella.poll.Constants.CONFIG_DATABASE;
import com.sun.net.httpserver.HttpExchange;
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.ModuleRegistry;
import de.srsoftware.umbrella.core.api.PollService;
import de.srsoftware.umbrella.core.exceptions.UmbrellaException;
import de.srsoftware.umbrella.core.model.Token;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingField;
import static de.srsoftware.umbrella.poll.Constants.CONFIG_DATABASE;
import java.io.IOException;
import java.util.Optional;
public class PollModule extends BaseHandler implements PollService {
private PollDb pollDb;
PollModule(Configuration config){
public PollModule(Configuration config){
super();
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingField(CONFIG_DATABASE));
pollDb = new SqliteDb(connect(dbFile));
ModuleRegistry.add(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 head = path.pop();
return switch (head) {
case LIST -> getPollList(ex,user.get());
case null, default -> super.doGet(path,ex);
};
} catch (UmbrellaException e){
return send(ex,e);
}
}
private boolean getPollList(HttpExchange ex, UmbrellaUser user) throws IOException {
var list = pollDb.listPolls(user);
return sendContent(ex,list);
}
}

View File

@@ -1,19 +1,25 @@
/* © SRSoftware 2025 */
package de.srsoftware.umbrella.poll;
import static de.srsoftware.tools.jdbc.Condition.equal;
import static de.srsoftware.tools.jdbc.Query.SelectQuery.ALL;
import static de.srsoftware.tools.jdbc.Query.select;
import static de.srsoftware.umbrella.core.constants.Field.*;
import static de.srsoftware.umbrella.core.constants.Field.DESCRIPTION;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*;
import static de.srsoftware.umbrella.poll.Constants.*;
import static java.text.MessageFormat.format;
import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.core.constants.Field;
import de.srsoftware.umbrella.core.model.Poll;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.sql.Connection;
import java.sql.SQLException;
import static de.srsoftware.umbrella.core.constants.Field.*;
import static de.srsoftware.umbrella.core.constants.Field.DESCRIPTION;
import static de.srsoftware.umbrella.core.constants.Field.SHOW_CLOSED;
import static de.srsoftware.umbrella.core.constants.Field.STATUS;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.failedToCreateTable;
import static de.srsoftware.umbrella.core.model.Status.OPEN;
import static de.srsoftware.umbrella.poll.Constants.*;
import static java.text.MessageFormat.format;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
public class SqliteDb extends BaseDb implements PollDb {
@@ -48,7 +54,7 @@ public class SqliteDb extends BaseDb implements PollDb {
}
private void createPollsTable() {
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} VARCHAR(255) NOT NULL PRIMARY_KEY, {2} INT NOT NULL, {3} VARCHAR(255) NOT NULL, {4} TEXT, {5} BOOLEAN)";
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} VARCHAR(255) NOT NULL PRIMARY KEY, {2} INT NOT NULL, {3} VARCHAR(255) NOT NULL, {4} TEXT, {5} BOOLEAN)";
try {
var stmt = db.prepareStatement(format(sql,TABLE_POLLS, Field.ID,Field.USER_ID,Field.NAME,Field.DESCRIPTION, Field.PRIVATE));
stmt.execute();
@@ -69,8 +75,19 @@ public class SqliteDb extends BaseDb implements PollDb {
}
}
private void createSharesTable() {
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} VARCHAR(255) NOT NULL REFERENCES {2}({3}), {4} INT NOT NULL, {5} INT, PRIMARY KEY ({1}, {4}))";
try {
var stmt = db.prepareStatement(format(sql,TABLE_SHARES,POLL_ID,TABLE_POLLS,ID,USER_ID, PERMISSION));
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw failedToCreateTable(TABLE_SHARES).causedBy(e);
}
}
private void createWeightsTable(){
var sql = "CREATE TABLE {0} ( {1} INT NOT NULL, {2} VARCHAR(255) NOT NULL REFERENCES {3}({4}), {5} TEXT, PRIMARY KEY ({2}, {1}))"
var sql = "CREATE TABLE {0} ( {1} INT NOT NULL, {2} VARCHAR(255) NOT NULL REFERENCES {3}({4}), {5} TEXT, PRIMARY KEY ({2}, {1}))";
try {
var stmt = db.prepareStatement(format(sql,TABLE_WEIGHTS, WEIGHT,POLL_ID,TABLE_POLLS, ID, DESCRIPTION));
stmt.execute();
@@ -79,5 +96,18 @@ public class SqliteDb extends BaseDb implements PollDb {
throw failedToCreateTable(TABLE_WEIGHTS).causedBy(e);
}
}
@Override
public Collection<Poll> listPolls(UmbrellaUser user) {
// TODO
try {
var rs = select(ALL).from(TABLE_POLLS).where(USER_ID,equal(user.id())).exec(db);
var list = new ArrayList<Poll>();
while (rs.next()) list.add(Poll.of(rs));
return list;
} catch (SQLException sqle){
throw failedToLoadObject(TABLE_POLLS);
}
return List.of();
}
}