preparing poll module

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-02-12 16:19:41 +01:00
parent 4343ff7d7a
commit 0db2ad8b0e
5 changed files with 116 additions and 0 deletions

View File

@@ -103,6 +103,7 @@ public class Field {
public static final String OBJECT = "object";
public static final String OFFSET = "offset";
public static final String OPTIONAL = "optional";
public static final String OPTION_ID = "option_id";
public static final String OWNER = "owner";
public static final String OWNER_NUMBER = "owner_number";
@@ -113,11 +114,13 @@ public class Field {
public static final String PATH = "path";
public static final String PERMISSION = "permission";
public static final String PHONE = "phone";
public static final String POLL_ID = "poll_id";
public static final String POS = "pos";
public static final String POSITIONS = "positions";
public static final String PRICE = "single_price";
public static final String PRICE_FORMAT = "price_format";
public static final String PRIORITY = "priority";
public static final String PRIVATE = "private";
public static final String PROJECT = "project";
public static final String PROJECT_ID = "project_id";
public static final String PROPERTIES = "properties";
@@ -178,4 +181,5 @@ public class Field {
public static final String VERSION = "version";
public static final String VERSIONS = "versions";
public static final String WEIGHT = "weight";
}

View File

@@ -0,0 +1,9 @@
package de.srsoftware.umbrella.poll;
public class Constants {
public static final String CONFIG_DATABASE = "de.umbrella.module.polls";
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_WEIGHTS = "weights";
}

View File

@@ -0,0 +1,4 @@
package de.srsoftware.umbrella.poll;
public interface PollDb {
}

View File

@@ -1,7 +1,23 @@
package de.srsoftware.umbrella.poll;
import de.srsoftware.configuration.Configuration;
import de.srsoftware.umbrella.core.BaseHandler;
import de.srsoftware.umbrella.core.ModuleRegistry;
import de.srsoftware.umbrella.core.api.PollService;
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;
public class PollModule extends BaseHandler implements PollService {
private PollDb pollDb;
PollModule(Configuration config){
super();
var dbFile = config.get(CONFIG_DATABASE).orElseThrow(() -> missingField(CONFIG_DATABASE));
pollDb = new SqliteDb(connect(dbFile));
ModuleRegistry.add(this);
}
}

View File

@@ -0,0 +1,83 @@
package de.srsoftware.umbrella.poll;
import de.srsoftware.umbrella.core.BaseDb;
import de.srsoftware.umbrella.core.constants.Field;
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;
public class SqliteDb extends BaseDb implements PollDb {
public SqliteDb(Connection connection) {
super(connection);
}
@Override
protected int createTables() {
var version = createSettingsTable();
switch (version){
case 0:
createPollsTable();
createOptionsTable();
createWeightsTable();
createSelectionsTable();
case 1:
createSharesTable();
}
return setCurrentVersion(2);
}
private void createOptionsTable() {
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} INT NOT NULL, {2} VARCHAR(255) NOT NULL REFERENCES {3}({1}), {4} VARCHAR(255) NOT NULL, {5} TEXT, {6} INT DEFAULT 0, PRIMARY KEY ({1}, {2}))";
try {
var stmt = db.prepareStatement(format(sql,TABLE_OPTIONS, Field.ID,Field.POLL_ID,TABLE_POLLS,Field.NAME, Field.DESCRIPTION, Field.STATUS));
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw failedToCreateTable(TABLE_OPTIONS).causedBy(e);
}
}
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)";
try {
var stmt = db.prepareStatement(format(sql,TABLE_POLLS, Field.ID,Field.USER_ID,Field.NAME,Field.DESCRIPTION, Field.PRIVATE));
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw failedToCreateTable(TABLE_POLLS).causedBy(e);
}
}
private void createSelectionsTable() {
var sql = "CREATE TABLE IF NOT EXISTS {0} ({1} INT NOT NULL REFERENCES {2}({3}), {4} VARCHAR(255) NOT NULL REFERENCES {5}({3}), {6} VARCHAR(255) NOT NULL, {7} INT NOT NULL REFERENCES {8}({7}), PRIMARY KEY ({1}, {4}, {6}))";
try {
var stmt = db.prepareStatement(format(sql,TABLE_SELECTIONS,Field.OPTION_ID,TABLE_OPTIONS,ID, POLL_ID, TABLE_POLLS, USER, Field.WEIGHT, TABLE_WEIGHTS));
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw failedToCreateTable(TABLE_SELECTIONS).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}))"
try {
var stmt = db.prepareStatement(format(sql,TABLE_WEIGHTS, WEIGHT,POLL_ID,TABLE_POLLS, ID, DESCRIPTION));
stmt.execute();
stmt.close();
} catch (SQLException e) {
throw failedToCreateTable(TABLE_WEIGHTS).causedBy(e);
}
}
}
}