Skip to content

Commit

Permalink
Add user roles tables
Browse files Browse the repository at this point in the history
  • Loading branch information
davea authored and dracos committed May 28, 2019
1 parent f763cb9 commit abbbc9b
Show file tree
Hide file tree
Showing 9 changed files with 165 additions and 5 deletions.
1 change: 1 addition & 0 deletions bin/update-schema
Expand Up @@ -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');
Expand Down
6 changes: 6 additions & 0 deletions db/downgrade_0067---0066.sql
@@ -0,0 +1,6 @@
BEGIN;

DROP TABLE user_roles;
DROP TABLE roles;

COMMIT;
5 changes: 4 additions & 1 deletion db/rerun_dbic_loader.pl
Expand Up @@ -27,7 +27,10 @@ BEGIN
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
Expand Down
16 changes: 16 additions & 0 deletions db/schema.sql
Expand Up @@ -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,
Expand Down
19 changes: 19 additions & 0 deletions 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;
10 changes: 8 additions & 2 deletions perllib/FixMyStreet/DB/Result/Body.pm
Expand Up @@ -116,6 +116,12 @@ __PACKAGE__->has_many(
{ "foreign.body_id" => "self.id" },
{ 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",
Expand All @@ -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');
Expand Down
53 changes: 53 additions & 0 deletions 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;
10 changes: 8 additions & 2 deletions perllib/FixMyStreet/DB/Result/User.pm
Expand Up @@ -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.
Expand Down
50 changes: 50 additions & 0 deletions 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;

0 comments on commit abbbc9b

Please sign in to comment.