diff --git a/doc/specification/entity-relationship-diagram.svg b/doc/specification/entity-relationship-diagram.svg index e68f1bf..d297ef2 100644 --- a/doc/specification/entity-relationship-diagram.svg +++ b/doc/specification/entity-relationship-diagram.svg @@ -25,9 +25,9 @@ borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" - inkscape:zoom="0.98994949" - inkscape:cx="455.50968" - inkscape:cy="346.1212" + inkscape:zoom="0.9899495" + inkscape:cx="472.36875" + inkscape:cy="325.73865" inkscape:document-units="px" inkscape:current-layer="layer1" showgrid="true" @@ -62,9 +62,8 @@ id="matte" width="1030" height="730" - x="8.484766" - y="312.36221" - sodipodi:insensitive="true" /> + x="16.060907" + y="312.36218" /> 56.003 + and latitude < 56.004 + and longitude > -4.771 + and longitude < -4.770; + +And it would work - but it would be computationally expensive. If we call each of these .001 x .001 roughly-rectangles a **locality**, then we can give every locality an integer index as follows + + (defn locality-index + "Compute a locality for this `latitude`, `longitude` pair." + [latitude longitude] + (+ + (* 10000 ;; left-shift the latitude component four digits + (integer + (* latitude 1000))) + (- ;; invert the sign of the longitude component, since + ;; we're interested in localities West of Greenwich. + (integer + (* longitude 1000))))) + +For values in Scotland, this gives us a number comfortable smaller than the maximum size of a 32 bit integer. Note that this isn't generally the case, so to adapt this software for use in Canada, for example, a more general solution would need to be chosen; but this will do for now. If we compute this index at the time the address is geocoded, then we can achieve the exact same results as the query given above with a much simpler query: + + select * from address where locality = 560034770; + +If the locality field is indexed (which obviously it should be) this query becomes very cheap. + ### Geographic sharding Volunteers canvassing simultaneously in the same street or the same locality need to see in near real time which dwellings have been canvassed by other volunteers, otherwise we'll get the same households canvassed repeatedly, which wastes volunteer time and annoys voters. So they all need to be sending updates to, and receiving updates from, the same server. But volunteers canvassing in Aberdeen don't need to see in near real time what is happening in Edinburgh. diff --git a/resources/migrations/20161014170335-basic-setup.up.sql b/resources/migrations/20161014170335-basic-setup.up.sql index b7b3277..4d74c06 100644 --- a/resources/migrations/20161014170335-basic-setup.up.sql +++ b/resources/migrations/20161014170335-basic-setup.up.sql @@ -48,14 +48,14 @@ SET client_min_messages = warning; -- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: -- -CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; +-- CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog; --;; -- -- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: -- -COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; +-- COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language'; --;; SET search_path = public, pg_catalog; diff --git a/resources/migrations/20180316110100-intentions-and-options.down.sql b/resources/migrations/20180316110100-intentions-and-options.down.sql new file mode 100644 index 0000000..84c98b8 --- /dev/null +++ b/resources/migrations/20180316110100-intentions-and-options.down.sql @@ -0,0 +1,24 @@ +-------------------------------------------------------------------------------- +---- +---- 20180316110100intentions-and-options.down.sql: remove intentions and options +---- +---- This program is free software; you can redistribute it and/or +---- modify it under the terms of the GNU General Public License +---- as published by the Free Software Foundation; either version 2 +---- of the License, or (at your option) any later version. +---- +---- This program is distributed in the hope that it will be useful, +---- but WITHOUT ANY WARRANTY; without even the implied warranty of +---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +---- GNU General Public License for more details. +---- +---- You should have received a copy of the GNU General Public License +---- along with this program; if not, write to the Free Software +---- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +---- USA. +---- +---- Copyright (C) 2016 Simon Brooke for Radical Independence Campaign +---- +-------------------------------------------------------------------------------- + +drop table intentions; diff --git a/resources/migrations/20180316110100-intentions-and-options.up.sql b/resources/migrations/20180316110100-intentions-and-options.up.sql new file mode 100644 index 0000000..0736740 --- /dev/null +++ b/resources/migrations/20180316110100-intentions-and-options.up.sql @@ -0,0 +1,30 @@ +-------------------------------------------------------------------------------- +---- +---- 20180316110100intentions-and-options.up.sql: add intentions and options +---- +---- This program is free software; you can redistribute it and/or +---- modify it under the terms of the GNU General Public License +---- as published by the Free Software Foundation; either version 2 +---- of the License, or (at your option) any later version. +---- +---- This program is distributed in the hope that it will be useful, +---- but WITHOUT ANY WARRANTY; without even the implied warranty of +---- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +---- GNU General Public License for more details. +---- +---- You should have received a copy of the GNU General Public License +---- along with this program; if not, write to the Free Software +---- Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, +---- USA. +---- +---- Copyright (C) 2016 Simon Brooke for Radical Independence Campaign +---- +-------------------------------------------------------------------------------- + +CREATE TABLE IF NOT EXISTS intentions ( + visit_id int not null references visits(id) on delete no action, + elector_id int not null references electors(id) on delete no action, + option_id varchar(32) not null references options(id) on delete no action + ); + +ALTER TABLE intentions owner to youyesyet; diff --git a/resources/migrations/20180317170000-gender.down.sql b/resources/migrations/20180317170000-gender.down.sql new file mode 100644 index 0000000..5eac53a --- /dev/null +++ b/resources/migrations/20180317170000-gender.down.sql @@ -0,0 +1,3 @@ +alter table electors drop column gender; + +drop table genders; diff --git a/resources/migrations/20180317170000-gender.up.sql b/resources/migrations/20180317170000-gender.up.sql new file mode 100644 index 0000000..9512ea2 --- /dev/null +++ b/resources/migrations/20180317170000-gender.up.sql @@ -0,0 +1,11 @@ +create table genders ( + id varchar(32) not null primary key +); + +-- genders is reference data +insert into genders values ('Female'); +insert into genders values ('Male'); +insert into genders values ('Non-binary'); +insert into genders values ('Unknown'); + +alter table electors add column gender varchar(32) references genders(id) default 'Unknown'; diff --git a/resources/migrations/20180317170907-reference-data.down.sql b/resources/migrations/20180317170907-reference-data.down.sql new file mode 100644 index 0000000..ed67940 --- /dev/null +++ b/resources/migrations/20180317170907-reference-data.down.sql @@ -0,0 +1,10 @@ +delete from options where id = 'Yes'; + +delete from options where id = 'No'; + +delete from issues where id = 'Currency'; + +delete from issues where id = 'Monarchy'; + +delete from issues where id = 'Defence'; + diff --git a/resources/migrations/20180317170907-reference-data.up.sql b/resources/migrations/20180317170907-reference-data.up.sql new file mode 100644 index 0000000..0ab0f4c --- /dev/null +++ b/resources/migrations/20180317170907-reference-data.up.sql @@ -0,0 +1,10 @@ +insert into options values ('Yes'); + +insert into options values ('No'); + + +insert into issues (id, url) values ('Currency', 'https://www.yyy.scot/wiki/issues/Currency'); + +insert into issues (id, url) values ('Monarchy', 'https://www.yyy.scot/wiki/issues/Monarchy'); + +insert into issues (id, url) values ('Defence', 'https://www.yyy.scot/wiki/issues/Defence'); diff --git a/resources/migrations/20180317175047-test-data.down.sql b/resources/migrations/20180317175047-test-data.down.sql new file mode 100644 index 0000000..4a5583c --- /dev/null +++ b/resources/migrations/20180317175047-test-data.down.sql @@ -0,0 +1,3 @@ +delete from addresses where id < = 4; + +delete from electors where id <= 10; diff --git a/resources/migrations/20180317175047-test-data.up.sql b/resources/migrations/20180317175047-test-data.up.sql new file mode 100644 index 0000000..0cc4b20 --- /dev/null +++ b/resources/migrations/20180317175047-test-data.up.sql @@ -0,0 +1,41 @@ +insert into addresses (id, address, postcode, latitude, longitude) +values (1, '13 Imaginary Terrace, IM1 3TE', 'IM1 3TE', 55.8253043, -4.2569057); + +insert into addresses (id, address, postcode, latitude, longitude) +values (2, '15 Imaginary Terrace, IM1 3TE', 'IM1 3TE', 55.8252354, -4.2572778); + +insert into addresses (id, address, postcode, latitude, longitude) +values (3, '17 Imaginary Terrace, IM1 3TE', 'IM1 3TE', 55.825166, -4.257026); + +insert into addresses (id, address, postcode, latitude, longitude) +values (4, '19 Imaginary Terrace, IM1 3TE', 'IM1 3TE', 55.8250695, -4.2570239); + +insert into electors (id, name, address_id, gender) +values (1, 'Alan Anderson', 1, 'Male'); + +insert into electors (id, name, address_id, gender) +values (2, 'Ann Anderson', 1, 'Female'); + +insert into electors (id, name, address_id, gender) +values (3, 'Alex Anderson', 1, 'Non-binary'); + +insert into electors (id, name, address_id) +values (4, 'Andy Anderson', 1); + +insert into electors (id, name, address_id, gender) +values (5, 'Beryl Brown', 2, 'Female'); + +insert into electors (id, name, address_id, gender) +values (6, 'Betty Black', 2, 'Female'); + +insert into electors (id, name, address_id, gender) +values (7, 'Catriona Crathie', 3, 'Female'); + +insert into electors (id, name, address_id, gender) +values (8, 'Colin Caruthers', 3, 'Male'); + +insert into electors (id, name, address_id, gender) +values (9, 'Calum Crathie', 3, 'Unknown'); + +insert into electors (id, name, address_id, gender) +values (10, 'David Dewar', 4, 'Male'); diff --git a/resources/sql/queries.auto.sql b/resources/sql/queries.auto.sql new file mode 100644 index 0000000..b8f5451 --- /dev/null +++ b/resources/sql/queries.auto.sql @@ -0,0 +1,735 @@ +-- :name delete-elector! :! :n +-- :doc updates an existing elector record +DELETE FROM electors +WHERE electors.id = :id + +-- :name get-district :? :1 +-- :doc selects an existing district record +SELECT * FROM districts +WHERE districts.id = :id +ORDER BY districts.id + +-- :name update-addresse! :! :n +-- :doc updates an existing addresse record +UPDATE addresses +SET id = :id, + address = :address, + postcode = :postcode, + phone = :phone, + district_id = :district_id, + latitude = :latitude, + longitude = :longitude +WHERE addresses.id = :id + +-- :name list-teamorganiserships-teams-by-canvasser :? :* +-- :doc lists all existing teams records related through teamorganiserships to a given canvasser +SELECT teams.* +FROM teams, teamorganiserships +WHERE teams. = teamorganiserships.team_id + AND teamorganiserships.canvasser_id = :id +ORDER BY teams. + +-- :name create-authority! :! :n +-- :doc creates a new authority record +INSERT INTO authorities (id) +VALUES (:id) +returning id + +-- :name list-canvassers :? :* +-- :doc lists all existing canvasser records +SELECT * FROM canvassers +ORDER BY canvassers.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name delete-canvasser! :! :n +-- :doc updates an existing canvasser record +DELETE FROM canvassers +WHERE canvassers.id = :id + +-- :name get-followupmethod :? :1 +-- :doc selects an existing followupmethod record +SELECT * FROM followupmethods +WHERE followupmethods.id = :id +ORDER BY followupmethods.id + +-- :name get-canvasser :? :1 +-- :doc selects an existing canvasser record +SELECT * FROM canvassers +WHERE canvassers.id = :id +ORDER BY canvassers.id + +-- :name create-role! :! :n +-- :doc creates a new role record +INSERT INTO roles (id, + name) +VALUES (:id, + :name) + +-- :name list-issueexpertise-issues-by-canvasser :? :* +-- :doc lists all existing issues records related through issueexpertise to a given canvasser +SELECT issues.* +FROM issues, issueexpertise +WHERE issues.id = issueexpertise.issue_id + AND issueexpertise.canvasser_id = :id +ORDER BY issues.id + +-- :name update-followupaction! :! :n +-- :doc updates an existing followupaction record +UPDATE followupactions +SET id = :id, + request_id = :request_id, + actor = :actor, + date = :date, + notes = :notes, + closed = :closed +WHERE followupactions.id = :id + +-- :name list-teammemberships-teams-by-canvasser :? :* +-- :doc lists all existing teams records related through teammemberships to a given canvasser +SELECT teams.* +FROM teams, teammemberships +WHERE teams. = teammemberships.team_id + AND teammemberships.canvasser_id = :id +ORDER BY teams. + +-- :name list-authorities :? :* +-- :doc lists all existing authority records +SELECT * FROM authorities +ORDER BY authorities.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name create-intention! :! :n +-- :doc creates a new intention record +INSERT INTO intentions (visit_id, + elector_id, + option_id) +VALUES (:visit_id, + :elector_id, + :option_id) + +-- :name delete-issue! :! :n +-- :doc updates an existing issue record +DELETE FROM issues +WHERE issues.id = :id + +-- :name list-followuprequests-by-visit :? :* +-- :doc lists all existing followuprequest records related to a given visit +SELECT * +FROM followuprequests +WHERE followuprequests.visit_id = :id +ORDER BY followuprequests.id + +-- :name list-canvassers-by-addresse :? :* +-- :doc lists all existing canvasser records related to a given addresse +SELECT * +FROM canvassers +WHERE canvassers.address_id = :id +ORDER BY canvassers.id + +-- :name list-intentions-options-by-elector :? :* +-- :doc lists all existing options records related through intentions to a given elector +SELECT options.* +FROM options, intentions +WHERE options.id = intentions.option_id + AND intentions.elector_id = :id +ORDER BY options.id + +-- :name create-followupmethod! :! :n +-- :doc creates a new followupmethod record +INSERT INTO followupmethods (id) +VALUES (:id) +returning id + +-- :name list-canvassers-by-elector :? :* +-- :doc lists all existing canvasser records related to a given elector +SELECT * +FROM canvassers +WHERE canvassers.elector_id = :id +ORDER BY canvassers.id + +-- :name create-district! :! :n +-- :doc creates a new district record +INSERT INTO districts (id, + name) +VALUES (:id, + :name) +returning id + +-- :name delete-followupaction! :! :n +-- :doc updates an existing followupaction record +DELETE FROM followupactions +WHERE followupactions.id = :id + +-- :name create-followupaction! :! :n +-- :doc creates a new followupaction record +INSERT INTO followupactions (id, + request_id, + actor, + date, + notes, + closed) +VALUES (:id, + :request_id, + :actor, + :date, + :notes, + :closed) +returning id + +-- :name list-canvassers-by-authoritie :? :* +-- :doc lists all existing canvasser records related to a given authoritie +SELECT * +FROM canvassers +WHERE canvassers.authority_id = :id +ORDER BY canvassers.id + +-- :name list-followuprequests :? :* +-- :doc lists all existing followuprequest records +SELECT * FROM followuprequests +ORDER BY followuprequests.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-followupactions :? :* +-- :doc lists all existing followupaction records +SELECT * FROM followupactions +ORDER BY followupactions.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name create-followuprequest! :! :n +-- :doc creates a new followuprequest record +INSERT INTO followuprequests (id, + elector_id, + visit_id, + issue_id, + method_id) +VALUES (:id, + :elector_id, + :visit_id, + :issue_id, + :method_id) +returning id + +-- :name update-issue! :! :n +-- :doc updates an existing issue record +UPDATE issues +SET id = :id, + url = :url +WHERE issues.id = :id + +-- :name get-option :? :1 +-- :doc selects an existing option record +SELECT * FROM options +WHERE options.id = :id +ORDER BY options.id + +-- :name list-issueexpertise-followupmethods-by-issue :? :* +-- :doc lists all existing followupmethods records related through issueexpertise to a given issue +SELECT followupmethods.* +FROM followupmethods, issueexpertise +WHERE followupmethods.id = issueexpertise.method_id + AND issueexpertise.issue_id = :id +ORDER BY followupmethods.id + +-- :name list-intentions-visits-by-option :? :* +-- :doc lists all existing visits records related through intentions to a given option +SELECT visits.* +FROM visits, intentions +WHERE visits.id = intentions.visit_id + AND intentions.option_id = :id +ORDER BY visits.id + +-- :name list-teams :? :* +-- :doc lists all existing team records +SELECT * FROM teams +ORDER BY teams. +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-schema_migrations :? :* +-- :doc lists all existing schema-migration records +SELECT * FROM schema_migrations +ORDER BY schema_migrations. +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name create-elector! :! :n +-- :doc creates a new elector record +INSERT INTO electors (id, + name, + address_id, + phone, + email) +VALUES (:id, + :name, + :address_id, + :phone, + :email) +returning id + +-- :name delete-addresse! :! :n +-- :doc updates an existing addresse record +DELETE FROM addresses +WHERE addresses.id = :id + +-- :name delete-followuprequest! :! :n +-- :doc updates an existing followuprequest record +DELETE FROM followuprequests +WHERE followuprequests.id = :id + +-- :name list-options :? :* +-- :doc lists all existing option records +SELECT * FROM options +ORDER BY options.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name get-followupaction :? :1 +-- :doc selects an existing followupaction record +SELECT * FROM followupactions +WHERE followupactions.id = :id +ORDER BY followupactions.id + +-- :name list-followupactions-by-canvasser :? :* +-- :doc lists all existing followupaction records related to a given canvasser +SELECT * +FROM followupactions +WHERE followupactions.actor = :id +ORDER BY followupactions.id + +-- :name get-issue :? :1 +-- :doc selects an existing issue record +SELECT * FROM issues +WHERE issues.id = :id +ORDER BY issues.id + +-- :name create-teamorganisership! :! :n +-- :doc creates a new teamorganisership record +INSERT INTO teamorganiserships (team_id, + canvasser_id) +VALUES (:team_id, + :canvasser_id) + +-- :name get-visit :? :1 +-- :doc selects an existing visit record +SELECT * FROM visits +WHERE visits.id = :id +ORDER BY visits.id + +-- :name list-addresses :? :* +-- :doc lists all existing addresse records +SELECT * FROM addresses +ORDER BY addresses.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name create-team! :! :n +-- :doc creates a new team record +INSERT INTO teams (id, + name, + district_id, + latitude, + longitude) +VALUES (:id, + :name, + :district_id, + :latitude, + :longitude) + +-- :name list-addresses-by-district :? :* +-- :doc lists all existing addresse records related to a given district +SELECT * +FROM addresses +WHERE addresses.district_id = :id +ORDER BY addresses.id + +-- :name create-issue! :! :n +-- :doc creates a new issue record +INSERT INTO issues (id, + url) +VALUES (:id, + :url) +returning id + +-- :name delete-authority! :! :n +-- :doc updates an existing authority record +DELETE FROM authorities +WHERE authorities.id = :id + +-- :name create-canvasser! :! :n +-- :doc creates a new canvasser record +INSERT INTO canvassers (id, + username, + fullname, + elector_id, + address_id, + phone, + email, + authority_id, + authorised) +VALUES (:id, + :username, + :fullname, + :elector_id, + :address_id, + :phone, + :email, + :authority_id, + :authorised) +returning id + +-- :name list-visits-by-addresse :? :* +-- :doc lists all existing visit records related to a given addresse +SELECT * +FROM visits +WHERE visits.address_id = :id +ORDER BY visits.id + +-- :name delete-district! :! :n +-- :doc updates an existing district record +DELETE FROM districts +WHERE districts.id = :id + +-- :name get-addresse :? :1 +-- :doc selects an existing addresse record +SELECT * FROM addresses +WHERE addresses.id = :id +ORDER BY addresses.id + +-- :name create-addresse! :! :n +-- :doc creates a new addresse record +INSERT INTO addresses (id, + address, + postcode, + phone, + district_id, + latitude, + longitude) +VALUES (:id, + :address, + :postcode, + :phone, + :district_id, + :latitude, + :longitude) +returning id + +-- :name create-rolemembership! :! :n +-- :doc creates a new rolemembership record +INSERT INTO rolememberships (role_id, + canvasser_id) +VALUES (:role_id, + :canvasser_id) + +-- :name list-issueexpertise-followupmethods-by-canvasser :? :* +-- :doc lists all existing followupmethods records related through issueexpertise to a given canvasser +SELECT followupmethods.* +FROM followupmethods, issueexpertise +WHERE followupmethods.id = issueexpertise.method_id + AND issueexpertise.canvasser_id = :id +ORDER BY followupmethods.id + +-- :name get-followuprequest :? :1 +-- :doc selects an existing followuprequest record +SELECT * FROM followuprequests +WHERE followuprequests.id = :id +ORDER BY followuprequests.id + +-- :name create-teammembership! :! :n +-- :doc creates a new teammembership record +INSERT INTO teammemberships (team_id, + canvasser_id) +VALUES (:team_id, + :canvasser_id) + +-- :name delete-option! :! :n +-- :doc updates an existing option record +DELETE FROM options +WHERE options.id = :id + +-- :name list-teammemberships-canvassers-by-team :? :* +-- :doc lists all existing canvassers records related through teammemberships to a given team +SELECT canvassers.* +FROM canvassers, teammemberships +WHERE canvassers.id = teammemberships.canvasser_id + AND teammemberships.team_id = :id +ORDER BY canvassers.id + +-- :name list-issueexpertise-canvassers-by-issue :? :* +-- :doc lists all existing canvassers records related through issueexpertise to a given issue +SELECT canvassers.* +FROM canvassers, issueexpertise +WHERE canvassers.id = issueexpertise.canvasser_id + AND issueexpertise.issue_id = :id +ORDER BY canvassers.id + +-- :name delete-followupmethod! :! :n +-- :doc updates an existing followupmethod record +DELETE FROM followupmethods +WHERE followupmethods.id = :id + +-- :name list-districts :? :* +-- :doc lists all existing district records +SELECT * FROM districts +ORDER BY districts.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-rolememberships-canvassers-by-role :? :* +-- :doc lists all existing canvassers records related through rolememberships to a given role +SELECT canvassers.* +FROM canvassers, rolememberships +WHERE canvassers.id = rolememberships.canvasser_id + AND rolememberships.role_id = :id +ORDER BY canvassers.id + +-- :name get-authority :? :1 +-- :doc selects an existing authority record +SELECT * FROM authorities +WHERE authorities.id = :id +ORDER BY authorities.id + +-- :name create-option! :! :n +-- :doc creates a new option record +INSERT INTO options (id) +VALUES (:id) +returning id + +-- :name list-visits :? :* +-- :doc lists all existing visit records +SELECT * FROM visits +ORDER BY visits.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-teamorganiserships-canvassers-by-team :? :* +-- :doc lists all existing canvassers records related through teamorganiserships to a given team +SELECT canvassers.* +FROM canvassers, teamorganiserships +WHERE canvassers.id = teamorganiserships.canvasser_id + AND teamorganiserships.team_id = :id +ORDER BY canvassers.id + +-- :name get-elector :? :1 +-- :doc selects an existing elector record +SELECT * FROM electors +WHERE electors.id = :id +ORDER BY electors.id + +-- :name create-visit! :! :n +-- :doc creates a new visit record +INSERT INTO visits (id, + address_id, + canvasser_id, + date) +VALUES (:id, + :address_id, + :canvasser_id, + :date) +returning id + +-- :name list-roles :? :* +-- :doc lists all existing role records +SELECT * FROM roles +ORDER BY roles. +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name update-visit! :! :n +-- :doc updates an existing visit record +UPDATE visits +SET id = :id, + address_id = :address_id, + canvasser_id = :canvasser_id, + date = :date +WHERE visits.id = :id + +-- :name update-district! :! :n +-- :doc updates an existing district record +UPDATE districts +SET id = :id, + name = :name +WHERE districts.id = :id + +-- :name list-followupactions-by-followuprequest :? :* +-- :doc lists all existing followupaction records related to a given followuprequest +SELECT * +FROM followupactions +WHERE followupactions.request_id = :id +ORDER BY followupactions.id + +-- :name create-issueexpertise! :! :n +-- :doc creates a new issueexpertise record +INSERT INTO issueexpertise (canvasser_id, + issue_id, + method_id) +VALUES (:canvasser_id, + :issue_id, + :method_id) + +-- :name list-issueexpertise-canvassers-by-followupmethod :? :* +-- :doc lists all existing canvassers records related through issueexpertise to a given followupmethod +SELECT canvassers.* +FROM canvassers, issueexpertise +WHERE canvassers.id = issueexpertise.canvasser_id + AND issueexpertise.method_id = :id +ORDER BY canvassers.id + +-- :name update-elector! :! :n +-- :doc updates an existing elector record +UPDATE electors +SET id = :id, + name = :name, + address_id = :address_id, + phone = :phone, + email = :email +WHERE electors.id = :id + +-- :name list-followupmethods :? :* +-- :doc lists all existing followupmethod records +SELECT * FROM followupmethods +ORDER BY followupmethods.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name delete-visit! :! :n +-- :doc updates an existing visit record +DELETE FROM visits +WHERE visits.id = :id + +-- :name list-intentions-electors-by-option :? :* +-- :doc lists all existing electors records related through intentions to a given option +SELECT electors.* +FROM electors, intentions +WHERE electors.id = intentions.elector_id + AND intentions.option_id = :id +ORDER BY electors.id + +-- :name create-schema-migration! :! :n +-- :doc creates a new schema-migration record +INSERT INTO schema_migrations (id) +VALUES (:id) + +-- :name update-canvasser! :! :n +-- :doc updates an existing canvasser record +UPDATE canvassers +SET id = :id, + username = :username, + fullname = :fullname, + elector_id = :elector_id, + address_id = :address_id, + phone = :phone, + email = :email, + authority_id = :authority_id, + authorised = :authorised +WHERE canvassers.id = :id + +-- :name list-intentions-options-by-visit :? :* +-- :doc lists all existing options records related through intentions to a given visit +SELECT options.* +FROM options, intentions +WHERE options.id = intentions.option_id + AND intentions.visit_id = :id +ORDER BY options.id + +-- :name list-followuprequests-by-issue :? :* +-- :doc lists all existing followuprequest records related to a given issue +SELECT * +FROM followuprequests +WHERE followuprequests.issue_id = :id +ORDER BY followuprequests.id + +-- :name list-followuprequests-by-followupmethod :? :* +-- :doc lists all existing followuprequest records related to a given followupmethod +SELECT * +FROM followuprequests +WHERE followuprequests.method_id = :id +ORDER BY followuprequests.id + +-- :name list-intentions-visits-by-elector :? :* +-- :doc lists all existing visits records related through intentions to a given elector +SELECT visits.* +FROM visits, intentions +WHERE visits.id = intentions.visit_id + AND intentions.elector_id = :id +ORDER BY visits.id + +-- :name list-rolememberships-roles-by-canvasser :? :* +-- :doc lists all existing roles records related through rolememberships to a given canvasser +SELECT roles.* +FROM roles, rolememberships +WHERE roles. = rolememberships.role_id + AND rolememberships.canvasser_id = :id +ORDER BY roles. + +-- :name list-intentions-electors-by-visit :? :* +-- :doc lists all existing electors records related through intentions to a given visit +SELECT electors.* +FROM electors, intentions +WHERE electors.id = intentions.elector_id + AND intentions.visit_id = :id +ORDER BY electors.id + +-- :name list-issueexpertise-issues-by-followupmethod :? :* +-- :doc lists all existing issues records related through issueexpertise to a given followupmethod +SELECT issues.* +FROM issues, issueexpertise +WHERE issues.id = issueexpertise.issue_id + AND issueexpertise.method_id = :id +ORDER BY issues.id + +-- :name list-teams-by-district :? :* +-- :doc lists all existing team records related to a given district +SELECT * +FROM teams +WHERE teams.district_id = :id +ORDER BY teams. + +-- :name list-issues :? :* +-- :doc lists all existing issue records +SELECT * FROM issues +ORDER BY issues.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-electors-by-addresse :? :* +-- :doc lists all existing elector records related to a given addresse +SELECT * +FROM electors +WHERE electors.address_id = :id +ORDER BY electors.id + +-- :name list-visits-by-canvasser :? :* +-- :doc lists all existing visit records related to a given canvasser +SELECT * +FROM visits +WHERE visits.canvasser_id = :id +ORDER BY visits.id + +-- :name list-electors :? :* +-- :doc lists all existing elector records +SELECT * FROM electors +ORDER BY electors.id +--~ (if (:offset params) "OFFSET :offset ") +--~ (if (:limit params) "LIMIT :limit" "LIMIT 100") + +-- :name list-followuprequests-by-elector :? :* +-- :doc lists all existing followuprequest records related to a given elector +SELECT * +FROM followuprequests +WHERE followuprequests.elector_id = :id +ORDER BY followuprequests.id + +-- :name update-followuprequest! :! :n +-- :doc updates an existing followuprequest record +UPDATE followuprequests +SET id = :id, + elector_id = :elector_id, + visit_id = :visit_id, + issue_id = :issue_id, + method_id = :method_id +WHERE followuprequests.id = :id + diff --git a/src/clj/youyesyet/db/core.clj b/src/clj/youyesyet/db/core.clj index a57fa50..6941257 100644 --- a/src/clj/youyesyet/db/core.clj +++ b/src/clj/youyesyet/db/core.clj @@ -17,12 +17,14 @@ Timestamp PreparedStatement])) +;; (def ^:dynamic *db* {:name "java:comp/env/jdbc/EmployeeDB"}) (defstate ^:dynamic *db* - :start (conman/connect! {:jdbc-url (env :database-url) - :driver-class-name "org.postgresql.Driver"}) - :stop (conman/disconnect! *db*)) + :start (conman/connect! {:jdbc-url-env (env :database-url) + :jdbc-url "jdbc:postgresql://127.0.0.1/youyesyet_dev?user=youyesyet&password=thisisnotsecure" + :driver-class-name "org.postgresql.Driver"}) + :stop (conman/disconnect! *db*)) -(conman/bind-connection *db* "sql/queries.sql") +(conman/bind-connection *db* "sql/queries.auto.sql") (defn to-date [^java.sql.Date sql-date] (-> sql-date (.getTime) (java.util.Date.))) diff --git a/src/clj/youyesyet/handler.clj b/src/clj/youyesyet/handler.clj index 173497e..789564f 100644 --- a/src/clj/youyesyet/handler.clj +++ b/src/clj/youyesyet/handler.clj @@ -6,6 +6,7 @@ [youyesyet.routes.authenticated :refer [authenticated-routes]] [youyesyet.routes.home :refer [home-routes]] [youyesyet.routes.oauth :refer [oauth-routes]] + [youyesyet.routes.auto-json-routes :refer [auto-rest-routes]] [compojure.route :as route] [youyesyet.env :refer [defaults]] [mount.core :as mount] @@ -63,6 +64,9 @@ (-> #'home-routes (wrap-routes middleware/wrap-csrf) (wrap-routes middleware/wrap-formats)) + (-> #'auto-rest-routes + (wrap-routes middleware/wrap-csrf) + (wrap-routes middleware/wrap-formats)) #'oauth-routes #'authenticated-routes (route/not-found @@ -71,4 +75,5 @@ :title "page not found"}))))) -(def app (middleware/wrap-base #'app-routes)) +(def app #'app-routes) + ;;(middleware/wrap-base #'app-routes)) diff --git a/src/clj/youyesyet/routes/auto_json_routes.clj b/src/clj/youyesyet/routes/auto_json_routes.clj new file mode 100644 index 0000000..8d3d707 --- /dev/null +++ b/src/clj/youyesyet/routes/auto_json_routes.clj @@ -0,0 +1,1035 @@ +(ns + youyesyet.routes.auto-json-routes + (require + [noir.response :as nresponse] + [noir.util.route :as route] + [compojure.core :refer [defroutes GET POST]] + [ring.util.http-response :as response] + [clojure.java.io :as io] + [hugsql.core :as hugsql] + [youyesyet.db.core :as db])) + + +(declare + create-addresse + create-authority + create-canvasser + create-district + create-elector + create-followupaction + create-followupmethod + create-followuprequest + create-intention + create-issue + create-issueexpertise + create-option + create-role + create-rolemembership + create-schema-migration + create-team + create-teammembership + create-teamorganisership + create-visit + delete-addresse + delete-authority + delete-canvasser + delete-district + delete-elector + delete-followupaction + delete-followupmethod + delete-followuprequest + delete-issue + delete-option + delete-visit + get-addresse + get-authority + get-canvasser + get-district + get-elector + get-followupaction + get-followupmethod + get-followuprequest + get-issue + get-option + get-visit + list-addresses + list-addresses-by-district + list-authorities + list-canvassers + list-canvassers-by-addresse + list-canvassers-by-authoritie + list-canvassers-by-elector + list-districts + list-electors + list-electors-by-addresse + list-followupactions + list-followupactions-by-canvasser + list-followupactions-by-followuprequest + list-followupmethods + list-followuprequests + list-followuprequests-by-elector + list-followuprequests-by-followupmethod + list-followuprequests-by-issue + list-followuprequests-by-visit + list-intentions-electors-by-option + list-intentions-electors-by-visit + list-intentions-options-by-elector + list-intentions-options-by-visit + list-intentions-visits-by-elector + list-intentions-visits-by-option + list-issueexpertise-canvassers-by-followupmethod + list-issueexpertise-canvassers-by-issue + list-issueexpertise-followupmethods-by-canvasser + list-issueexpertise-followupmethods-by-issue + list-issueexpertise-issues-by-canvasser + list-issueexpertise-issues-by-followupmethod + list-issues + list-options + list-rolememberships-canvassers-by-role + list-rolememberships-roles-by-canvasser + list-roles + list-schemamigrations + list-teammemberships-canvassers-by-team + list-teammemberships-teams-by-canvasser + list-teamorganiserships-canvassers-by-team + list-teamorganiserships-teams-by-canvasser + list-teams + list-teams-by-district + list-visits + list-visits-by-addresse + list-visits-by-canvasser + update-addresse + update-canvasser + update-district + update-elector + update-followupaction + update-followuprequest + update-issue + update-visit) + + +(defroutes + auto-rest-routes + (POST "/json/auto/create-addresse" request (create-addresse request)) + (POST + "/json/auto/create-authority" + request + (create-authority request)) + (POST + "/json/auto/create-canvasser" + request + (create-canvasser request)) + (POST "/json/auto/create-district" request (create-district request)) + (POST "/json/auto/create-elector" request (create-elector request)) + (POST + "/json/auto/create-followupaction" + request + (create-followupaction request)) + (POST + "/json/auto/create-followupmethod" + request + (create-followupmethod request)) + (POST + "/json/auto/create-followuprequest" + request + (create-followuprequest request)) + (POST + "/json/auto/create-intention" + request + (create-intention request)) + (POST "/json/auto/create-issue" request (create-issue request)) + (POST + "/json/auto/create-issueexpertise" + request + (create-issueexpertise request)) + (POST "/json/auto/create-option" request (create-option request)) + (POST "/json/auto/create-role" request (create-role request)) + (POST + "/json/auto/create-rolemembership" + request + (create-rolemembership request)) + (POST + "/json/auto/create-schema-migration" + request + (create-schema-migration request)) + (POST "/json/auto/create-team" request (create-team request)) + (POST + "/json/auto/create-teammembership" + request + (create-teammembership request)) + (POST + "/json/auto/create-teamorganisership" + request + (create-teamorganisership request)) + (POST "/json/auto/create-visit" request (create-visit request)) + (POST "/json/auto/delete-addresse" request (delete-addresse request)) + (POST + "/json/auto/delete-authority" + request + (delete-authority request)) + (POST + "/json/auto/delete-canvasser" + request + (delete-canvasser request)) + (POST "/json/auto/delete-district" request (delete-district request)) + (POST "/json/auto/delete-elector" request (delete-elector request)) + (POST + "/json/auto/delete-followupaction" + request + (delete-followupaction request)) + (POST + "/json/auto/delete-followupmethod" + request + (delete-followupmethod request)) + (POST + "/json/auto/delete-followuprequest" + request + (delete-followuprequest request)) + (POST "/json/auto/delete-issue" request (delete-issue request)) + (POST "/json/auto/delete-option" request (delete-option request)) + (POST "/json/auto/delete-visit" request (delete-visit request)) + (POST "/json/auto/get-addresse" request (get-addresse request)) + (POST "/json/auto/get-authority" request (get-authority request)) + (POST "/json/auto/get-canvasser" request (get-canvasser request)) + (POST "/json/auto/get-district" request (get-district request)) + (POST "/json/auto/get-elector" request (get-elector request)) + (POST + "/json/auto/get-followupaction" + request + (get-followupaction request)) + (POST + "/json/auto/get-followupmethod" + request + (get-followupmethod request)) + (POST + "/json/auto/get-followuprequest" + request + (get-followuprequest request)) + (POST "/json/auto/get-issue" request (get-issue request)) + (POST "/json/auto/get-option" request (get-option request)) + (POST "/json/auto/get-visit" request (get-visit request)) + (GET "/json/auto/list-addresses" request (list-addresses request)) + (GET + "/json/auto/list-addresses-by-district" + request + (list-addresses-by-district request)) + (GET "/json/auto/list-authorities" request (list-authorities request)) + (GET "/json/auto/list-canvassers" request (list-canvassers request)) + (GET + "/json/auto/list-canvassers-by-addresse" + request + (list-canvassers-by-addresse request)) + (GET + "/json/auto/list-canvassers-by-authoritie" + request + (list-canvassers-by-authoritie request)) + (GET + "/json/auto/list-canvassers-by-elector" + request + (list-canvassers-by-elector request)) + (GET "/json/auto/list-districts" request (list-districts request)) + (GET "/json/auto/list-electors" request (list-electors request)) + (GET + "/json/auto/list-electors-by-addresse" + request + (list-electors-by-addresse request)) + (GET + "/json/auto/list-followupactions" + request + (list-followupactions request)) + (GET + "/json/auto/list-followupactions-by-canvasser" + request + (list-followupactions-by-canvasser request)) + (GET + "/json/auto/list-followupactions-by-followuprequest" + request + (list-followupactions-by-followuprequest request)) + (GET + "/json/auto/list-followupmethods" + request + (list-followupmethods request)) + (GET + "/json/auto/list-followuprequests" + request + (list-followuprequests request)) + (GET + "/json/auto/list-followuprequests-by-elector" + request + (list-followuprequests-by-elector request)) + (GET + "/json/auto/list-followuprequests-by-followupmethod" + request + (list-followuprequests-by-followupmethod request)) + (GET + "/json/auto/list-followuprequests-by-issue" + request + (list-followuprequests-by-issue request)) + (GET + "/json/auto/list-followuprequests-by-visit" + request + (list-followuprequests-by-visit request)) + (GET + "/json/auto/list-intentions-electors-by-option" + request + (list-intentions-electors-by-option request)) + (GET + "/json/auto/list-intentions-electors-by-visit" + request + (list-intentions-electors-by-visit request)) + (GET + "/json/auto/list-intentions-options-by-elector" + request + (list-intentions-options-by-elector request)) + (GET + "/json/auto/list-intentions-options-by-visit" + request + (list-intentions-options-by-visit request)) + (GET + "/json/auto/list-intentions-visits-by-elector" + request + (list-intentions-visits-by-elector request)) + (GET + "/json/auto/list-intentions-visits-by-option" + request + (list-intentions-visits-by-option request)) + (GET + "/json/auto/list-issueexpertise-canvassers-by-followupmethod" + request + (list-issueexpertise-canvassers-by-followupmethod request)) + (GET + "/json/auto/list-issueexpertise-canvassers-by-issue" + request + (list-issueexpertise-canvassers-by-issue request)) + (GET + "/json/auto/list-issueexpertise-followupmethods-by-canvasser" + request + (list-issueexpertise-followupmethods-by-canvasser request)) + (GET + "/json/auto/list-issueexpertise-followupmethods-by-issue" + request + (list-issueexpertise-followupmethods-by-issue request)) + (GET + "/json/auto/list-issueexpertise-issues-by-canvasser" + request + (list-issueexpertise-issues-by-canvasser request)) + (GET + "/json/auto/list-issueexpertise-issues-by-followupmethod" + request + (list-issueexpertise-issues-by-followupmethod request)) + (GET "/json/auto/list-issues" request (list-issues request)) + (GET "/json/auto/list-options" request (list-options request)) + (GET + "/json/auto/list-rolememberships-canvassers-by-role" + request + (list-rolememberships-canvassers-by-role request)) + (GET + "/json/auto/list-rolememberships-roles-by-canvasser" + request + (list-rolememberships-roles-by-canvasser request)) + (GET "/json/auto/list-roles" request (list-roles request)) + (GET + "/json/auto/list-schemamigrations" + request + (list-schemamigrations request)) + (GET + "/json/auto/list-teammemberships-canvassers-by-team" + request + (list-teammemberships-canvassers-by-team request)) + (GET + "/json/auto/list-teammemberships-teams-by-canvasser" + request + (list-teammemberships-teams-by-canvasser request)) + (GET + "/json/auto/list-teamorganiserships-canvassers-by-team" + request + (list-teamorganiserships-canvassers-by-team request)) + (GET + "/json/auto/list-teamorganiserships-teams-by-canvasser" + request + (list-teamorganiserships-teams-by-canvasser request)) + (GET "/json/auto/list-teams" request (list-teams request)) + (GET + "/json/auto/list-teams-by-district" + request + (list-teams-by-district request)) + (GET "/json/auto/list-visits" request (list-visits request)) + (GET + "/json/auto/list-visits-by-addresse" + request + (list-visits-by-addresse request)) + (GET + "/json/auto/list-visits-by-canvasser" + request + (list-visits-by-canvasser request)) + (POST "/json/auto/update-addresse" request (update-addresse request)) + (POST + "/json/auto/update-canvasser" + request + (update-canvasser request)) + (POST "/json/auto/update-district" request (update-district request)) + (POST "/json/auto/update-elector" request (update-elector request)) + (POST + "/json/auto/update-followupaction" + request + (update-followupaction request)) + (POST + "/json/auto/update-followuprequest" + request + (update-followuprequest request)) + (POST "/json/auto/update-issue" request (update-issue request)) + (POST "/json/auto/update-visit" request (update-visit request))) + + +(defn + create-addresse + "Auto-generated method to insert one record to the addresses table. Expects the following key(s) to be present in `params`: (:id :address :postcode :phone :district_id :latitude :longitude). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-addresse! params))) + + +(defn + create-authority + "Auto-generated method to insert one record to the authorities table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-authority! params))) + + +(defn + create-canvasser + "Auto-generated method to insert one record to the canvassers table. Expects the following key(s) to be present in `params`: (:id :username :fullname :elector_id :address_id :phone :email :authority_id :authorised). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-canvasser! params))) + + +(defn + create-district + "Auto-generated method to insert one record to the districts table. Expects the following key(s) to be present in `params`: (:id :name). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-district! params))) + + +(defn + create-elector + "Auto-generated method to insert one record to the electors table. Expects the following key(s) to be present in `params`: (:id :name :address_id :phone :email). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-elector! params))) + + +(defn + create-followupaction + "Auto-generated method to insert one record to the followupactions table. Expects the following key(s) to be present in `params`: (:id :request_id :actor :date :notes :closed). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-followupaction! params))) + + +(defn + create-followupmethod + "Auto-generated method to insert one record to the followupmethods table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-followupmethod! params))) + + +(defn + create-followuprequest + "Auto-generated method to insert one record to the followuprequests table. Expects the following key(s) to be present in `params`: (:id :elector_id :visit_id :issue_id :method_id). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-followuprequest! params))) + + +(defn + create-intention + "Auto-generated method to insert one record to the intentions table. Expects the following key(s) to be present in `params`: (:visit_id :elector_id :option_id). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-intention! params))) + + +(defn + create-issue + "Auto-generated method to insert one record to the issues table. Expects the following key(s) to be present in `params`: (:id :url). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-issue! params))) + + +(defn + create-issueexpertise + "Auto-generated method to insert one record to the issueexpertise table. Expects the following key(s) to be present in `params`: (:canvasser_id :issue_id :method_id). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-issueexpertise! params))) + + +(defn + create-option + "Auto-generated method to insert one record to the options table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-option! params))) + + +(defn + create-role + "Auto-generated method to insert one record to the roles table. Expects the following key(s) to be present in `params`: (:id :name). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-role! params))) + + +(defn + create-rolemembership + "Auto-generated method to insert one record to the rolememberships table. Expects the following key(s) to be present in `params`: (:role_id :canvasser_id). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-rolemembership! params))) + + +(defn + create-schema-migration + "Auto-generated method to insert one record to the schema_migrations table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-schema-migration! params))) + + +(defn + create-team + "Auto-generated method to insert one record to the teams table. Expects the following key(s) to be present in `params`: (:id :name :district_id :latitude :longitude). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-team! params))) + + +(defn + create-teammembership + "Auto-generated method to insert one record to the teammemberships table. Expects the following key(s) to be present in `params`: (:team_id :canvasser_id). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-teammembership! params))) + + +(defn + create-teamorganisership + "Auto-generated method to insert one record to the teamorganiserships table. Expects the following key(s) to be present in `params`: (:team_id :canvasser_id). Returns a map containing the keys nil identifying the record created." + [{:keys [params]}] + (do (db/create-teamorganisership! params))) + + +(defn + create-visit + "Auto-generated method to insert one record to the visits table. Expects the following key(s) to be present in `params`: (:id :address_id :canvasser_id :date). Returns a map containing the keys (:id) identifying the record created." + [{:keys [params]}] + (do (db/create-visit! params))) + + +(defn + delete-addresse + "Auto-generated method to delete one record from the addresses table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-addresse! params)) + (response/found "/")) + + +(defn + delete-authority + "Auto-generated method to delete one record from the authorities table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-authority! params)) + (response/found "/")) + + +(defn + delete-canvasser + "Auto-generated method to delete one record from the canvassers table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-canvasser! params)) + (response/found "/")) + + +(defn + delete-district + "Auto-generated method to delete one record from the districts table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-district! params)) + (response/found "/")) + + +(defn + delete-elector + "Auto-generated method to delete one record from the electors table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-elector! params)) + (response/found "/")) + + +(defn + delete-followupaction + "Auto-generated method to delete one record from the followupactions table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-followupaction! params)) + (response/found "/")) + + +(defn + delete-followupmethod + "Auto-generated method to delete one record from the followupmethods table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-followupmethod! params)) + (response/found "/")) + + +(defn + delete-followuprequest + "Auto-generated method to delete one record from the followuprequests table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-followuprequest! params)) + (response/found "/")) + + +(defn + delete-issue + "Auto-generated method to delete one record from the issues table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-issue! params)) + (response/found "/")) + + +(defn + delete-option + "Auto-generated method to delete one record from the options table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-option! params)) + (response/found "/")) + + +(defn + delete-visit + "Auto-generated method to delete one record from the visits table. Expects the following key(s) to be present in `params`: (:id)." + [{:keys [params]}] + (do (db/delete-visit! params)) + (response/found "/")) + + +(defn + get-addresse + "Auto-generated method to select one record from the addresses table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:address :district_id :id :latitude :longitude :phone :postcode)." + [{:keys [params]}] + (do (db/get-addresse params))) + + +(defn + get-authority + "Auto-generated method to select one record from the authorities table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:id)." + [{:keys [params]}] + (do (db/get-authority params))) + + +(defn + get-canvasser + "Auto-generated method to select one record from the canvassers table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:address_id :authorised :authority_id :elector_id :email :fullname :id :phone :username)." + [{:keys [params]}] + (do (db/get-canvasser params))) + + +(defn + get-district + "Auto-generated method to select one record from the districts table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:id :name)." + [{:keys [params]}] + (do (db/get-district params))) + + +(defn + get-elector + "Auto-generated method to select one record from the electors table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:address_id :email :id :name :phone)." + [{:keys [params]}] + (do (db/get-elector params))) + + +(defn + get-followupaction + "Auto-generated method to select one record from the followupactions table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:actor :closed :date :id :notes :request_id)." + [{:keys [params]}] + (do (db/get-followupaction params))) + + +(defn + get-followupmethod + "Auto-generated method to select one record from the followupmethods table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:id)." + [{:keys [params]}] + (do (db/get-followupmethod params))) + + +(defn + get-followuprequest + "Auto-generated method to select one record from the followuprequests table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:elector_id :id :issue_id :method_id :visit_id)." + [{:keys [params]}] + (do (db/get-followuprequest params))) + + +(defn + get-issue + "Auto-generated method to select one record from the issues table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:id :url)." + [{:keys [params]}] + (do (db/get-issue params))) + + +(defn + get-option + "Auto-generated method to select one record from the options table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:id)." + [{:keys [params]}] + (do (db/get-option params))) + + +(defn + get-visit + "Auto-generated method to select one record from the visits table. Expects the following key(s) to be present in `params`: (:id). Returns a map containing the following keys: (:address_id :canvasser_id :date :id)." + [{:keys [params]}] + (do (db/get-visit params))) + + +(defn + list-addresses + "Auto-generated method to select all records from the addresses table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:address :district_id :id :latitude :longitude :phone :postcode)." + [{:keys [params]}] + (do (db/list-addresses params))) + + +(defn + list-addresses-by-district + [{:keys [params]}] + (do (db/list-addresses-by-district params))) + + +(defn + list-authorities + "Auto-generated method to select all records from the authorities table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id)." + [{:keys [params]}] + (do (db/list-authorities params))) + + +(defn + list-canvassers + "Auto-generated method to select all records from the canvassers table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:address_id :authorised :authority_id :elector_id :email :fullname :id :phone :username)." + [{:keys [params]}] + (do (db/list-canvassers params))) + + +(defn + list-canvassers-by-addresse + [{:keys [params]}] + (do (db/list-canvassers-by-addresse params))) + + +(defn + list-canvassers-by-authoritie + [{:keys [params]}] + (do (db/list-canvassers-by-authoritie params))) + + +(defn + list-canvassers-by-elector + [{:keys [params]}] + (do (db/list-canvassers-by-elector params))) + + +(defn + list-districts + "Auto-generated method to select all records from the districts table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id :name)." + [{:keys [params]}] + (do (db/list-districts params))) + + +(defn + list-electors + "Auto-generated method to select all records from the electors table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:address_id :email :id :name :phone)." + [{:keys [params]}] + (do (db/list-electors params))) + + +(defn + list-electors-by-addresse + [{:keys [params]}] + (do (db/list-electors-by-addresse params))) + + +(defn + list-followupactions + "Auto-generated method to select all records from the followupactions table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:actor :closed :date :id :notes :request_id)." + [{:keys [params]}] + (do (db/list-followupactions params))) + + +(defn + list-followupactions-by-canvasser + [{:keys [params]}] + (do (db/list-followupactions-by-canvasser params))) + + +(defn + list-followupactions-by-followuprequest + [{:keys [params]}] + (do (db/list-followupactions-by-followuprequest params))) + + +(defn + list-followupmethods + "Auto-generated method to select all records from the followupmethods table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id)." + [{:keys [params]}] + (do (db/list-followupmethods params))) + + +(defn + list-followuprequests + "Auto-generated method to select all records from the followuprequests table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:elector_id :id :issue_id :method_id :visit_id)." + [{:keys [params]}] + (do (db/list-followuprequests params))) + + +(defn + list-followuprequests-by-elector + [{:keys [params]}] + (do (db/list-followuprequests-by-elector params))) + + +(defn + list-followuprequests-by-followupmethod + [{:keys [params]}] + (do (db/list-followuprequests-by-followupmethod params))) + + +(defn + list-followuprequests-by-issue + [{:keys [params]}] + (do (db/list-followuprequests-by-issue params))) + + +(defn + list-followuprequests-by-visit + [{:keys [params]}] + (do (db/list-followuprequests-by-visit params))) + + +(defn + list-intentions-electors-by-option + [{:keys [params]}] + (do (db/list-intentions-electors-by-option params))) + + +(defn + list-intentions-electors-by-visit + [{:keys [params]}] + (do (db/list-intentions-electors-by-visit params))) + + +(defn + list-intentions-options-by-elector + [{:keys [params]}] + (do (db/list-intentions-options-by-elector params))) + + +(defn + list-intentions-options-by-visit + [{:keys [params]}] + (do (db/list-intentions-options-by-visit params))) + + +(defn + list-intentions-visits-by-elector + [{:keys [params]}] + (do (db/list-intentions-visits-by-elector params))) + + +(defn + list-intentions-visits-by-option + [{:keys [params]}] + (do (db/list-intentions-visits-by-option params))) + + +(defn + list-issueexpertise-canvassers-by-followupmethod + [{:keys [params]}] + (do (db/list-issueexpertise-canvassers-by-followupmethod params))) + + +(defn + list-issueexpertise-canvassers-by-issue + [{:keys [params]}] + (do (db/list-issueexpertise-canvassers-by-issue params))) + + +(defn + list-issueexpertise-followupmethods-by-canvasser + [{:keys [params]}] + (do (db/list-issueexpertise-followupmethods-by-canvasser params))) + + +(defn + list-issueexpertise-followupmethods-by-issue + [{:keys [params]}] + (do (db/list-issueexpertise-followupmethods-by-issue params))) + + +(defn + list-issueexpertise-issues-by-canvasser + [{:keys [params]}] + (do (db/list-issueexpertise-issues-by-canvasser params))) + + +(defn + list-issueexpertise-issues-by-followupmethod + [{:keys [params]}] + (do (db/list-issueexpertise-issues-by-followupmethod params))) + + +(defn + list-issues + "Auto-generated method to select all records from the issues table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id :url)." + [{:keys [params]}] + (do (db/list-issues params))) + + +(defn + list-options + "Auto-generated method to select all records from the options table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id)." + [{:keys [params]}] + (do (db/list-options params))) + + +(defn + list-rolememberships-canvassers-by-role + [{:keys [params]}] + (do (db/list-rolememberships-canvassers-by-role params))) + + +(defn + list-rolememberships-roles-by-canvasser + [{:keys [params]}] + (do (db/list-rolememberships-roles-by-canvasser params))) + + +(defn + list-roles + "Auto-generated method to select all records from the roles table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id :name)." + [{:keys [params]}] + (do (db/list-roles params))) + + +(defn + list-schemamigrations + "Auto-generated method to select all records from the schema_migrations table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:id)." + [{:keys [params]}] + (do (db/list-schema_migrations params))) + + +(defn + list-teammemberships-canvassers-by-team + [{:keys [params]}] + (do (db/list-teammemberships-canvassers-by-team params))) + + +(defn + list-teammemberships-teams-by-canvasser + [{:keys [params]}] + (do (db/list-teammemberships-teams-by-canvasser params))) + + +(defn + list-teamorganiserships-canvassers-by-team + [{:keys [params]}] + (do (db/list-teamorganiserships-canvassers-by-team params))) + + +(defn + list-teamorganiserships-teams-by-canvasser + [{:keys [params]}] + (do (db/list-teamorganiserships-teams-by-canvasser params))) + + +(defn + list-teams + "Auto-generated method to select all records from the teams table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:district_id :id :latitude :longitude :name)." + [{:keys [params]}] + (do (db/list-teams params))) + + +(defn + list-teams-by-district + [{:keys [params]}] + (do (db/list-teams-by-district params))) + + +(defn + list-visits + "Auto-generated method to select all records from the visits table. If the keys (:limit :offset) are present in the request then they will be used to page through the data. Returns a sequence of maps each containing the following keys: (:address_id :canvasser_id :date :id)." + [{:keys [params]}] + (do (db/list-visits params))) + + +(defn + list-visits-by-addresse + [{:keys [params]}] + (do (db/list-visits-by-addresse params))) + + +(defn + list-visits-by-canvasser + [{:keys [params]}] + (do (db/list-visits-by-canvasser params))) + + +(defn + update-addresse + "Auto-generated method to update one record in the addresses table. Expects the following key(s) to be present in `params`: (:address :district_id :id :latitude :longitude :phone :postcode)." + [{:keys [params]}] + (do (db/update-addresse! params)) + (response/found "/")) + + +(defn + update-canvasser + "Auto-generated method to update one record in the canvassers table. Expects the following key(s) to be present in `params`: (:address_id :authorised :authority_id :elector_id :email :fullname :id :phone :username)." + [{:keys [params]}] + (do (db/update-canvasser! params)) + (response/found "/")) + + +(defn + update-district + "Auto-generated method to update one record in the districts table. Expects the following key(s) to be present in `params`: (:id :name)." + [{:keys [params]}] + (do (db/update-district! params)) + (response/found "/")) + + +(defn + update-elector + "Auto-generated method to update one record in the electors table. Expects the following key(s) to be present in `params`: (:address_id :email :id :name :phone)." + [{:keys [params]}] + (do (db/update-elector! params)) + (response/found "/")) + + +(defn + update-followupaction + "Auto-generated method to update one record in the followupactions table. Expects the following key(s) to be present in `params`: (:actor :closed :date :id :notes :request_id)." + [{:keys [params]}] + (do (db/update-followupaction! params)) + (response/found "/")) + + +(defn + update-followuprequest + "Auto-generated method to update one record in the followuprequests table. Expects the following key(s) to be present in `params`: (:elector_id :id :issue_id :method_id :visit_id)." + [{:keys [params]}] + (do (db/update-followuprequest! params)) + (response/found "/")) + + +(defn + update-issue + "Auto-generated method to update one record in the issues table. Expects the following key(s) to be present in `params`: (:id :url)." + [{:keys [params]}] + (do (db/update-issue! params)) + (response/found "/")) + + +(defn + update-visit + "Auto-generated method to update one record in the visits table. Expects the following key(s) to be present in `params`: (:address_id :canvasser_id :date :id)." + [{:keys [params]}] + (do (db/update-visit! params)) + (response/found "/")) + + diff --git a/src/clj/youyesyet/routes/rest.clj b/src/clj/youyesyet/routes/rest.clj index 6ca9b3f..c164b9b 100644 --- a/src/clj/youyesyet/routes/rest.clj +++ b/src/clj/youyesyet/routes/rest.clj @@ -40,7 +40,7 @@ (defn get-issues "Get current issues. No arguments expected." - [request] + [request]) (defroutes rest-routes (GET "/rest/get-local-data" request (route/restricted (get-local-data request)))