diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 31a039672851ceaf2c5e0a7d4b390db9fd44cb55..642ed97cb48cdc7749e4bc0db8c943e1486abd96 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,7 +2,7 @@ image: docker:19.03.12 variables: DOCKER_TLS_CERTDIR: "/certs" - IMAGE_VER: 1.10.2 + IMAGE_VER: 1.11.0 services: - docker:19.03.12-dind diff --git a/Dockerfile b/Dockerfile index f1e5bbeb801912ff7b3ea52db7ac0883157e979d..465c7f6e050d86eebadc585c87843e2722fcb5bc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -18,6 +18,7 @@ RUN apt-get update && apt-get install -y \ RUN cpanm \ Mojolicious \ Mojo::Pg \ + Mojo::Redis \ Mojo::JWT \ Mojolicious::Plugin::OpenAPI diff --git a/lib/CF.pm b/lib/CF.pm index a703d0ad06f707b47f896c562fcf081b7a656089..105e5fc1ba1e9809fd5218b72133f7e70782f317 100644 --- a/lib/CF.pm +++ b/lib/CF.pm @@ -2,6 +2,7 @@ package CF; use Mojo::Base 'Mojolicious'; use Mojo::Pg; use Mojo::JWT; +use Mojo::Redis; use CF::Schema; # This method will run once at server start @@ -37,6 +38,10 @@ sub startup { }); $self->helper( schema => sub { return $schema; } ); + # Redis + my $redis = Mojo::Redis->new( $cfg->{redis} ); + $self->helper( redis => sub { return $redis; } ); + $self->plugin('CF::Helpers::Core'); $self->plugin('CF::Helpers::Auth'); diff --git a/lib/CF/Controller/SSO.pm b/lib/CF/Controller/SSO.pm index 95e2af6509bb7785bef43dbbdab4670f5f68c4b1..880bae3d23d18c9c36a39d74ab931762aa874f21 100644 --- a/lib/CF/Controller/SSO.pm +++ b/lib/CF/Controller/SSO.pm @@ -1,15 +1,25 @@ package CF::Controller::SSO; -use Mojo::Base 'Mojolicious::Controller'; -use Mojo::Pg::PubSub; use feature 'signatures'; no warnings qw{ experimental::signatures }; +use Mojo::Base 'Mojolicious::Controller'; +use Mojo::Pg::PubSub; use Mojo::UserAgent; +use JSON; + +use constant REDIS_CACHE_LIFETIME => 300; +use constant REDIS_CACHE_KEY => 'SSO SUBJECTS %s'; sub subjects ($c) { $c->openapi->valid_input or return; my $args = $c->validation->output; + my $cache_key = sprintf(REDIS_CACHE_KEY, $args->{search}); + if ($c->redis->db->exists( $cache_key )) { + $c->render(openapi => from_json($c->redis->db->get( $cache_key ))); + return; + } + my ( $groups, $users, @subjects ); if ( $args->{class} =~ /all|group/ ) { @@ -20,6 +30,7 @@ sub subjects ($c) { @subjects = (@subjects, $c->_users( $args->{search} )); } + $c->redis->db->set( $cache_key, to_json(\@subjects), 'EX', REDIS_CACHE_LIFETIME ); $c->render(openapi => \@subjects); }