From 58898b29a7bd0c2f2e7417b2f713a0eda2cb36f4 Mon Sep 17 00:00:00 2001 From: Jan Dittberner Date: Tue, 14 Apr 2020 23:23:23 +0200 Subject: [PATCH] Add new table user_roles This commit adds a new database table user_roles to prepare for the introduction of a voter management system. All existing enabled voters are added to the VOTER role. --- README.md | 2 +- .../20200414225500_add_roles_table.sql | 34 +++++++++++++++++++ models.go | 24 ++++++++----- 3 files changed, 50 insertions(+), 10 deletions(-) create mode 100644 boardvoting/migrations/20200414225500_add_roles_table.sql diff --git a/README.md b/README.md index 615a078..04e719b 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ This project contains the source code for the CAcert board voting software. The CAcert board voting software is licensed under the terms of the Apache License, Version 2.0. - Copyright 2017-2019 Jan Dittberner + Copyright 2017-2020 Jan Dittberner Licensed under the Apache License, Version 2.0 (the "License"); you may not use this program except in compliance with the License. diff --git a/boardvoting/migrations/20200414225500_add_roles_table.sql b/boardvoting/migrations/20200414225500_add_roles_table.sql new file mode 100644 index 0000000..c36b66c --- /dev/null +++ b/boardvoting/migrations/20200414225500_add_roles_table.sql @@ -0,0 +1,34 @@ +/* + Copyright 2020 Jan Dittberner + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this program except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +-- +migrate Up +-- SQL in section 'Up' is executed when this migration is applied +CREATE TABLE user_roles +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + voter_id VARCHAR(255) NOT NULL REFERENCES voters (id), + role VARCHAR(8) NOT NULL, + created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE (voter_id, role) +); +INSERT INTO user_roles (voter_id, role) +SELECT id, 'VOTER' +FROM voters +WHERE enabled = true; + +-- +migrate Down +-- SQL section 'Down' is executed when this migration is rolled back +DROP TABLE user_roles; \ No newline at end of file diff --git a/models.go b/models.go index 19d701c..2ce7db4 100644 --- a/models.go +++ b/models.go @@ -1,5 +1,5 @@ /* - Copyright 2017-2019 Jan Dittberner + Copyright 2017-2020 Jan Dittberner Licensed under the Apache License, Version 2.0 (the "License"); you may not use this program except in compliance with the License. @@ -86,14 +86,16 @@ FROM votes JOIN voters ON votes.voter=voters.id WHERE decision=$1`, sqlLoadEnabledVoterByEmail: ` -SELECT voters.id, voters.name, voters.enabled, voters.reminder +SELECT voters.id, voters.name, voters.reminder FROM voters JOIN emails ON voters.id=emails.voter -WHERE emails.address=$1 AND voters.enabled=1`, +JOIN user_roles ON user_roles.voter_id=voters.id +WHERE emails.address=$1 AND user_roles.role='VOTER'`, sqlGetEnabledVoterById: ` -SELECT id, name, enabled, reminder +SELECT voters.id, voters.name, voters.reminder FROM voters -WHERE enabled=1 AND id=$1`, +JOIN user_roles ON user_roles.voter_id=voters.id +WHERE user_roles.role='VOTER' AND voters.id=$1`, sqlCountOlderThanDecision: ` SELECT COUNT(*) > 0 FROM decisions WHERE proposed < $1`, sqlCountOlderThanUnvotedDecision: ` @@ -123,10 +125,15 @@ WHERE decisions.status=0 AND :now > due`, sqlGetNextPendingDecisionDue: ` SELECT due FROM decisions WHERE status=0 ORDER BY due LIMIT 1`, sqlGetVotersForProxy: ` -SELECT id, name, reminder -FROM voters WHERE enabled=1 AND id != $1`, +SELECT voters.id, voters.name, voters.reminder +FROM voters +JOIN user_roles ON user_roles.voter_id=voters.id +WHERE user_roles.role='VOTER' AND voters.id != $1`, sqlGetReminderVoters: ` -SELECT id, name, reminder FROM voters WHERE enabled=1 AND reminder!='' AND reminder IS NOT NULL`, +SELECT voters.id, voters.name, voters.reminder +FROM voters +JOIN user_roles ON user_roles.voter_id=voters.id +WHERE user_roles.role='VOTER' AND reminder!='' AND reminder IS NOT NULL`, sqlFindUnvotedDecisionsForVoter: ` SELECT tag, title, votetype, due FROM decisions @@ -162,7 +169,6 @@ type Decision struct { type Voter struct { Id int64 Name string - Enabled bool Reminder string // reminder email address }