implemented creating new poll and managing poll options

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-02-23 23:46:52 +01:00
parent e5ab655787
commit cbc6ce188d
7 changed files with 182 additions and 24 deletions

View File

@@ -27,6 +27,8 @@ import de.srsoftware.umbrella.core.model.UmbrellaUser;
import org.json.JSONObject;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Optional;
public class PollModule extends BaseHandler implements PollService {
@@ -84,7 +86,7 @@ public class PollModule extends BaseHandler implements PollService {
if (user.isEmpty()) return unauthorized(ex);
var head = path.pop();
return switch (head) {
case null -> super.doPost(path,ex);
case null -> postNewPoll(ex,user.get());
default -> postToPoll(ex,user.get(),head, path);
};
} catch (UmbrellaException e){
@@ -113,11 +115,27 @@ public class PollModule extends BaseHandler implements PollService {
}
var head = path.pop();
return switch (head){
case null -> patchPoll(ex, poll);
case OPTION -> patchPollOptions(ex, path, poll);
default -> notFound(ex);
};
}
private boolean patchPoll(HttpExchange ex, Poll poll) throws IOException {
var json = json(ex);
for (var key : json.keySet()){
switch (key){
case Field.DESCRIPTION:
poll.description(json.getString(key)); break;
case Field.NAME:
poll.name(json.getString(key)); break;
case null, default:
throw UmbrellaException.badRequest(Text.UNKNOWN_FIELD,ID,key);
}
}
return sendContent(ex,pollDb.save(poll));
}
private boolean patchPollOptions(HttpExchange ex, Path path, Poll poll) throws IOException {
try {
if (path.empty()) throw missingField(ID);
@@ -144,6 +162,14 @@ public class PollModule extends BaseHandler implements PollService {
}
}
private boolean postNewPoll(HttpExchange ex, UmbrellaUser user) throws IOException {
var json = json(ex);
if (!json.has(Field.NAME)) throw missingField(Field.NAME);
var name = json.getString(Field.NAME);
var poll = new Poll(null,user,name,"",true, List.of(), Map.of(),Map.of());
return sendContent(ex,pollDb.save(poll));
}
private boolean postToPoll(HttpExchange ex, UmbrellaUser user, String id, Path path) throws IOException {
var poll = pollDb.loadPoll(id);
var permitted = user.equals(poll.owner());

View File

@@ -22,9 +22,7 @@ import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.*;
public class SqliteDb extends BaseDb implements PollDb {
@@ -70,9 +68,21 @@ public class SqliteDb extends BaseDb implements PollDb {
}
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}))";
var sql = """
CREATE TABLE IF NOT EXISTS {0} (
{1} VARCHAR(255) NOT NULL,
{2} INT NOT NULL,
{3} INT NOT NULL,
{4} INT NOT NULL,
FOREIGN KEY ({1}) REFERENCES {5}({7}),
FOREIGN KEY ({1},{2}) REFERENCES {6}({1}, {7}),
FOREIGN KEY ({1}, {4}) REFERENCES {8}({1}, {4}),
PRIMARY KEY ({1}, {2}, {3}))""";
try {
var stmt = db.prepareStatement(format(sql,TABLE_SELECTIONS,Field.OPTION_ID,TABLE_OPTIONS,ID, POLL_ID, TABLE_POLLS, USER, Field.WEIGHT, TABLE_WEIGHTS));
var stmt = db.prepareStatement(format(sql,
TABLE_SELECTIONS,
POLL_ID, OPTION_ID, USER_ID, Field.WEIGHT,
TABLE_POLLS, TABLE_OPTIONS, ID, TABLE_WEIGHTS));
stmt.execute();
stmt.close();
} catch (SQLException e) {
@@ -92,7 +102,7 @@ public class SqliteDb extends BaseDb implements PollDb {
}
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 IF NOT EXISTS {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();
@@ -157,7 +167,7 @@ public class SqliteDb extends BaseDb implements PollDb {
@Override
public Poll save(Poll poll) {
return is0(poll.id()) ? saveNew(poll) : update(poll);
return is0(poll.id()) ? saveNew(poll) : update(poll);
}
public Poll.Option saveOption(String pollId, Poll.Option option) {
@@ -171,7 +181,15 @@ public class SqliteDb extends BaseDb implements PollDb {
}
private Poll saveNew(Poll poll) {
throw new RuntimeException("Not implemented");
var uuid = UUID.randomUUID().toString();
try {
insertInto(TABLE_POLLS,Field.ID, USER_ID, NAME, DESCRIPTION, PRIVATE)
.values(uuid,poll.owner().id(),poll.name(),poll.description(),poll.isPrivate())
.execute(db);
} catch (SQLException e) {
throw failedToStoreObject(poll);
}
return new Poll(uuid,poll.owner(),poll.name(),poll.description(),poll.isPrivate(), List.of(), Map.of(), Map.of());
}
private Poll.Option saveNew(String pollId, Poll.Option option) throws SQLException {
@@ -182,12 +200,22 @@ public class SqliteDb extends BaseDb implements PollDb {
}
private Poll update(Poll poll) {
LOG.log(WARNING,"Updating poll not fully implemented");
if (poll.isDirty()) try {
LOG.log(WARNING,"Updating poll not fully implemented");
replaceInto(TABLE_POLLS,ID,Field.USER_ID,NAME,DESCRIPTION).values(poll.id(),poll.owner().id(),poll.name(),poll.description()).execute(db);
} catch (SQLException e){
throw failedToStoreObject(poll);
}
for (var option : poll.options()) saveOption(poll.id(),option);
return poll;
}
private Poll.Option update(String pollId, Poll.Option option) throws SQLException {
if (option.name().isBlank()){
delete().from(TABLE_OPTIONS).where(POLL_ID,equal(pollId)).where(ID,equal(option.id())).execute(db);
return null;
}
replaceInto(TABLE_OPTIONS,POLL_ID, ID, NAME, DESCRIPTION, STATUS)
.values(pollId, option.id(), option.name(), option.description(), option.status()).execute(db);
return option;