From 4490def38004f1d2dfd92646c2491402d75cfadb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz>
Date: Fri, 12 Nov 2021 20:46:06 +0100
Subject: [PATCH] Database support

---
 .gitlab-ci.yml                    |  2 +-
 Dockerfile                        |  7 +++--
 cf2022.conf                       |  1 +
 lib/CF2022.pm                     | 31 +++++++++++++++++++++
 lib/CF2022/Schema.pm              | 14 ++++++++++
 lib/CF2022/Schema/Result/Order.pm | 46 +++++++++++++++++++++++++++++++
 sql/1/up.sql                      | 13 +++++++++
 7 files changed, 111 insertions(+), 3 deletions(-)
 create mode 100644 lib/CF2022/Schema.pm
 create mode 100644 lib/CF2022/Schema/Result/Order.pm
 create mode 100644 sql/1/up.sql

diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 007325d..2338ff3 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,7 +2,7 @@ image: docker:20.10.9
 
 variables:
   DOCKER_TLS_CERTDIR: "/certs"
-  IMAGE_VER: 0.4.0
+  IMAGE_VER: 0.5.0
 
 services:
   - docker:20.10.9-dind
diff --git a/Dockerfile b/Dockerfile
index a45e8d6..66885dd 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -6,15 +6,18 @@ RUN apt-get update && apt-get install -y \
     build-essential \
     libcrypt-openssl-rsa-perl \
     libdigest-sha-perl \
+    libdbd-pg-perl \
+    libdbi-perl \
+    libdbix-class-perl \
     libmodule-build-tiny-perl \
     libio-socket-ssl-perl \
+    libjson-perl \
     libyaml-perl \
     libyaml-dev
 
-#    libnet-ssleay-perl \
-
 RUN cpanm \
     Mojolicious \
+    Mojo::Pg \
     Mojo::Redis \
     Mojo::JWT \
     Mojolicious::Plugin::OpenAPI
diff --git a/cf2022.conf b/cf2022.conf
index 8efcf4e..2999e3f 100644
--- a/cf2022.conf
+++ b/cf2022.conf
@@ -4,6 +4,7 @@
   groups_url            => 'https://iapi.pirati.cz/v1/groups',
   pretix_api            => 'https://pretix.pir-test.eu/api/v1',
   pretix_token          => 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
+  pretix_testmode       => 1,
   pretix_organizer      => 'pirati',
   pretix_event          => 'cf2022',
   pretix_qid_sso        => 29, # identifikator otazky SSO UID
diff --git a/lib/CF2022.pm b/lib/CF2022.pm
index 0c8e7b6..9f0924b 100644
--- a/lib/CF2022.pm
+++ b/lib/CF2022.pm
@@ -1,6 +1,8 @@
 package CF2022;
 use Mojo::Base 'Mojolicious';
+use Mojo::Pg;
 use Mojo::Redis;
+use CF2022::Schema;
 
 # This method will run once at server start
 sub startup {
@@ -21,6 +23,35 @@ sub startup {
 #    my $redis = Mojo::Redis->new( $cfg->{redis} );
 #    $self->helper( redis => sub { return $redis; } );
 
+    # migrace schematu
+    my $pg = Mojo::Pg->new
+        ->dsn($cfg->{db_dsn})
+        ->username($cfg->{db_username})
+        ->password($cfg->{db_password})
+    ;
+    if ($cfg->{test}) {
+        $pg->search_path(['test']);
+        $pg->db->query('drop schema if exists test cascade');
+        $pg->db->query('create schema test');
+    }
+    $pg->migrations->from_dir($self->home . '/sql');
+    $pg->migrations->migrate();
+    $self->helper( pg => sub { return $pg; } );
+
+    # DB Schema
+    my $schema = CF2022::Schema->connect({
+        dsn      => $cfg->{db_dsn},
+        user     => $cfg->{db_username},
+        password => $cfg->{db_password},
+    });
+
+    if ( $cfg->{test} ) {
+        $schema->storage->dbh->do("set search_path to test") ;
+    }
+
+    $self->helper( schema => sub { return $schema; } );
+
+    $self->helper( schema => sub { return $schema; } );
     $self->plugin('CF2022::Helpers::Core');
     $self->plugin('CF2022::Helpers::Auth');
 
diff --git a/lib/CF2022/Schema.pm b/lib/CF2022/Schema.pm
new file mode 100644
index 0000000..633f4c2
--- /dev/null
+++ b/lib/CF2022/Schema.pm
@@ -0,0 +1,14 @@
+package CF2022::Schema;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Schema';
+
+our $VERSION = 1;
+
+__PACKAGE__->load_namespaces;
+
+1;
+
+
diff --git a/lib/CF2022/Schema/Result/Order.pm b/lib/CF2022/Schema/Result/Order.pm
new file mode 100644
index 0000000..7297438
--- /dev/null
+++ b/lib/CF2022/Schema/Result/Order.pm
@@ -0,0 +1,46 @@
+package CF2022::Schema::Result::Order;
+
+use strict;
+use warnings;
+
+use base 'DBIx::Class::Core';
+use JSON;
+
+our $VERSION = 1;
+
+__PACKAGE__->table('orders');
+
+__PACKAGE__->add_columns(
+    qw(
+        id
+        created
+        ip
+        sso_uuid
+        email
+        api
+        request
+        response
+    ),
+);
+
+__PACKAGE__->set_primary_key('id');
+
+__PACKAGE__->inflate_column('request', {
+    inflate => sub {
+        return from_json(shift);
+    },
+    deflate => sub {
+        return to_json(shift);
+    },
+});
+
+__PACKAGE__->inflate_column('response', {
+    inflate => sub {
+        return from_json(shift);
+    },
+    deflate => sub {
+        return to_json(shift);
+    },
+});
+
+1;
diff --git a/sql/1/up.sql b/sql/1/up.sql
new file mode 100644
index 0000000..77abbe0
--- /dev/null
+++ b/sql/1/up.sql
@@ -0,0 +1,13 @@
+create sequence "uid_seq" start 100000;
+
+create table "orders" (
+    "id" integer not null default nextval('uid_seq'),
+    "created" timestamp(0) not null default now(),
+    "ip" inet  not null,
+    "sso_uuid" varchar(36),
+    "email" text not null,
+    "api" text not null,
+    "request" text,
+    "response" text,
+    primary key("id")
+);
-- 
GitLab