From 67d28ec498517d6102cc99a7e50407eaa6382363 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 10 Mar 2026 09:25:11 +0100 Subject: [PATCH 1/2] implemented update of shares table (new permission codes) Signed-off-by: Stephan Richter --- .../srsoftware/umbrella/core/model/Poll.java | 2 +- .../srsoftware/umbrella/poll/PollModule.java | 1 - .../de/srsoftware/umbrella/poll/SqliteDb.java | 51 ++++++++++++++++++- 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/core/src/main/java/de/srsoftware/umbrella/core/model/Poll.java b/core/src/main/java/de/srsoftware/umbrella/core/model/Poll.java index 6dbc6e64..6d8437a8 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/model/Poll.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/model/Poll.java @@ -111,7 +111,7 @@ public class Poll implements Mappable { private HashMap> selections = new HashMap<>(); public void count(ResultSet rs) throws SQLException { var optionId = rs.getInt(OPTION_ID); - var userId = rs.getObject(USER_ID); + var userId = rs.getObject(USER); var weight = rs.getInt(WEIGHT); var optionStats = selections.computeIfAbsent(optionId, k -> new HashMap<>()); optionStats.compute(weight, (k, sum) -> sum == null ? 1 : sum + 1); diff --git a/poll/src/main/java/de/srsoftware/umbrella/poll/PollModule.java b/poll/src/main/java/de/srsoftware/umbrella/poll/PollModule.java index 5773d549..62142159 100644 --- a/poll/src/main/java/de/srsoftware/umbrella/poll/PollModule.java +++ b/poll/src/main/java/de/srsoftware/umbrella/poll/PollModule.java @@ -97,7 +97,6 @@ public class PollModule extends BaseHandler implements PollService { var poll = pollDb.loadPoll(pollId); var permitted = !poll.isPrivate() || poll.owner().equals(user); if (!permitted && poll.permissions().get(user) == null) throw forbidden(Text.NOT_ALLOWED_TO_EDIT, Field.OBJECT,Text.POLL); - var eval = pollDb.loadEvaluation(pollId); return sendContent(ex,poll); } diff --git a/poll/src/main/java/de/srsoftware/umbrella/poll/SqliteDb.java b/poll/src/main/java/de/srsoftware/umbrella/poll/SqliteDb.java index 2650b15b..25734cc9 100644 --- a/poll/src/main/java/de/srsoftware/umbrella/poll/SqliteDb.java +++ b/poll/src/main/java/de/srsoftware/umbrella/poll/SqliteDb.java @@ -9,9 +9,11 @@ import static de.srsoftware.umbrella.core.ModuleRegistry.userService; 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.core.model.Permission.READ_ONLY; import static de.srsoftware.umbrella.poll.Constants.*; import static java.text.MessageFormat.format; +import de.srsoftware.tools.jdbc.Query; import de.srsoftware.umbrella.core.BaseDb; import de.srsoftware.umbrella.core.constants.Field; import de.srsoftware.umbrella.core.constants.Text; @@ -41,8 +43,10 @@ public class SqliteDb extends BaseDb implements PollDb { createSelectionsTable(); case 1: createSharesTable(); + case 2: + updateSharesTable(); } - return setCurrentVersion(2); + return setCurrentVersion(3); } private void createOptionsTable() { @@ -296,4 +300,49 @@ public class SqliteDb extends BaseDb implements PollDb { return option; } + private void updateSharesTable() { + try { + var newPermissions = new HashMap>(); // Map from PollId → (Map from UserId → Permission) + var rs = select(ALL).from(TABLE_SHARES).exec(db); + while (rs.next()) { + var pollID = rs.getString(POLL_ID); + var userId = rs.getLong(USER_ID); + var perm = rs.getInt(PERMISSION); + var userMap = newPermissions.computeIfAbsent(pollID, k -> new HashMap<>()); + switch (perm) { + case 0: + userMap.put(userId, READ_ONLY); + break; + case 1: + case 2: + userMap.put(userId, Permission.EDIT); + break; + default: + userMap.put(userId, null); + } + } + rs.close(); + for (var pollEntry : newPermissions.entrySet()){ + var pollId = pollEntry.getKey(); + for (var userEntry : pollEntry.getValue().entrySet()){ + var userId = userEntry.getKey(); + var permission = userEntry.getValue(); + if (permission == null) { + Query.delete().from(TABLE_SHARES) + .where(USER_ID, equal(userId)) + .where(POLL_ID, equal(pollId)) + .execute(db); + } else { + Query.update(TABLE_SHARES) + .where(USER_ID, equal(userId)) + .where(POLL_ID, equal(pollId)) + .set(PERMISSION).prepare(db) + .apply(permission.code()).close(); + } + } + } + } catch (SQLException ex){ + throw databaseException("Failed to update permissions in shares table!"); + } + } } From b4f19ff1c82df101d2135d5ef9e4c1d9f5bde9a8 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Tue, 10 Mar 2026 09:36:41 +0100 Subject: [PATCH 2/2] improved evaluation gui Signed-off-by: Stephan Richter --- frontend/src/routes/poll/Evaluate.svelte | 2 +- translations/src/main/resources/de.json | 1 + translations/src/main/resources/en.json | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/frontend/src/routes/poll/Evaluate.svelte b/frontend/src/routes/poll/Evaluate.svelte index 1078004f..0cf38ab6 100644 --- a/frontend/src/routes/poll/Evaluate.svelte +++ b/frontend/src/routes/poll/Evaluate.svelte @@ -72,7 +72,7 @@ {#each Object.entries(hist).sort((a,b) => a[0] - b[0]) as [weight,count]} - + {weight} {/each} diff --git a/translations/src/main/resources/de.json b/translations/src/main/resources/de.json index 95f48625..f118e4f1 100644 --- a/translations/src/main/resources/de.json +++ b/translations/src/main/resources/de.json @@ -418,6 +418,7 @@ "version": "Version", "version_of": "Version {version} von {element}", "visible_to_guests": "Für Besucher sichtbar", + "voted {count} times": "{count} mal gewählt", "website": "Website", "welcome" : "Willkommen, {0}", diff --git a/translations/src/main/resources/en.json b/translations/src/main/resources/en.json index 539dccd9..9573e157 100644 --- a/translations/src/main/resources/en.json +++ b/translations/src/main/resources/en.json @@ -418,6 +418,7 @@ "version": "version", "version_of": "version {version} of {element}", "visible_to_guests": "visible to guests", + "voted {count} times": "voted {count} times", "website": "website", "welcome" : "Welcome, {0}",