package CF::Controller::SSO; use Mojo::Base 'Mojolicious::Controller'; use Mojo::Pg::PubSub; use feature 'signatures'; no warnings qw{ experimental::signatures }; use Mojo::UserAgent; sub subjects ($c) { $c->openapi->valid_input or return; my $args = $c->validation->output; my ( $groups, $users, @subjects ); if ( $args->{class} =~ /all|group/ ) { @subjects = $c->_groups( $args->{search} ); } if ( $args->{class} =~ /all|user/ ) { @subjects = (@subjects, $c->_users( $args->{search} )); } $c->render(openapi => \@subjects); } sub _groups ($c, $search) { my $ua = Mojo::UserAgent->new; my @groups = (); my $groups; eval { $groups = $ua->get( sprintf($c->config->{iapi_get_groups}, $search) )->result->json; }; if ( $groups && ref $groups eq 'ARRAY' ) { my @tmp = (); # vyssi priorita pri vyskytu na zacatku GROUP: foreach my $group ( @{ $groups } ) { next if $group->{code} =~ /^_group/; # nezarazene skupiny next if $group->{name} =~ /^@/; # zavinacove skupiny $group->{priority} = 0; $group->{priority} = 1 if $group->{name} =~ /^$search/i; $group->{priority} = 2 if $group->{code} =~ /^$search/i; push @tmp, $group, } GROUP: foreach my $group ( sort { $b->{priority} <=> $a->{priority} or lc($a->{name}) cmp lc($b->{name}) or lc($a->{code}) cmp lc($b->{code}) } @tmp ) { push @groups, { class => 'group', value => $group->{code}, label => $group->{name}, }; } } return @groups; } sub _users ($c, $search) { my $ua = Mojo::UserAgent->new; my @users = (); my $users; eval { $users = $ua->get( sprintf($c->config->{iapi_get_users}, $search) )->result->json; }; if ( $users && ref $users eq 'ARRAY' ) { my @tmp = (); # vyssi priorita pri vyskytu na zacatku USER: foreach my $user ( @{ $users } ) { $user->{priority} = 0; $user->{priority} = 1 if $user->{lastname} =~ /^$search/i; $user->{priority} = 2 if $user->{username} =~ /^$search/i; $user->{priority} = 3 if $user->{firstname} =~ /^$search/i; push @tmp, $user, } USER: foreach my $user ( sort { $b->{included} <=> $a->{included} or $b->{priority} <=> $a->{priority} or lc($a->{firstname}) cmp lc($b->{firstname}) or lc($a->{lastname}) cmp lc($b->{lastname}) } @tmp ) { push @users, { class => 'user', value => $user->{username}, label => $user->{displayname} || $user->{firstname} . ' ' . $user->{lastname}, }; } } return @users; } 1;