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