From b4c0bdde8221fc64fc11cb6abf8df6e9eabea2c4 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Andrej=20Rama=C5=A1euski?= <andrej@x2.cz>
Date: Fri, 18 Dec 2020 20:24:54 +0100
Subject: [PATCH] Zpet na timedate

---
 lib/CF/Controller/Posts.pm        | 119 ++++++++++++++++++++++++------
 lib/CF/Schema/Result/Post.pm      |   2 +-
 lib/CF/Schema/Result/Post_view.pm |   7 +-
 sql/2/up.sql                      |   2 +-
 4 files changed, 101 insertions(+), 29 deletions(-)

diff --git a/lib/CF/Controller/Posts.pm b/lib/CF/Controller/Posts.pm
index 54dcdab..9d81960 100644
--- a/lib/CF/Controller/Posts.pm
+++ b/lib/CF/Controller/Posts.pm
@@ -16,15 +16,25 @@ sub create ($c) {
         return $c->error(401, 'Insufficient permissions');
     }
 
-    my $post = $c->schema->resultset('Post')->create({
-        user_id => $c->user->{id},
-        type    => $args->{type},
-        content => $args->{content},
+    my $program_entry = $c->schema->resultset('ProgramEntry')->search({
+        is_live => 1,
+    })->first;
+
+    # Neni zadny aktivnibod rozpravy
+    if ( ! $program_entry ) {
+        return $c->error(403, 'Debate closed');
+    }
+
+    my $post = $program_entry->add_to_posts({
+        user_id          => $c->user->{id},
+        type             => $args->{type},
+        content          => $args->{content},
     });
 
-    $pubsub->json('posts')->notify(
-        posts => $post->view->format()
-    );
+    $pubsub->json('posts')->notify( posts => {
+        event   => 'created',
+        payload => $post->view->format(),
+    });
 
     $c->render(
         status  => 201,
@@ -38,7 +48,22 @@ sub get ($c) {
     my $post = $c->schema->resultset('Post_view')->find($c->stash->{id});
     return $c->error(404, 'Post not found') if ! $post;
 
-    $c->render(openapi => $c->spec_filter($post->format(), 'Post'));
+    my $formatted = $post->format();
+
+    if (my $my_vote = $post->rankings({ user_id => $c->user->{id} })->first) {
+        $formatted->{ranking}{my_vote} = $my_vote->ranking;
+    }
+
+    foreach my $history ( $post->history() ) {
+        push @{ $formatted->{historyLog} }, {
+            attribute  => 'content',
+            value      => $history->content,
+            datetime   => $history->datetime,
+            originator => '',
+        }
+    }
+
+    $c->render(openapi => $c->spec_filter($formatted, 'Post'));
 }
 
 sub list ($c) {
@@ -47,6 +72,23 @@ sub list ($c) {
 
     my ($cond, $attrs) = $c->search_parametrs( $args );
 
+    # Vzdy jen k jednemu programovemu bodu - parametr nebo aktualni
+    if ( $args->{program_entry_id} ) {
+        $cond->{program_entry_id} = $args->{program_entry_id};
+    }
+    else {
+        my $program_entry = $c->schema->resultset('ProgramEntry')->search({
+            is_live => 1,
+        })->first;
+
+        # Neni zadny aktivnibod rozpravy
+        if ( ! $program_entry ) {
+            return $c->error(403, 'Debate closed');
+        }
+
+        $cond->{program_entry_id} = $program_entry->id;
+    }
+
     if ( exists $args->{archived} && defined $args->{archived}) {
         $cond->{is_archived} = $args->{archived};
     }
@@ -59,10 +101,20 @@ sub list ($c) {
         }
     }
     elsif (! $c->user_roles->{chairman}) {
-        $cond->{-or} => [
-            { type  => 1 },
-            { state => { '-in' => [1,2,3,4] }},
-        ];
+        $cond->{'-or'} = {
+            type  => 1,
+            state => { '-in' => [1,2,3,4] },
+        };
+    }
+
+    # hodnoceni aktualniho uzivatele
+    my $my_vote  = {};
+
+    my $rankings = $c->schema->resultset('PostRanking')->search({
+        user_id => $c->user->{id}
+    });
+    while ( my $record = $rankings->next() ) {
+        $my_vote->{ $record->post_id } = $record->ranking;
     }
 
     my @posts = ();
@@ -72,9 +124,11 @@ sub list ($c) {
     if ( $count ) {
         my $posts = $c->schema->resultset('Post_view')->search($cond, $attrs);
 
-        RECORD:
+        POST:
         while ( my $post = $posts->next() ) {
-            push @posts, $c->spec_filter($post->format(), 'Post');
+            my $formatted = $post->format();
+            $formatted->{ranking}{my_vote} = $my_vote->{ $post->id } // 0;
+            push @posts, $c->spec_filter($formatted, 'Post');
         }
     }
 
@@ -112,15 +166,22 @@ sub update ($c) {
 
     $post->add_to_history({
         user_id  => $c->user->{id},
-        datetime => $post->datetime,
+        datetime => $post->changed // $post->datetime,
         content  => $post->content,
     });
 
-    $post->update( $update );
+    $post->update({
+        %{ $update },
+        changed => \'now()',
+    });
 
-    $pubsub->json('posts')->notify(
-        posts => $post->view->format()
-    );
+    $pubsub->json('posts')->notify( posts => {
+        event   => 'changed',
+        payload => {
+            id => $post->id,
+            %{ $update },
+        }
+    });
 
     $guard->commit;
 
@@ -180,9 +241,13 @@ sub ranking ($c) {
         });
     }
 
-    $pubsub->json('posts')->notify(
-        posts => $post->view->format()
-    );
+    $pubsub->json('posts')->notify(posts => {
+        event   => 'ranked',
+        payload => {
+            id => $post->id,
+            %{ $update },
+        }
+    });
     $guard->commit;
 
     $c->render(status => 204, text => '');
@@ -191,12 +256,18 @@ sub ranking ($c) {
 sub ws {
     my $c = shift;
 
-    $c->inactivity_timeout(300);
+    $c->inactivity_timeout(600);
 
     my $pubsub = Mojo::Pg::PubSub->new(pg => $c->pg);
 
     $pubsub->listen(posts => sub($pubsub, $payload) {
-        # FILTER?
+        if (
+            $payload->{type} == 0
+            && $payload->{state} == 0
+            && ! $c->user_roles->{chairman}
+        ) {
+            return;
+        }
         $c->send($payload);
     });
 
diff --git a/lib/CF/Schema/Result/Post.pm b/lib/CF/Schema/Result/Post.pm
index 31d326e..5061d9b 100644
--- a/lib/CF/Schema/Result/Post.pm
+++ b/lib/CF/Schema/Result/Post.pm
@@ -17,7 +17,7 @@ __PACKAGE__->add_columns(
         sequence          => 'uid_seq'
     },
     qw(
-        created
+        datetime
         changed
         deleted
         is_archived
diff --git a/lib/CF/Schema/Result/Post_view.pm b/lib/CF/Schema/Result/Post_view.pm
index a7c3978..71bbbdb 100644
--- a/lib/CF/Schema/Result/Post_view.pm
+++ b/lib/CF/Schema/Result/Post_view.pm
@@ -24,7 +24,7 @@ sub format {
 
     my $post = {
         id          => $self->id,
-        datetime    => $self->created,
+        datetime    => $self->datetime,
         type        => $self->type,
         state       => $self->state,
         content     => $self->content,
@@ -39,8 +39,9 @@ sub format {
             score    => $self->ranking_score,
             likes    => $self->ranking_likes,
             dislikes => $self->ranking_dislikes,
-            my_vote  => 0, #TODO
-        }
+            my_vote  => 0,
+        },
+        history_log => []
     };
 
     return $post;
diff --git a/sql/2/up.sql b/sql/2/up.sql
index f085c6c..4297e9d 100644
--- a/sql/2/up.sql
+++ b/sql/2/up.sql
@@ -1,6 +1,6 @@
 create table "posts" (
     "id" integer not null default nextval('uid_seq'),
-    "created" timestamp(0) not null default now(),
+    "datetime" timestamp(0) not null default now(),
     "changed" timestamp(0),
     "deleted" timestamp(0),
     "is_archived" bool not null default 'false',
-- 
GitLab