diff options
-rwxr-xr-x | bin/update-schema | 1 | ||||
-rw-r--r-- | db/downgrade_0067---0066.sql | 6 | ||||
-rwxr-xr-x | db/rerun_dbic_loader.pl | 5 | ||||
-rw-r--r-- | db/schema.sql | 16 | ||||
-rw-r--r-- | db/schema_0067-user-roles.sql | 19 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Body.pm | 10 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Role.pm | 53 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/User.pm | 10 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/UserRole.pm | 50 |
9 files changed, 165 insertions, 5 deletions
diff --git a/bin/update-schema b/bin/update-schema index 9aff9ec5b..900e628e6 100755 --- a/bin/update-schema +++ b/bin/update-schema @@ -212,6 +212,7 @@ else { # (assuming schema change files are never half-applied, which should be the case) sub get_db_version { return 'EMPTY' if ! table_exists('problem'); + return '0067' if table_exists('roles'); return '0066' if column_exists('users', 'area_ids'); return '0065' if constraint_contains('admin_log_object_type_check', 'moderation'); return '0064' if index_exists('moderation_original_data_problem_id_comment_id_idx'); diff --git a/db/downgrade_0067---0066.sql b/db/downgrade_0067---0066.sql new file mode 100644 index 000000000..cb74315bd --- /dev/null +++ b/db/downgrade_0067---0066.sql @@ -0,0 +1,6 @@ +BEGIN; + +DROP TABLE user_roles; +DROP TABLE roles; + +COMMIT; diff --git a/db/rerun_dbic_loader.pl b/db/rerun_dbic_loader.pl index 1eff12d9e..9ee029668 100755 --- a/db/rerun_dbic_loader.pl +++ b/db/rerun_dbic_loader.pl @@ -27,7 +27,10 @@ my @tables_to_ignore = ( my $exclude = '^(?:' . join( '|', @tables_to_ignore ) . ')$'; make_schema_at( - 'FixMyStreet::DB::Schema', + # Something funny here if you use FixMyStreet::DB::Schema, where it should be, + # as it tries to dump it twice and dies on reload; with this, it works, but + # then the changes to DB.pm need removing + 'FixMyStreet::DB', { debug => 0, # switch on to be chatty dump_directory => './perllib', # edit files in place diff --git a/db/schema.sql b/db/schema.sql index 98005028c..93d73ab00 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -73,6 +73,22 @@ create unique index body_areas_body_id_area_id_idx on body_areas(body_id, area_i ALTER TABLE users ADD CONSTRAINT users_from_body_fkey FOREIGN KEY (from_body) REFERENCES body(id); +-- roles table +create table roles ( + id serial not null primary key, + body_id integer not null references body(id) ON DELETE CASCADE, + name text, + permissions text ARRAY, + unique(body_id, name) +); + +-- Record which role(s) each user holds +create table user_roles ( + id serial not null primary key, + role_id integer not null references roles(id) ON DELETE CASCADE, + user_id integer not null references users(id) ON DELETE CASCADE +); + -- The contact for a category within a particular body create table contacts ( id serial primary key, diff --git a/db/schema_0067-user-roles.sql b/db/schema_0067-user-roles.sql new file mode 100644 index 000000000..d3d773105 --- /dev/null +++ b/db/schema_0067-user-roles.sql @@ -0,0 +1,19 @@ +BEGIN; + +-- roles table +create table roles ( + id serial not null primary key, + body_id integer not null references body(id) ON DELETE CASCADE, + name text, + permissions text ARRAY, + unique(body_id, name) +); + +-- Record which role(s) each user holds +create table user_roles ( + id serial not null primary key, + role_id integer not null references roles(id) ON DELETE CASCADE, + user_id integer not null references users(id) ON DELETE CASCADE +); + +COMMIT; diff --git a/perllib/FixMyStreet/DB/Result/Body.pm b/perllib/FixMyStreet/DB/Result/Body.pm index 663181746..9424eaf03 100644 --- a/perllib/FixMyStreet/DB/Result/Body.pm +++ b/perllib/FixMyStreet/DB/Result/Body.pm @@ -117,6 +117,12 @@ __PACKAGE__->has_many( { cascade_copy => 0, cascade_delete => 0 }, ); __PACKAGE__->has_many( + "roles", + "FixMyStreet::DB::Result::Role", + { "foreign.body_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); +__PACKAGE__->has_many( "user_body_permissions", "FixMyStreet::DB::Result::UserBodyPermission", { "foreign.body_id" => "self.id" }, @@ -130,8 +136,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-04-25 12:06:39 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:8CuxbffDaYS7TFlgff1nEg +# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-05-23 18:03:28 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:9sFgYQ9qhnZNcz3kUFYuvg __PACKAGE__->load_components("+FixMyStreet::DB::RABXColumn"); __PACKAGE__->rabx_column('extra'); diff --git a/perllib/FixMyStreet/DB/Result/Role.pm b/perllib/FixMyStreet/DB/Result/Role.pm new file mode 100644 index 000000000..17a752f02 --- /dev/null +++ b/perllib/FixMyStreet/DB/Result/Role.pm @@ -0,0 +1,53 @@ +use utf8; +package FixMyStreet::DB::Result::Role; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; +__PACKAGE__->load_components( + "FilterColumn", + "FixMyStreet::InflateColumn::DateTime", + "FixMyStreet::EncodedColumn", +); +__PACKAGE__->table("roles"); +__PACKAGE__->add_columns( + "id", + { + data_type => "integer", + is_auto_increment => 1, + is_nullable => 0, + sequence => "roles_id_seq", + }, + "body_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "name", + { data_type => "text", is_nullable => 1 }, + "permissions", + { data_type => "text[]", is_nullable => 1 }, +); +__PACKAGE__->set_primary_key("id"); +__PACKAGE__->add_unique_constraint("roles_body_id_name_key", ["body_id", "name"]); +__PACKAGE__->belongs_to( + "body", + "FixMyStreet::DB::Result::Body", + { id => "body_id" }, + { is_deferrable => 0, on_delete => "CASCADE,", on_update => "NO ACTION" }, +); +__PACKAGE__->has_many( + "user_roles", + "FixMyStreet::DB::Result::UserRole", + { "foreign.role_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-05-23 18:03:28 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KkzVQZuzExH8PhZLJsnZgg + + +# You can replace this text with custom code or comments, and it will be preserved on regeneration +1; diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm index d01ba92d0..5719b3150 100644 --- a/perllib/FixMyStreet/DB/Result/User.pm +++ b/perllib/FixMyStreet/DB/Result/User.pm @@ -121,10 +121,16 @@ __PACKAGE__->has_many( { "foreign.user_id" => "self.id" }, { cascade_copy => 0, cascade_delete => 0 }, ); +__PACKAGE__->has_many( + "user_roles", + "FixMyStreet::DB::Result::UserRole", + { "foreign.user_id" => "self.id" }, + { cascade_copy => 0, cascade_delete => 0 }, +); -# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-04-25 12:06:39 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:BCCqv3JCec8psuRk/SdCJQ +# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-05-23 18:03:28 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qtmzA7ywVkyQpjLh1ienNg # These are not fully unique constraints (they only are when the *_verified # is true), but this is managed in ResultSet::User's find() wrapper. diff --git a/perllib/FixMyStreet/DB/Result/UserRole.pm b/perllib/FixMyStreet/DB/Result/UserRole.pm new file mode 100644 index 000000000..9186e2aa1 --- /dev/null +++ b/perllib/FixMyStreet/DB/Result/UserRole.pm @@ -0,0 +1,50 @@ +use utf8; +package FixMyStreet::DB::Result::UserRole; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; +__PACKAGE__->load_components( + "FilterColumn", + "FixMyStreet::InflateColumn::DateTime", + "FixMyStreet::EncodedColumn", +); +__PACKAGE__->table("user_roles"); +__PACKAGE__->add_columns( + "id", + { + data_type => "integer", + is_auto_increment => 1, + is_nullable => 0, + sequence => "user_roles_id_seq", + }, + "role_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, + "user_id", + { data_type => "integer", is_foreign_key => 1, is_nullable => 0 }, +); +__PACKAGE__->set_primary_key("id"); +__PACKAGE__->belongs_to( + "role", + "FixMyStreet::DB::Result::Role", + { id => "role_id" }, + { is_deferrable => 0, on_delete => "CASCADE,", on_update => "NO ACTION" }, +); +__PACKAGE__->belongs_to( + "user", + "FixMyStreet::DB::Result::User", + { id => "user_id" }, + { is_deferrable => 0, on_delete => "CASCADE,", on_update => "NO ACTION" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07035 @ 2019-05-23 16:52:59 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1BSR4j0o5PApKEZmzVAnLg + + +# You can replace this text with custom code or comments, and it will be preserved on regeneration +1; |