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!"); + } + } }