From 279764e7e452b9fd3038178249e73ebd7e5ec566 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz> Date: Thu, 8 Apr 2021 22:43:37 +0200 Subject: [PATCH] Pridan redis cache --- .gitlab-ci.yml | 2 +- Dockerfile | 1 + lib/CF.pm | 5 +++++ lib/CF/Controller/SSO.pm | 15 +++++++++++++-- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 31a0396..642ed97 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 f1e5bbe..465c7f6 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 a703d0a..105e5fc 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 95e2af6..880bae3 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); } -- GitLab