[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