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