From 136be18bf1c4e0ed7d7b59a5bd81ceab17a9b0a4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz>
Date: Mon, 28 Dec 2020 13:38:34 +0100
Subject: [PATCH] Generovane announcementy

---
 lib/CF/Controller/Posts.pm              | 34 +++++++++++++++++++++++++
 lib/CF/Controller/Users.pm              | 22 +++++++++++++++-
 lib/CF/Schema/Result/Post.pm            |  2 +-
 lib/CF/Schema/ResultSet/Announcement.pm | 20 +++++++++++++++
 4 files changed, 76 insertions(+), 2 deletions(-)

diff --git a/lib/CF/Controller/Posts.pm b/lib/CF/Controller/Posts.pm
index 1745de5..384b0bf 100644
--- a/lib/CF/Controller/Posts.pm
+++ b/lib/CF/Controller/Posts.pm
@@ -5,6 +5,13 @@ use Mojo::Pg::PubSub;
 use feature 'signatures';
 no warnings qw{ experimental::signatures };
 
+# TODO: do modelu
+use constant STATUS_ANNOUNCEMENTS => {
+    1 => 1, # prijatelny n.p.
+    2 => 2, # schvaleny n.p.
+    3 => 0, # zamitnuty n.p.
+};
+
 sub create ($c) {
     $c->openapi->valid_input or return;
 
@@ -165,6 +172,33 @@ sub update ($c) {
     my $pubsub = Mojo::Pg::PubSub->new(pg => $c->pg);
     my $guard  = $c->schema->txn_scope_guard;
 
+    if ( $update->{state} && $post->state != $update->{state} ) {
+        my $announcement_type = STATUS_ANNOUNCEMENTS->{ $args->{state} };
+
+        #TODO: do modelu
+        my $msg = $c->schema->resultset('Announcement')->from_template(
+            $announcement_type,
+            $post->user->name,
+            $post->content,
+        );
+
+        my $announcement = $c->schema->resultset('Announcement')->create({
+            user_id  => $c->user->{id},
+            type     => $announcement_type,
+            content  => $msg,
+        });
+
+        # potrebujeme kvuli datumu
+        $announcement = $c->schema->resultset('Announcement')->find({
+            id => $announcement->id
+        });
+
+        $pubsub->json('notify')->notify( notify => {
+            event   => 'announcement_created',
+            payload => $announcement->format(),
+        });
+    }
+
     $post->add_to_history({
         user_id  => $c->user->{id},
         datetime => $post->changed // $post->datetime,
diff --git a/lib/CF/Controller/Users.pm b/lib/CF/Controller/Users.pm
index 96bb7e0..fae7b06 100644
--- a/lib/CF/Controller/Users.pm
+++ b/lib/CF/Controller/Users.pm
@@ -32,7 +32,27 @@ sub ban ($c){
     my $guard  = $c->schema->txn_scope_guard;
 
     $user->update({ banned_until => \"now()+'8 hour'", });
-    #TODO: ANN
+
+    #TODO: do modelu
+    my $msg = $c->schema->resultset('Announcement')->from_template(
+        5, $user->name,
+    );
+
+    my $announcement = $c->schema->resultset('Announcement')->create({
+        user_id  => $c->user->{id},
+        type     => 5,
+        content  => $msg,
+    });
+
+    # potrebujeme kvuli datumu
+    $announcement = $c->schema->resultset('Announcement')->find({
+        id => $announcement->id,
+    });
+
+    $pubsub->json('notify')->notify( notify => {
+        event   => 'announcement_created',
+        payload => $announcement->format(),
+    });
 
     $pubsub->json('notify')->notify( notify => {
         event   => 'user_banned',
diff --git a/lib/CF/Schema/Result/Post.pm b/lib/CF/Schema/Result/Post.pm
index 5061d9b..7881f69 100644
--- a/lib/CF/Schema/Result/Post.pm
+++ b/lib/CF/Schema/Result/Post.pm
@@ -36,7 +36,7 @@ __PACKAGE__->set_primary_key('id');
 __PACKAGE__->has_one( view => 'CF::Schema::Result::Post_view', 'id');
 
 __PACKAGE__->belongs_to(
-    user => 'Zircon::Schema::Result::User',
+    user => 'CF::Schema::Result::User',
     {
         'foreign.id' => 'self.user_id',
     },
diff --git a/lib/CF/Schema/ResultSet/Announcement.pm b/lib/CF/Schema/ResultSet/Announcement.pm
index 54c7b22..58a45f5 100644
--- a/lib/CF/Schema/ResultSet/Announcement.pm
+++ b/lib/CF/Schema/ResultSet/Announcement.pm
@@ -2,6 +2,9 @@ package CF::Schema::ResultSet::Announcement;
 
 use strict;
 use warnings;
+use utf8;
+use feature 'signatures';
+no warnings qw{ experimental::signatures };
 
 use base 'DBIx::Class::ResultSet';
 
@@ -13,4 +16,21 @@ use constant PROTECTED_FIELDS => [qw(
     type
 )];
 
+use constant TEMPLATE => {
+    0 => 'Předsedající prohlásil návrh postupu předložený **%s** za nepřijatelný ' .
+         'a dál k němu nepřihlíží // **§4 (2) JdŘ CF**',
+    1 => 'Byl schválen návrh postupu, předložený **%s** ' .
+         'v následujícím znění: "*%s*"',
+    2 => 'Předsedající zaznamenal přijatelný návrh postupu, předložený **%s** ' .
+         'v následujícím znění: "*%s*". ' .
+         'O návrhu postupu se hlasuje bezodkladně // **§10 (2) JdŘ CF**',
+    5 => 'Předsedající, pořádkovým opatřením, vykázal z jednání **%s** // **§2 (1) JdŘ CF**',
+};
+
+sub from_template ( $class, $id, @args ) {
+    my $template = TEMPLATE->{$id} // return '';
+
+    return sprintf($template, @args);
+}
+
 1;
-- 
GitLab