BeastBB/lib/BeastBB/DAO/GroupManager.pm

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;