View | Details | Raw Unified | Return to bug 24228
Collapse All | Expand All

(-)a/Koha/Object.pm (-13 / +45 lines)
Lines 381-405 Returns a representation of the object, suitable for API output. Link Here
381
=cut
381
=cut
382
382
383
sub to_api {
383
sub to_api {
384
    my ( $self ) = @_;
384
    my ( $self, $embeds ) = @_;
385
    my $json_object = $self->TO_JSON;
385
    my $json_object = $self->TO_JSON;
386
386
387
    my $to_api_mapping = $self->to_api_mapping;
387
    my $to_api_mapping = $self->to_api_mapping;
388
388
389
    # Rename attributes if there's a mapping
389
    # Rename attributes if there's a mapping
390
    foreach my $column ( keys %{$to_api_mapping} ) {
390
    if ( $self->can('to_api_mapping') ) {
391
        my $mapped_column = $to_api_mapping->{$column};
391
        foreach my $column ( keys %{ $self->to_api_mapping } ) {
392
        if ( exists $json_object->{$column}
392
            my $mapped_column = $self->to_api_mapping->{$column};
393
            && defined $mapped_column )
393
            if ( exists $json_object->{$column}
394
        {
394
                && defined $mapped_column )
395
            # key != undef
395
            {
396
            $json_object->{$mapped_column} = delete $json_object->{$column};
396
                # key != undef
397
                $json_object->{$mapped_column} = delete $json_object->{$column};
398
            }
399
            elsif ( exists $json_object->{$column}
400
                && !defined $mapped_column )
401
            {
402
                # key == undef
403
                delete $json_object->{$column};
404
            }
397
        }
405
        }
398
        elsif ( exists $json_object->{$column}
406
    }
399
            && !defined $mapped_column )
407
400
        {
408
    if ($embeds) {
401
            # key == undef
409
        foreach my $embed (@$embeds) {
402
            delete $json_object->{$column};
410
            my ( $curr, $next ) = split /\s*\.\s*/, $embed, 2;
411
            my @nxembeds;
412
413
            @nxembeds = ($next) if $next;
414
415
            my $children = $self->$curr;
416
            if ( ref $children eq 'ARRAY' ) {
417
                my @list;
418
                my $pos = 0;
419
                foreach my $child (@$children) {
420
                    my $res = $child->to_api( \@nxembeds );
421
                    $res = { $json_object->{$curr}->[$pos], $res }
422
                      if defined $json_object->{$curr}
423
                      && defined $json_object->{$curr}->[$pos];
424
                    push @list, $res;
425
                    $pos++;
426
                }
427
                $json_object->{$curr} = \@list;
428
            }
429
            else {
430
                my $res = $children->to_api( \@nxembeds );
431
                $res = { $json_object->{$curr}, $res }
432
                  if defined $json_object->{$curr};
433
                $json_object->{$curr} = $res;
434
            }
403
        }
435
        }
404
    }
436
    }
405
437
(-)a/Koha/Objects.pm (-2 / +2 lines)
Lines 315-323 Returns a representation of the objects, suitable for API output . Link Here
315
=cut
315
=cut
316
316
317
sub to_api {
317
sub to_api {
318
    my ($self) = @_;
318
    my ($self, $embeds) = @_;
319
319
320
    return [ map { $_->to_api } $self->as_list ];
320
    return [ map { $_->to_api($embeds) } $self->as_list ];
321
}
321
}
322
322
323
=head3 Koha::Objects->_wrap
323
=head3 Koha::Objects->_wrap
(-)a/t/db_dependent/Koha/Object.t (-2 / +39 lines)
Lines 215-221 subtest 'TO_JSON tests' => sub { Link Here
215
215
216
subtest "to_api() tests" => sub {
216
subtest "to_api() tests" => sub {
217
217
218
    plan tests => 11;
218
    plan tests => 18;
219
219
220
    $schema->storage->txn_begin;
220
    $schema->storage->txn_begin;
221
221
Lines 262-267 subtest "to_api() tests" => sub { Link Here
262
    my $illrequest = $builder->build_object({ class => 'Koha::Illrequests' });
262
    my $illrequest = $builder->build_object({ class => 'Koha::Illrequests' });
263
    is_deeply( $illrequest->to_api, $illrequest->TO_JSON, 'If no overloaded to_api_mapping method, return TO_JSON' );
263
    is_deeply( $illrequest->to_api, $illrequest->TO_JSON, 'If no overloaded to_api_mapping method, return TO_JSON' );
264
264
265
    my $item_class = Test::MockModule->new('Koha::Item');
266
    $item_class->mock( 'to_api_mapping',
267
        sub {
268
            return {
269
                itemnumber       => 'item_id'
270
            };
271
        }
272
    );
273
274
    my $hold_class = Test::MockModule->new('Koha::Hold');
275
    $hold_class->mock( 'to_api_mapping',
276
        sub {
277
            return {
278
                reserve_id       => 'hold_id'
279
            };
280
        }
281
    );
282
283
    my $biblio = $builder->build_sample_biblio();
284
    my $item = $builder->build_sample_item({ biblionumber => $biblio->biblionumber });
285
    my $hold = $builder->build_object({ class => 'Koha::Holds', value => { itemnumber => $item->itemnumber } });
286
287
    my @embeds = ('items');
288
289
    my $biblio_api = $biblio->to_api(\@embeds);
290
291
    ok(exists $biblio_api->{items}, 'Items where embedded in biblio results');
292
    is($biblio_api->{items}->[0]->{item_id}, $item->itemnumber, 'Item matches');
293
    ok(!exists $biblio_api->{items}->[0]->{holds}, 'No holds info should be embedded yet');
294
295
    @embeds = ('items.holds');
296
    $biblio_api = $biblio->to_api(\@embeds);
297
298
    ok(exists $biblio_api->{items}, 'Items where embedded in biblio results');
299
    is($biblio_api->{items}->[0]->{item_id}, $item->itemnumber, 'Item still matches');
300
    ok(exists $biblio_api->{items}->[0]->{holds}, 'Holds info should be embedded');
301
    is($biblio_api->{items}->[0]->{holds}->[0]->{hold_id}, $hold->reserve_id, 'Hold matches');
302
265
    $schema->storage->txn_rollback;
303
    $schema->storage->txn_rollback;
266
};
304
};
267
305
268
- 

Return to bug 24228