diff --git a/resources/migrations/20161014170335-basic-setup.up.sql b/resources/migrations/20161014170335-basic-setup.up.sql index 0719e57..b7b3277 100644 --- a/resources/migrations/20161014170335-basic-setup.up.sql +++ b/resources/migrations/20161014170335-basic-setup.up.sql @@ -118,15 +118,16 @@ ALTER TABLE public.authorities OWNER TO youyesyet; -- CREATE TABLE IF NOT EXISTS canvassers ( - id serial, - username character varying(32) NOT NULL, - fullname character varying(64) NOT NULL, - elector_id integer, - address_id integer NOT NULL, - phone character varying(16), - email character varying(128), - authority_id character varying(32) NOT NULL, - authorised boolean + id serial, + username character varying(32) NOT NULL, + fullname character varying(64) NOT NULL, + elector_id integer, + address_id integer NOT NULL, + phone character varying(16), + email character varying(128), + authority_id character varying(32) NOT NULL, + introduced_by int references canvassers(id), + authorised boolean ); --;; @@ -534,6 +535,8 @@ ALTER TABLE ONLY canvassers ADD CONSTRAINT canvassers_elector_id_fkey FOREIGN KEY (elector_id) REFERENCES electors(id); --;; +create unique index canvassers_username_ix on canvassers (username); +create unique index canvassers_email_ix on canvassers(email); -- -- Name: electors_address_id_fkey; Type: FK CONSTRAINT; Schema: public; Owner: youyesyet diff --git a/resources/migrations/20170401115900-basic-reference-data-down.sql b/resources/migrations/20170401115900-basic-reference-data-down.sql deleted file mode 100644 index e69de29..0000000 diff --git a/resources/migrations/20170401115900-basic-reference-data.down.sql b/resources/migrations/20170401115900-basic-reference-data.down.sql new file mode 100644 index 0000000..a0b3aa1 --- /dev/null +++ b/resources/migrations/20170401115900-basic-reference-data.down.sql @@ -0,0 +1,17 @@ +-- this is just a teardown of everything set up in the corresponding .up.sql file + +delete from roles where name = 'Expert'; +delete from roles where name = 'Administrator'; +delete from roles where name = 'Recruiter'; +delete from roles where name = 'Organiser'; +delete from roles where name = 'Editor'; + +alter table issues drop column content; +alter table issues drop column current; + +delete from issues where id = 'Currency'; +delete from issues where id = 'Monarchy'; +delete from issues where id = 'Defence'; + +delete from options where id = 'Yes'; +delete from options where id = 'No'; diff --git a/resources/migrations/20170401115900-basic-reference-data-up.sql b/resources/migrations/20170401115900-basic-reference-data.up.sql similarity index 97% rename from resources/migrations/20170401115900-basic-reference-data-up.sql rename to resources/migrations/20170401115900-basic-reference-data.up.sql index 6ca3028..26d3bf1 100644 --- a/resources/migrations/20170401115900-basic-reference-data-up.sql +++ b/resources/migrations/20170401115900-basic-reference-data.up.sql @@ -37,7 +37,7 @@ alter table issues add column content varchar(1024); -- from the system but kept because it may become current again later. Only -- current issues are shown in the app. Typically not fewer than three and not -- more than about seven issues should be current at any time. -alter table issues add column current default false; +alter table issues add column current boolean default false; insert into issues (id, content, current) values ('Currency', 'Scotland could keep the Pound, or use the Euro. But we could also set up a new currency of our own.', diff --git a/resources/migrations/20170415102900-core-views.down.sql b/resources/migrations/20170415102900-core-views.down.sql new file mode 100644 index 0000000..c576947 --- /dev/null +++ b/resources/migrations/20170415102900-core-views.down.sql @@ -0,0 +1,11 @@ +drop view if exists roles_by_canvasser; + +drop view if exists teams_by_canvasser; + +drop view if exists canvassers_by_team; + +drop view if exists canvassers_by_introducer; + +drop view if exists teams_by_organiser; + +drop view if exists organisers_by_team; diff --git a/resources/migrations/20170415102900-core-views.up.sql b/resources/migrations/20170415102900-core-views.up.sql new file mode 100644 index 0000000..53346a6 --- /dev/null +++ b/resources/migrations/20170415102900-core-views.up.sql @@ -0,0 +1,59 @@ + +create view roles_by_canvasser as + select canvassers.id as canvasser, roles.name + from roles, rolememberships, canvassers + where roles.id = rolememberships.role_id + and canvassers.id = rolememberships.canvasser_id + and canvassers.authorised = true; + +create view teams_by_canvasser as + select canvassers.id as canvasser, teams.id, teams.name, teams.latitude, teams.longitude + from teams, teammemberships, canvassers + where teams.id = teammemberships.team_id + and canvassers.id = teammemberships.canvasser_id; + +create view canvassers_by_team as + select teams.id as team, + canvassers.id, + canvassers.username, + canvassers.fullname, + canvassers.email, + canvassers.phone + from teams, teammemberships, canvassers + where teams.id = teammemberships.team_id + and canvassers.id = teammemberships.canvasser_id + and canvassers.authorised = true; + +create view canvassers_by_introducer as + select introducers.id as introducer, + canvassers.id as canvasser, + canvassers.username, + canvassers.fullname, + canvassers.email, + canvassers.phone, + canvassers.authorised + from canvassers, canvassers as introducers + where introducers.id = canvassers.introduced_by; + +create view teams_by_organiser as + select canvassers.id as organiser, + teams.id, + teams.name, + teams.latitude, + teams.longitude + from teams, teamorganiserships, canvassers + where teams.id = teamorganiserships.team_id + and canvassers.id = teamorganiserships.canvasser_id + and canvassers.authorised = true; + +create view organisers_by_team as + select teams.id as team, + canvassers.id, + canvassers.username, + canvassers.fullname, + canvassers.email, + canvassers.phone + from teams, teamorganiserships, canvassers + where teams.id = teamorganiserships.team_id + and canvassers.id = teamorganiserships.canvasser_id + and canvassers.authorised = true; diff --git a/resources/sql/queries.sql b/resources/sql/queries.sql index 29a9d67..0689475 100644 --- a/resources/sql/queries.sql +++ b/resources/sql/queries.sql @@ -239,3 +239,37 @@ SELECT * FROM visits WHERE id = :id -- visits is audit data; we don't delete it. + + +-- views are select only + +-- :name get-roles-by-canvasser :? :* +-- :doc Get the role names for the canvasser with the specified id +select name from roles_by_canvasser + where canvasser = :canvasser + +-- :name get-teams-by-canvasser :? :* +-- :doc Get details of the teams which the canvasser with the specified id is member of. +select * from teams_by_canvasser + where canvasser = :canvasser_id + +-- :name get-canvassers-by-team :? :* +-- :doc Get details of all canvassers who are members of the team with the specified id +select * from canvassers_by_team + where team = :team_id + +-- :name get-canvassers-by-team :? :* +-- :doc Get details of all authorised canvassers who are members of this team. +select * from canvassers_by_introducer + where introducer = :introducer_id + +-- :name get-teams_by_organiser :? :* +-- :doc Get details of all the teams organised by the canvasser with the specified id +select * from teams_by_organiser + where organiser = :organiser_id + +-- :name get-organisers-by-team :? :* +-- :doc Get details of all organisers of the team with the specified id +select * from organisers_by_team + where team = :team_id + diff --git a/src/clj/youyesyet/handler.clj b/src/clj/youyesyet/handler.clj index ad5462d..e25b53c 100644 --- a/src/clj/youyesyet/handler.clj +++ b/src/clj/youyesyet/handler.clj @@ -1,6 +1,7 @@ (ns youyesyet.handler (:require [compojure.core :refer [routes wrap-routes]] [youyesyet.layout :refer [error-page]] + [youyesyet.routes.authenticated :refer [authenticated-routes]] [youyesyet.routes.home :refer [home-routes]] [youyesyet.routes.oauth :refer [oauth-routes]] [compojure.route :as route] @@ -61,6 +62,7 @@ (wrap-routes middleware/wrap-csrf) (wrap-routes middleware/wrap-formats)) #'oauth-routes + #'authenticated-routes (route/not-found (:body (error-page {:status 404 diff --git a/src/clj/youyesyet/routes/authenticated.clj b/src/clj/youyesyet/routes/authenticated.clj index 7e38955..d0f4d3f 100644 --- a/src/clj/youyesyet/routes/authenticated.clj +++ b/src/clj/youyesyet/routes/authenticated.clj @@ -33,12 +33,22 @@ ;;; This code adapted from http://www.luminusweb.net/docs#accessing_the_database -(defn canvassers-page +(defn canvasser-page [request] (if (:params request) (let [params (:params request)] (if (:id params) (db/update-canvasser! params) - (db/create-canvasser! params))))) + (db/create-canvasser! params)) + ))) +(defn routing-page + "Render the routing page, which offers routes according to the user's roles" + [] + (layout/render "routing.html")) + +(defroutes authenticated-routes + (GET "/edit-canvasser" request (canvasser-page request)) + (POST "/edit-canvasser" request (canvasser-page request)) + (GET "/routing" [] (routing-page)))