Skip to content

Commit

Permalink
Create serializers and transformers
Browse files Browse the repository at this point in the history
[MA-94] [MA-95] [MA-96]
  • Loading branch information
zachgarwood committed Jul 25, 2023
1 parent 0fbe1f1 commit 5650c8f
Show file tree
Hide file tree
Showing 9 changed files with 198 additions and 2 deletions.
1 change: 0 additions & 1 deletion app/Models/Api/Exhibition.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use App\Helpers\StringHelpers;
use App\Libraries\Api\Models\BaseApiModel;
use App\Presenters\Admin\ExhibitionPresenter;

class Exhibition extends BaseApiModel
{
Expand Down
19 changes: 19 additions & 0 deletions app/Models/Transformers/ExhibitionTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

namespace App\Models\Transformers;

use A17\Twill\Models\Contracts\TwillModelContract;
use League\Fractal\TransformerAbstract;

class ExhibitionTransformer extends TransformerAbstract
{
public function transform(TwillModelContract $exhibition)
{
return [
'title' => $exhibition->title,
'image_url' => $exhibition->image_url,
'exhibition_id' => (string) $exhibition->id,
'sort' => 0, // TODO: Implement with `HasPostion` trait on model
];
}
}
29 changes: 29 additions & 0 deletions app/Models/Transformers/GalleryTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace App\Models\Transformers;

use A17\Twill\Models\Contracts\TwillModelContract;
use League\Fractal\TransformerAbstract;

class GalleryTransformer extends TransformerAbstract
{
public function transform(TwillModelContract $gallery)
{
return [
$gallery->id => [
'title' => $gallery->title,
'nid' => (string) $gallery->id, // Legacy from Drupal
'location' => $gallery->latlon,
'latitude' => $gallery->latitude,
'longitude' => $gallery->longitude,
'gallery_id' => (string) $gallery->id,
'tgn_id' => null,// Legacy from Drupal
'closed' => $gallery->is_closed,
'number' => $gallery->number,
'floor' => $gallery->floor,
'source_updated_at' => $gallery->source_updated_at,
'updated_at' => $gallery->updated_at,
]
];
}
}
32 changes: 32 additions & 0 deletions app/Models/Transformers/ObjectTransformer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace App\Models\Transformers;

use A17\Twill\Models\Contracts\TwillModelContract;
use League\Fractal\TransformerAbstract;

class ObjectTransformer extends TransformerAbstract
{
public function transform(TwillModelContract $object)
{
return [
$object->id => [
'title' => $object->title,
'nid' => (string) $object->id, // Legacy from Drupal
'id' => $object->id,
'artist_culture_place_delim' => $object->artist_display,
'credit_line' => $object->credit_line,
'catalogue_display' => $object->catalogue_display,
'edition' => $object->edition,
'fiscal_year_deaccession' => $object->fiscal_year_deaccession,
'copyright_notice' => $object->copyright_notice,
'on_loan_display' => $object->on_loan_display,
'location' => $object->latlon,
'image_url' => $object->image_url,
// TODO image-related items go here
'gallery_location' => $object->gallery()?->title,
'audio_commentary' => [], // TODO Tours and Audio files
]
];
}
}
15 changes: 15 additions & 0 deletions app/Repositories/Serializers/AssociativeArraySerializer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace App\Repositories\Serializers;

use League\Fractal\Serializer\ArraySerializer;

class AssociativeArraySerializer extends ArraySerializer
{
public function collection($resourceKey, array $data): array
{
return [$resourceKey => collect($data)->mapWithKeys(function (array $item, $index) {
return [$key = array_key_first($item) => $item[$key]];
})];
}
}
26 changes: 26 additions & 0 deletions app/Repositories/Serializers/ExhibitionSerializer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
<?php

namespace App\Repositories\Serializers;

use League\Fractal\Manager;
use League\Fractal\Resource;
use League\Fractal\Serializer\ArraySerializer;
use App\Models\Transformers\ExhibitionTransformer;

class ExhibitionSerializer
{
protected ?Manager $manager = null;

public function __construct()
{
$this->manager = new Manager();
$this->manager->setSerializer(new ArraySerializer());
}

public function serialize($exhibitions)
{
collect($exhibitions)->each->getAugmentedModel();
$resource = new Resource\Collection($exhibitions, new ExhibitionTransformer(), 'exhibitions');
return $this->manager->createData($resource)->toArray();
}
}
25 changes: 25 additions & 0 deletions app/Repositories/Serializers/GallerySerializer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

namespace App\Repositories\Serializers;

use League\Fractal\Manager;
use League\Fractal\Resource;
use App\Models\Transformers\GalleryTransformer;

class GallerySerializer
{
protected ?Manager $manager = null;

public function __construct()
{
$this->manager = new Manager();
$this->manager->setSerializer(new AssociativeArraySerializer());
}

public function serialize($galleries)
{
collect($galleries)->each->getAugmentedModel();
$resource = new Resource\Collection($galleries, new GalleryTransformer(), 'galleries');
return $this->manager->createData($resource)->toArray();
}
}
24 changes: 24 additions & 0 deletions app/Repositories/Serializers/ObjectSerializer.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<?php

namespace App\Repositories\Serializers;

use League\Fractal\Manager;
use League\Fractal\Resource;
use App\Models\Transformers\ObjectTransformer;

class ObjectSerializer
{
protected ?Manager $manager = null;

public function __construct()
{
$this->manager = new Manager();
$this->manager->setSerializer(new AssociativeArraySerializer());
}

public function serialize($objects)
{
$resource = new Resource\Collection($objects, new ObjectTransformer(), 'objects');
return $this->manager->createData($resource)->toArray();
}
}
29 changes: 28 additions & 1 deletion routes/api.php
Original file line number Diff line number Diff line change
@@ -1,7 +1,14 @@
<?php

use App\Repositories\Api\ArtworkRepository;
use App\Repositories\Api\ExhibitionRepository;
use App\Repositories\Api\GalleryRepository;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Route;
use App\Repositories\Serializers\ExhibitionSerializer;
use App\Repositories\Serializers\GallerySerializer;
use App\Repositories\Serializers\ObjectSerializer;

/*
|--------------------------------------------------------------------------
Expand All @@ -13,7 +20,27 @@
| be assigned to the "api" middleware group. Make something great!
|
*/

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
return $request->user();
});

Route::get('/exhibitions', function () {
$repository = App::make(ExhibitionRepository::class);
$exhibitions = $repository->getBaseModel()->newQuery()->startedFeaturedAndNotClosed()->get();
$serializer = new ExhibitionSerializer();
return $serializer->serialize($exhibitions);
});

Route::get('/galleries', function () {
$repository = App::make(GalleryRepository::class);
$galleries = $repository->getBaseModel()->newQuery()->get();
$serializer = new GallerySerializer();
return $serializer->serialize($galleries);
});

Route::get('/objects', function () {
$repository = App::make(ArtworkRepository::class);
$objects = $repository->getBaseModel()->newQuery()->get();
$serializer = new ObjectSerializer();
return $serializer->serialize($objects);
});

0 comments on commit 5650c8f

Please sign in to comment.