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