From b63a24aa8701483d7f655f4e1ef64c6dc6e3e098 Mon Sep 17 00:00:00 2001
From: Tomas Cohen Arazi <tomascohen@theke.io>
Date: Mon, 7 Oct 2019 15:55:09 -0300
Subject: [PATCH] Bug 23770: Add Koha::Object(s)->to_api method
Content-Type: text/plain; charset=utf-8

Generic method that changes the attribute names of an object in the
presence of the to_api_mapping method. It otherwise falls back to
returning the TO_JSON output.

This is WIP submitted early for scrutiny. Tests and example usage in an
API controller coming.

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>
---
 Koha/Object.pm  | 34 ++++++++++++++++++++++++++++++++++
 Koha/Objects.pm | 12 ++++++++++++
 2 files changed, 46 insertions(+)

diff --git a/Koha/Object.pm b/Koha/Object.pm
index 04d34c49e3..108ea2e52f 100644
--- a/Koha/Object.pm
+++ b/Koha/Object.pm
@@ -356,6 +356,40 @@ sub _numeric_column_type {
     return ( grep { $column_type eq $_ } @numeric_types) ? 1 : 0;
 }
 
+=head3 to_api
+
+    my $object_for_api = $object->to_api;
+
+Returns a representation of the object, suitable for API output.
+
+=cut
+
+sub to_api {
+    my ( $self ) = @_;
+    my $json_object = $self->TO_JSON;
+
+    # Rename attributes if there's a mapping
+    if ( $self->can('to_api_mapping') ) {
+        foreach my $column ( keys %{$self->to_api_mapping} ) {
+            my $mapped_column = $self->to_api_mapping->{$column};
+            if ( exists $json_object->{$column}
+                && defined $mapped_column )
+            {
+                # key != undef
+                $json_object->{$mapped_column} = delete $json_object->{$column};
+            }
+            elsif ( exists $json_object->{$column}
+                && !defined $mapped_column )
+            {
+                # key == undef
+                delete $json_object->{$column};
+            }
+        }
+    }
+
+    return $json_object;
+}
+
 =head3 $object->unblessed_all_relateds
 
 my $everything_into_one_hashref = $object->unblessed_all_relateds
diff --git a/Koha/Objects.pm b/Koha/Objects.pm
index da43003c88..31387e1442 100644
--- a/Koha/Objects.pm
+++ b/Koha/Objects.pm
@@ -308,6 +308,18 @@ sub TO_JSON {
     return [ map { $_->TO_JSON } $self->as_list ];
 }
 
+=head3 Koha::Objects->to_api
+
+Returns a representation of the objects, suitable for API output .
+
+=cut
+
+sub to_api {
+    my ($self) = @_;
+
+    return [ map { $_->to_api } $self->as_list ];
+}
+
 =head3 Koha::Objects->_wrap
 
 wraps the DBIC object in a corresponding Koha object
-- 
2.11.0