From f728fce33b9ec03eee53bf9f1567324650610648 Mon Sep 17 00:00:00 2001
From: Martin Renvoize <martin.renvoize@ptfs-europe.com>
Date: Fri, 26 Nov 2021 15:35:05 +0000
Subject: [PATCH] ALT: An idea of doing it at singular level?

In this patch I add 'user', containing the Koha::Patron object for the
logged in user in the params hash we pass around in to_api. I then use
that in a new 'is_accessible_in_context' method added to Koha::Patron.

The method name is a bit of a mouthfull.. it could be 'is_limited' as
it's really the equivilent of 'search_limited' in the plural class.. but
I wasn't sure that was actually clearer... if we like it we could strip
back out some of the work around search_related.

As an asside, I also update Koha::Patron->can_see_patrons_from to use
Koha::Patron->libraries_where_can_see_patrons internally.. DRY!

https://bugs.koha-community.org/show_bug.cgi?id=29523
---
 Koha/Object.pm              |  6 ++++--
 Koha/Patron.pm              | 28 ++++++++++++++--------------
 Koha/REST/Plugin/Objects.pm |  4 ++--
 3 files changed, 20 insertions(+), 18 deletions(-)

diff --git a/Koha/Object.pm b/Koha/Object.pm
index fe281dd58d..8fd8371888 100644
--- a/Koha/Object.pm
+++ b/Koha/Object.pm
@@ -552,7 +552,7 @@ Returns a representation of the object, suitable for API output.
 sub to_api {
     my ( $self, $params ) = @_;
 
-    return unless $self->accessible;
+    return unless $self->is_accessible_in_context($params);
 
     my $json_object = $self->TO_JSON;
 
@@ -947,9 +947,11 @@ It relies on the plural class properly implementing the I<search_limited> method
 
 =cut
 
-sub accessible {
+sub is_accessible_in_context {
     my ($self) = @_;
 
+    return 1 and warn "is_accessible_in_context default called";
+
     return $self->_get_objects_class->search_limited(
         {
             map { $_ => $self->$_ }
diff --git a/Koha/Patron.pm b/Koha/Patron.pm
index adf916b5ea..de55beb7f9 100644
--- a/Koha/Patron.pm
+++ b/Koha/Patron.pm
@@ -1348,20 +1348,9 @@ Return true if the patron (usually the logged in user) can see the patron's info
 
 sub can_see_patrons_from {
     my ( $self, $branchcode ) = @_;
-    my $can = 0;
-    if ( $self->branchcode eq $branchcode ) {
-        $can = 1;
-    } elsif ( $self->has_permission( { borrowers => 'view_borrower_infos_from_any_libraries' } ) ) {
-        $can = 1;
-    } elsif ( my $library_groups = $self->library->library_groups ) {
-        while ( my $library_group = $library_groups->next ) {
-            if ( $library_group->parent->has_child( $branchcode ) ) {
-                $can = 1;
-                last;
-            }
-        }
-    }
-    return $can;
+    my @branches = $self->libraries_where_can_see_patrons;
+    return 1 unless @branches;
+    return any { $_ eq $branchcode } @branches;
 }
 
 =head3 can_log_into
@@ -1752,6 +1741,17 @@ sub get_extended_attribute {
     return $attribute->next;
 }
 
+=head3 is_accessible_in_context
+
+=cut
+
+sub is_accessible_in_context {
+    my ($self, $params) = @_;
+
+    my $consumer = $params->{user};
+    return $consumer->can_see_patron_infos($self);
+}
+
 =head3 to_api
 
     my $json = $patron->to_api;
diff --git a/Koha/REST/Plugin/Objects.pm b/Koha/REST/Plugin/Objects.pm
index ddf2194530..ef58e09189 100644
--- a/Koha/REST/Plugin/Objects.pm
+++ b/Koha/REST/Plugin/Objects.pm
@@ -66,7 +66,7 @@ the requested object. It passes through any embeds if specified.
 
             return unless $object;
 
-            return $object->to_api({ embed => $embed });
+            return $object->to_api({ embed => $embed, user => $c->stash('koha.user') });
         }
     );
 
@@ -164,7 +164,7 @@ for API rendering.
                 }
             );
 
-            return $objects->to_api({ embed => $embed, public => $is_public });
+            return $objects->to_api({ embed => $embed, public => $is_public, user => $c->stash('koha.user') });
         }
     );
 }
-- 
2.20.1