[Rt-commit] rt branch, 5.0/rest2-add-asset-and-transaction-sql-endpoints, created. rt-5.0.0-5-g72b31424a0
Craig Kaiser
craig at bestpractical.com
Mon Mar 1 14:17:26 EST 2021
The branch, 5.0/rest2-add-asset-and-transaction-sql-endpoints has been created
at 72b31424a076f3baec057a56beaf8b257002472e (commit)
- Log -----------------------------------------------------------------
commit b6a4a0a87fb4437354ca9389c6bb08418ed1438d
Author: craig kaiser <craig at bestpractical.com>
Date: Fri Feb 26 15:57:06 2021 -0500
Add AssetSQL endpoint to REST2
We want to be able to support the "old" method of POSTING JSON as well
so assets is slightly different than the tickets endpoint.
diff --git a/lib/RT/REST2/Resource/Assets.pm b/lib/RT/REST2/Resource/Assets.pm
index 907534e9c6..a1a84039fa 100644
--- a/lib/RT/REST2/Resource/Assets.pm
+++ b/lib/RT/REST2/Resource/Assets.pm
@@ -53,8 +53,7 @@ use warnings;
use Moose;
use namespace::autoclean;
-extends 'RT::REST2::Resource::Collection';
-with 'RT::REST2::Resource::Collection::QueryByJSON';
+extends 'RT::REST2::Resource::SupportsFromSQL';
sub dispatch_rules {
Path::Dispatcher::Rule::Regex->new(
diff --git a/lib/RT/REST2/Resource/Assets.pm b/lib/RT/REST2/Resource/SupportsFromSQL.pm
similarity index 56%
copy from lib/RT/REST2/Resource/Assets.pm
copy to lib/RT/REST2/Resource/SupportsFromSQL.pm
index 907534e9c6..981dc5e1dd 100644
--- a/lib/RT/REST2/Resource/Assets.pm
+++ b/lib/RT/REST2/Resource/SupportsFromSQL.pm
@@ -46,7 +46,7 @@
#
# END BPS TAGGED BLOCK }}}
-package RT::REST2::Resource::Assets;
+package RT::REST2::Resource::SupportsFromSQL;
use strict;
use warnings;
@@ -56,13 +56,56 @@ use namespace::autoclean;
extends 'RT::REST2::Resource::Collection';
with 'RT::REST2::Resource::Collection::QueryByJSON';
-sub dispatch_rules {
- Path::Dispatcher::Rule::Regex->new(
- regex => qr{^/assets/?$},
- block => sub { { collection_class => 'RT::Assets' } },
- )
+use Encode qw( decode_utf8 );
+use RT::REST2::Util qw( error_as_json );
+
+has 'query' => (
+ is => 'ro',
+ isa => 'Str|ArrayRef[HashRef]',
+ lazy_build => 1,
+);
+
+sub _build_query {
+ my $self = shift;
+ my $query = "";
+
+ if ( $self->request->method eq 'GET' && $self->request->param('query') ) {
+ $query = decode_utf8($self->request->param('query') || "");
+ }
+ elsif ( $self->request->method eq 'GET' ) {
+ $query = $self->request->param('query') ? JSON::decode_json( $self->request->param('query') ) : [];
+ }
+ elsif ( $self->request->method eq 'POST' ) {
+ $query = $self->request->content ? JSON::decode_json($self->request->content) : [];
+ }
+ return $query;
}
-__PACKAGE__->meta->make_immutable;
+around limit_collection => sub {
+ my $orig = shift;
+ my $self = shift;
+
+ if ( $self->request->method eq 'GET' && ref $self->query eq "" ) {
+ my ($ok, $msg) = $self->collection->FromSQL( $self->query );
+ return error_as_json( $self->response, 0, $msg ) unless $ok;
+
+ my @orderby_cols;
+ my @orders = $self->request->param('order');
+ foreach my $orderby ($self->request->param('orderby')) {
+ $orderby = decode_utf8($orderby);
+ my $order = shift @orders || 'ASC';
+ $order = uc(decode_utf8($order));
+ $order = 'ASC' unless $order eq 'DESC';
+ push @orderby_cols, {FIELD => $orderby, ORDER => $order};
+ }
+ $self->collection->OrderByCols(@orderby_cols)
+ if @orderby_cols;
+
+ return 1;
+ }
+ else {
+ return &$orig( $self );
+ }
+};
1;
commit aa31bb791ff34027d9baa4a358b58e2f45e3221e
Author: craig kaiser <craig at bestpractical.com>
Date: Mon Mar 1 09:55:57 2021 -0500
Preserve first_row and show_rows across the CleanSlate
diff --git a/lib/RT/Transactions.pm b/lib/RT/Transactions.pm
index 43458aaaf9..88ae9c21aa 100644
--- a/lib/RT/Transactions.pm
+++ b/lib/RT/Transactions.pm
@@ -1080,8 +1080,12 @@ sub _parser {
sub FromSQL {
my ($self,$query) = @_;
- $self->CleanSlate;
- $self->_InitSQL;
+ {
+ # preserve first_row and show_rows across the CleanSlate
+ local ($self->{'first_row'}, $self->{'show_rows'}, $self->{_sql_looking_at});
+ $self->CleanSlate;
+ $self->_InitSQL();
+ }
return (1, $self->loc("No Query")) unless $query;
commit 4fcff6daa4a85617540feabb7a3efc6c707fc031
Author: craig kaiser <craig at bestpractical.com>
Date: Mon Mar 1 09:56:24 2021 -0500
Add TransactionSQL endpoint to REST2
diff --git a/lib/RT/REST2/Resource/Transactions.pm b/lib/RT/REST2/Resource/Transactions.pm
index 719a4e754a..46806b79a7 100644
--- a/lib/RT/REST2/Resource/Transactions.pm
+++ b/lib/RT/REST2/Resource/Transactions.pm
@@ -53,8 +53,7 @@ use warnings;
use Moose;
use namespace::autoclean;
-extends 'RT::REST2::Resource::Collection';
-with 'RT::REST2::Resource::Collection::QueryByJSON';
+extends 'RT::REST2::Resource::SupportsFromSQL';
sub dispatch_rules {
Path::Dispatcher::Rule::Regex->new(
commit db008bd6921eb4d3750f7854c88e045045eac2c6
Author: craig kaiser <craig at bestpractical.com>
Date: Mon Mar 1 13:07:00 2021 -0500
Add test for REST2 assetSQL search
diff --git a/t/rest2/assets.t b/t/rest2/assets.t
index 1f1712bfed..619564ae9c 100644
--- a/t/rest2/assets.t
+++ b/t/rest2/assets.t
@@ -142,6 +142,23 @@ my ($asset_url, $asset_id);
is($asset->{type}, 'asset');
is($asset->{id}, 1);
like($asset->{_url}, qr{$rest_base_path/asset/1$});
+
+ # Ensure our JSON search matches the assetSQL search
+ $res = $mech->get("$rest_base_path/assets?query=id>0",
+ 'Authorization' => $auth,
+ );
+ is($res->code, 200);
+ $content = $mech->json_response;
+ is($content->{count}, 1);
+ is($content->{page}, 1);
+ is($content->{per_page}, 20);
+ is($content->{total}, 1);
+ is(scalar @{$content->{items}}, 1);
+
+ $asset = $content->{items}->[0];
+ is($asset->{type}, 'asset');
+ is($asset->{id}, 1);
+ like($asset->{_url}, qr{$rest_base_path/asset/1$});
}
# Asset Update
commit 72b31424a076f3baec057a56beaf8b257002472e
Author: craig kaiser <craig at bestpractical.com>
Date: Mon Mar 1 13:09:28 2021 -0500
Add test for REST2 transactionSQL search
diff --git a/t/rest2/transactions.t b/t/rest2/transactions.t
index 65e705d8f9..6096b54c6c 100644
--- a/t/rest2/transactions.t
+++ b/t/rest2/transactions.t
@@ -59,6 +59,35 @@ my ($comment_txn_url, $comment_txn_id);
ok(($comment_txn_id) = $comment_txn_url =~ qr[/transaction/(\d+)]);
}
+# search transactions for a specific ticket using TransactionSQL
+{
+ my $res = $mech->get("$rest_base_path/transactions?query=ObjectType='RT::Ticket' AND ObjectId=".$ticket->Id,
+ 'Authorization' => $auth,
+ );
+ is($res->code, 200);
+
+ my $content = $mech->json_response;
+ is($content->{count}, 5);
+ is($content->{page}, 1);
+ is($content->{per_page}, 20);
+ is($content->{total}, 5);
+ is(scalar @{$content->{items}}, 5);
+
+ my ($create, $priority1, $subject, $priority2, $comment) = @{ $content->{items} };
+
+ is($create->{type}, 'transaction');
+ is($priority1->{type}, 'transaction');
+ is($subject->{type}, 'transaction');
+ is($priority2->{type}, 'transaction');
+ is($comment->{type}, 'transaction');
+
+ $create_txn_url = $create->{_url};
+ ok(($create_txn_id) = $create_txn_url =~ qr[/transaction/(\d+)]);
+
+ $comment_txn_url = $comment->{_url};
+ ok(($comment_txn_id) = $comment_txn_url =~ qr[/transaction/(\d+)]);
+}
+
# Transaction display
{
my $res = $mech->get($create_txn_url,
-----------------------------------------------------------------------
More information about the rt-commit
mailing list