aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App/Controller/Admin/Roles.pm
blob: 279ee695c318441e34106ecd85da2508212c68ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package FixMyStreet::App::Controller::Admin::Roles;
use Moose;
use namespace::autoclean;

BEGIN { extends 'Catalyst::Controller'; }

use FixMyStreet::App::Form::Role;

sub auto :Private {
    my ($self, $c) = @_;

    my $user = $c->user;
    if ($user->is_superuser) {
        $c->stash(rs => $c->model('DB::Role')->search_rs({}, {
            prefetch => 'body',
            order_by => ['body.name', 'me.name']
        }));
    } elsif ($user->from_body) {
        $c->stash(rs => $user->from_body->roles->search_rs({}, { order_by => 'name' }));
    }
}

sub index :Path :Args(0) {
    my ($self, $c) = @_;

    my $p = $c->cobrand->available_permissions;
    my %labels;
    foreach my $group (sort keys %$p) {
        my $group_vals = $p->{$group};
        foreach (sort keys %$group_vals) {
            $labels{$_} = $group_vals->{$_};
        }
    }

    $c->stash(
        roles => [ $c->stash->{rs}->all ],
        labels => \%labels,
    );
}

sub create :Local :Args(0) {
    my ($self, $c) = @_;

    my $role = $c->stash->{rs}->new_result({});
    return $self->form($c, $role);
}

sub item :PathPart('admin/roles') :Chained :CaptureArgs(1) {
    my ($self, $c, $id) = @_;

    my $obj = $c->stash->{rs}->find($id)
        or $c->detach('/page_error_404_not_found', []);
    $c->stash(obj => $obj);
}

sub edit :PathPart('') :Chained('item') :Args(0) {
    my ($self, $c) = @_;
    return $self->form($c, $c->stash->{obj});
}

sub form {
    my ($self, $c, $role) = @_;

    if ($c->get_param('delete_role')) {
        $role->delete;
        $c->forward('/admin/log_edit', [ $role->id, 'role', 'delete' ]);
        $c->response->redirect($c->uri_for($self->action_for('index')));
        $c->detach;
    }

    my $perms = [];
    my $p = $c->cobrand->available_permissions;
    foreach my $group (sort keys %$p) {
        my $group_vals = $p->{$group};
        my @foo;
        foreach (sort keys %$group_vals) {
            push @foo, { value => $_, label => $group_vals->{$_} };
        }
        push @$perms, { group => $group, options => \@foo };
    }
    my $opts = {
        field_list => [
            '+permissions' => { options => $perms },
        ],
    };

    if (!$c->user->is_superuser && $c->user->from_body) {
        push @{$opts->{field_list}}, '+body', { inactive => 1 };
        $opts->{body_id} = $c->user->from_body->id;
    }

    my $action = $role->in_storage ? 'edit' : 'add';
    my $form = FixMyStreet::App::Form::Role->new(%$opts);
    $c->stash(template => 'admin/roles/form.html', form => $form);
    $form->process(item => $role, params => $c->req->params);
    return unless $form->validated;

    $c->forward('/admin/log_edit', [ $role->id, 'role', $action ]);
    $c->response->redirect($c->uri_for($self->action_for('index')));
}

1;