2021-03-21 16:34:08 +00:00
|
|
|
package Pear::LocalLoop::Controller::Api::Topic;
|
|
|
|
use Mojo::Base 'Mojolicious::Controller';
|
|
|
|
use LWP::UserAgent;
|
|
|
|
use JSON;
|
|
|
|
use JSON::Parse 'parse_json';
|
|
|
|
use Mojo::JWT;
|
|
|
|
use Mojo::File;
|
|
|
|
use Carp;
|
2021-03-25 13:54:04 +00:00
|
|
|
use Data::Dumper;
|
2021-03-21 16:34:08 +00:00
|
|
|
|
|
|
|
has error_messages => sub {
|
|
|
|
return {
|
|
|
|
topic => {
|
|
|
|
required => { message => 'Topic is required', status => 400 },
|
|
|
|
not_in_resultset => { message => 'Topic already exists', status => 400 },
|
2021-03-25 13:54:04 +00:00
|
|
|
},
|
|
|
|
token => {
|
|
|
|
required => { message => 'Device token is required', status => 400 },
|
|
|
|
in_resultset => { message => 'Device token doesn\'t exist', status => 400 },
|
|
|
|
},
|
|
|
|
topicSubscriptions => {
|
|
|
|
required => { message => 'Set of topic subscriptions is required', status => 400 },
|
|
|
|
in_resultset => { message => 'Topic doesn\'t exist', status => 400 },
|
2021-03-21 16:34:08 +00:00
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
sub create {
|
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $user = $c->stash->{api_user};
|
|
|
|
|
|
|
|
my $validation = $c->validation;
|
|
|
|
$validation->input( $c->stash->{api_json} );
|
|
|
|
|
|
|
|
my $topic_rs = $c->schema->resultset('Topic');
|
|
|
|
my $user_rs = $c->schema->resultset('User');
|
|
|
|
|
|
|
|
$validation->required('topic')->not_in_resultset( 'topic', $topic_rs );
|
|
|
|
# TODO: validate that requester is an org user
|
|
|
|
|
|
|
|
my $organisation = $user->entity->organisation;
|
|
|
|
|
|
|
|
return $c->api_validation_error if $validation->has_error;
|
|
|
|
|
|
|
|
my $topic = $validation->param('topic');
|
|
|
|
|
|
|
|
$organisation->create_related(
|
|
|
|
'topics',
|
|
|
|
{
|
|
|
|
name => $topic,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
|
|
|
message => 'Topic created successfully!',
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
sub get_all {
|
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $topic_rs = $c->schema->resultset('Topic');
|
|
|
|
|
|
|
|
my @topics = (
|
|
|
|
map {
|
|
|
|
{
|
|
|
|
id => $_->id,
|
|
|
|
name => $_->name,
|
|
|
|
numberOfSubscribers =>
|
2021-03-25 13:54:04 +00:00
|
|
|
$_->search_related( 'user_topic_subscriptions',
|
2021-03-21 16:34:08 +00:00
|
|
|
{ 'topic_id' => $_->id } )->count,
|
|
|
|
}
|
|
|
|
} $topic_rs->all
|
|
|
|
);
|
|
|
|
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
|
|
|
topics => \@topics,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
2021-03-25 13:54:04 +00:00
|
|
|
|
|
|
|
sub get_all_and_subscriptions {
|
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $user = $c->stash->{api_user};
|
|
|
|
|
|
|
|
my $validation = $c->validation;
|
|
|
|
$validation->input( $c->stash->{api_json} );
|
|
|
|
my $topic_rs = $c->schema->resultset('Topic');
|
|
|
|
|
|
|
|
my @topics = (
|
|
|
|
map {
|
|
|
|
{
|
|
|
|
id => $_->id,
|
|
|
|
name => $_->name,
|
|
|
|
isSubscribed => $_->search_related( 'user_topic_subscriptions',
|
|
|
|
{ 'topic_id' => $_->id, 'user_id' => $user->id })->count
|
|
|
|
}
|
|
|
|
} $topic_rs->all
|
|
|
|
);
|
|
|
|
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
|
|
|
topics => \@topics,
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
sub update_subscriptions {
|
|
|
|
my $c = shift;
|
|
|
|
|
|
|
|
my $user = $c->stash->{api_user};
|
|
|
|
my $topic_rs = $c->schema->resultset('Topic');
|
|
|
|
|
|
|
|
my $validation = $c->validation;
|
|
|
|
$validation->input( $c->stash->{api_json} );
|
|
|
|
$validation->required('topicSubscriptions');
|
|
|
|
|
|
|
|
foreach my $sub ( @{ $validation->every_param('topicSubscriptions') } ) {
|
|
|
|
my $subscription = $user->find_related( 'user_topic_subscriptions',
|
|
|
|
{ 'topic_id' => $sub->{id} }
|
|
|
|
);
|
|
|
|
|
|
|
|
if ( $sub->{isSubscribed} && !$subscription ) {
|
|
|
|
$user->create_related(
|
|
|
|
'user_topic_subscriptions',
|
|
|
|
{
|
|
|
|
topic_id => $sub->{id},
|
|
|
|
}
|
|
|
|
);
|
|
|
|
} elsif ( !$sub->{isSubscribed} && $subscription ) {
|
|
|
|
$user->delete_related(
|
|
|
|
'user_topic_subscriptions',
|
|
|
|
{
|
|
|
|
topic_id => $sub->{id},
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return $c->render(
|
|
|
|
json => {
|
|
|
|
success => Mojo::JSON->true,
|
|
|
|
message => 'Topic subscriptions updated successfully!',
|
|
|
|
}
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2021-03-21 16:34:08 +00:00
|
|
|
1;
|