161 lines
4.3 KiB
Perl
161 lines
4.3 KiB
Perl
package BeastBB::DAO::GroupManager;
|
|
|
|
use 5.32.1;
|
|
|
|
use strict;
|
|
use warnings;
|
|
|
|
use Carp;
|
|
|
|
use Params::ValidationCompiler 'validation_for';
|
|
use Types::Standard qw/Bool Str Int/;
|
|
|
|
use BeastBB::Response;
|
|
|
|
{
|
|
my $validator = validation_for(
|
|
params => {
|
|
app => { type => IsClassTypeGenerator('Mojolicious::Controller') },
|
|
}
|
|
);
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my %params = $validator->(@_);
|
|
return bless \%params, $class;
|
|
}
|
|
}
|
|
|
|
{
|
|
my $validator = validation_for(
|
|
params => {
|
|
id_group => { type => Int, optional => 1 },
|
|
groupname => { type => Str, optional => 1 },
|
|
recover_privileges => { type => Bool, default => 0 },
|
|
}
|
|
);
|
|
|
|
sub Get {
|
|
my $self = shift;
|
|
|
|
my %params = $validator->(@_);
|
|
my ( $id_group, $groupname, $recover_privileges ) =
|
|
@params{ 'id_group', 'groupname', 'recover_privileges' };
|
|
|
|
$self->_CheckGetRequirements(
|
|
( ( defined $id_group ) ? ( id_group => $id_group ) : () ),
|
|
( ( defined $groupname ) ? ( groupname => $groupname ) : () )
|
|
);
|
|
|
|
my $maybe_group_hash = $self->_RecoverGroupFromDatabase(
|
|
( ( defined $id_group ) ? ( id_group => $id_group ) : () ),
|
|
( ( defined $groupname ) ? ( groupname => $groupname ) : () )
|
|
);
|
|
|
|
return $maybe_group_hash if $maybe_group_hash->IsError;
|
|
$group_hash = $maybe_group_hash;
|
|
my $group = BeastBB::Model::Group->new(%$group_hash);
|
|
|
|
my $privileges;
|
|
if ($recover_privileges) {
|
|
$self->RecoverPrivilegesGroup( group => $group );
|
|
}
|
|
|
|
return BeastBB::Response->new( content => $group );
|
|
}
|
|
}
|
|
|
|
{
|
|
my $validator = validation_for(
|
|
id_group => { type => Int, optional => 1 },
|
|
groupname => { type => Str, optional => 1 },
|
|
);
|
|
|
|
sub _CheckGetRequirements {
|
|
my $self = shift;
|
|
my %params = $validator->(@_);
|
|
|
|
my ( $id_group, $groupname, ) = @params{ 'id_group', 'groupname', };
|
|
|
|
confess "${class}::Get should be used passing id_group xor groupname."
|
|
unless ( defined $id_group xor defined $groupname );
|
|
}
|
|
}
|
|
|
|
{
|
|
my $validator = validation_for(
|
|
params => {
|
|
id_group => { type => Int, optional => 1 },
|
|
groupname => { type => Str, optional => 1 },
|
|
}
|
|
);
|
|
|
|
sub _RecoverGroupFromDatabase {
|
|
my $self = shift;
|
|
my %params = $validator->(@_);
|
|
|
|
my $id_group = $params{id_group};
|
|
my $groupname = $params{groupname};
|
|
|
|
my $app = $self->_App;
|
|
my $database = $app->db;
|
|
my $pg = $database->Pg->db;
|
|
|
|
my $selected_group = $pg->select(
|
|
'group',
|
|
[ 'id_group', 'groupname' ],
|
|
{
|
|
( ( defined $id_group ) ? ( id_group => $id_group ) : () ),
|
|
( ( defined $groupname ) ? ( groupname => $groupname ) : () )
|
|
}
|
|
);
|
|
if ( !$selected_group->rows ) {
|
|
return BeastBB::Response->new(
|
|
is_error => 1,
|
|
error_message => 'No such group.'
|
|
);
|
|
}
|
|
return BeastBB::Response->new( content => $selected_group->hash );
|
|
}
|
|
}
|
|
|
|
{
|
|
my $validator = validation_for(
|
|
params => {
|
|
group => { type => IsClassTypeGenerator('BeastBB::Model::Group') },
|
|
}
|
|
);
|
|
|
|
sub RecoverPrivilegesGroup {
|
|
my $self = shift;
|
|
my %params = $validator->(@_);
|
|
my $group = $params{group};
|
|
my $id_group = $group->IdGroup;
|
|
|
|
my $app = $self->_App;
|
|
my $database = $app->db;
|
|
my $pg = $database->Pg->db;
|
|
|
|
my $selected_privileges = $pg->query(
|
|
'SELECT privilege.name'
|
|
. ' FROM group_privilege'
|
|
. ' INNER JOIN privilege USING (id_privilege)'
|
|
. ' WHERE id_group=?',
|
|
$id_group
|
|
);
|
|
if ( $selected_privileges->rows ) {
|
|
my $hashes_privileges = $selected_privileges->hashes;
|
|
$privileges =
|
|
{ map { $_->{name} => 1 } @$hashes_privileges };
|
|
}
|
|
$privileges //= {};
|
|
$group->Privileges($privileges);
|
|
return $group;
|
|
}
|
|
}
|
|
|
|
sub _App {
|
|
return $self->{app};
|
|
}
|
|
1;
|