[Rt-commit] rt branch, 5.0/rest2-add-asset-and-transaction-sql-endpoints, created. rt-5.0.0-5-ga0d45e074f

Craig Kaiser craig at bestpractical.com
Mon Mar 1 13:11:34 EST 2021


The branch, 5.0/rest2-add-asset-and-transaction-sql-endpoints has been created
        at  a0d45e074feef46dba93a63ac09e7f1818719531 (commit)

- Log -----------------------------------------------------------------
commit 88f1462bd07eb4240bbfaf364d3f603fcb25db74
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/SupportsFromSQL.pm b/lib/RT/REST2/Resource/SupportsFromSQL.pm
new file mode 100644
index 0000000000..9f82d3a979
--- /dev/null
+++ b/lib/RT/REST2/Resource/SupportsFromSQL.pm
@@ -0,0 +1,63 @@
+package RT::REST2::Resource::SupportsFromSQL;
+use strict;
+use warnings;
+
+use Moose;
+use namespace::autoclean;
+
+extends 'RT::REST2::Resource::Collection';
+with 'RT::REST2::Resource::Collection::QueryByJSON';
+
+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;
+}
+
+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 f802af031c3d2543bf4ab80fa79e1f7dfe431f30
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 f2b17006a983b8484dbd97f9a6e88b4ef7c57293
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 9eb081bd17e70d2cd9b6bf913057951796c4798e
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 a0d45e074feef46dba93a63ac09e7f1818719531
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