Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
3b2d9be
feat: add migration for main_image_url column on world_heritage_sites
zigzagdev May 4, 2026
073b30a
feat: add migration for main_image_url column on world_heritage_sites
zigzagdev May 4, 2026
cc41986
Merge branch 'chore/add-main_iamge_url' into chore/migration-add-new-…
zigzagdev May 4, 2026
9facf27
Merge pull request #449 from zigzagdev/chore/migration-add-new-column
zigzagdev May 4, 2026
a8c71da
feat: emit main_image_url from normalize path of SplitWorldHeritageJson
zigzagdev May 4, 2026
b6c2c35
feat: fill main_image_url in merge path of SplitWorldHeritageJson
zigzagdev May 4, 2026
1575f82
Merge pull request #450 from zigzagdev/chore/import-main_image_url-in…
zigzagdev May 4, 2026
c7db18c
feat: persist main_image_url via ImportWorldHeritageSiteFromSplitFile
zigzagdev May 4, 2026
645a95b
Merge pull request #451 from zigzagdev/feat/import-persist-main-image…
zigzagdev May 4, 2026
f9e48cd
chore: ship normalized world_heritage_sites.json for main_image_url b…
zigzagdev May 5, 2026
ae3c04a
Merge pull request #452 from zigzagdev/feat/backfill-main-image-url
zigzagdev May 5, 2026
c6d46d1
feat: surface main_image_url from WorldHeritage model and read query …
zigzagdev May 5, 2026
e9c899d
Merge pull request #453 from zigzagdev/chore/add-select-query-into-qu…
zigzagdev May 5, 2026
9bbbe99
feat: add mainImageUrl to WorldHeritageDto
zigzagdev May 5, 2026
1dee45f
feat: pass main_image_url through WorldHeritageDetailFactory::build
zigzagdev May 5, 2026
7c90577
feat: pass main_image_url through WorldHeritageSummaryFactory::build
zigzagdev May 5, 2026
fbfc9bf
feat: prefer main_image_url over images[0] in WorldHeritageViewModel …
zigzagdev May 5, 2026
332d4d3
feat: expose thumbnail_url in WorldHeritageDtoCollection::toSummaryArray
zigzagdev May 5, 2026
dfcc418
test: switch view model collection mock to mainImageUrl
zigzagdev May 5, 2026
c16a74c
Merge pull request #454 from zigzagdev/chore/add-select-query-into-ap…
zigzagdev May 5, 2026
c17209e
fix: include main_image_url in WorldHeritageQueryService::buildWorldH…
zigzagdev May 5, 2026
d589249
fix: include main_image_url in WorldHeritageQueryService::getHeritage…
zigzagdev May 5, 2026
8607c12
feat: select main_image_url in AlgoliaImportWorldHeritages query
zigzagdev May 5, 2026
16cca0b
feat: include main_image_url field in AlgoliaImportWorldHeritages obj…
zigzagdev May 5, 2026
b0cdfc4
feat: prefer main_image_url for thumbnail_url in AlgoliaImportWorldHe…
zigzagdev May 5, 2026
75834dc
Merge pull request #455 from zigzagdev/chore/import-algolia-indexer
zigzagdev May 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion src/app/Console/Commands/AlgoliaImportWorldHeritages.php
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ public function handle(): int
'world_heritage_sites.criteria',
'world_heritage_sites.year_inscribed',
'world_heritage_sites.is_endangered',
'world_heritage_sites.main_image_url',
])
->chunkById($chunk, function ($rows) use ($client, $indexName, $dryRun, &$processed): void {
$objects = [];
Expand Down Expand Up @@ -136,7 +137,8 @@ public function handle(): int
'criteria' => $row->criteria,
'year_inscribed' => $row->year_inscribed !== null ? (int) $row->year_inscribed : null,
'is_endangered' => (bool) $row->is_endangered,
'thumbnail_url' => $row->images->first()?->url,
'main_image_url' => $row->main_image_url,
'thumbnail_url' => $row->main_image_url ?? $row->images->first()?->url,
'state_party_codes' => $statePartyCodes,
'country_names_jp' => $countryCount > 1 ? $countryNamesJp : [],
];
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@ public function handle(): int
'longitude' => $this->toNullableFloat($row['longitude'] ?? null),
'short_description' => $this->toNullableString($row['short_description'] ?? null),
'unesco_site_url' => $this->toNullableString($row['unesco_site_url'] ?? null),
'main_image_url' => $this->toNullableString($row['main_image_url'] ?? null),
'created_at' => $now,
'updated_at' => $now,
];
Expand Down
3 changes: 3 additions & 0 deletions src/app/Console/Commands/SplitWorldHeritageJson.php
Original file line number Diff line number Diff line change
Expand Up @@ -743,6 +743,7 @@ private function normalizeSiteRowImportReady(array $row, int $siteId): array
'longitude' => isset($lon) ? (is_numeric($lon) ? (float) $lon : null) : null,
'short_description' => $this->stringOrNull($row['short_description_en'] ?? null),
'unesco_site_url' => $this->stringOrNull($row['unesco_site_url'] ?? ($row['url'] ?? null)),
'main_image_url' => $this->stringOrNull($row['image_url'] ?? ($row['main_image_url'] ?? null)),
];
}

Expand Down Expand Up @@ -818,6 +819,8 @@ private function mergeSiteRowPreferExisting(array $existing, array $incoming): a
$existing['unesco_site_url'] = $unescoUrl;
}

$fill('main_image_url', $incoming['image_url'] ?? ($incoming['main_image_url'] ?? null));

return $existing;
}

Expand Down
1 change: 1 addition & 0 deletions src/app/Models/WorldHeritage.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ class WorldHeritage extends Model
'longitude',
'short_description',
'unesco_site_url',
'main_image_url',
];

protected $hidden = [
Expand Down
3 changes: 3 additions & 0 deletions src/app/Packages/Domains/WorldHeritageQueryService.php
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ public function getAllHeritages(
'world_heritage_sites.longitude',
'world_heritage_sites.short_description',
'world_heritage_sites.unesco_site_url',
'world_heritage_sites.main_image_url',
])
->with([
'countries' => static function ($q): void {
Expand Down Expand Up @@ -198,6 +199,7 @@ public function getHeritageById(int $id): WorldHeritageDto
'state_parties_meta' => $statePartiesMeta,
'short_description_jp' => $heritage->descriptions->short_description_ja,
'images' => $imageCollection->toArray(),
'main_image_url' => $heritage->main_image_url,
]);
}

Expand Down Expand Up @@ -321,6 +323,7 @@ private function buildWorldHeritagePayload($heritage): array
'short_description' => $heritage->short_description,
'image_url' => $heritage->images->first()?->url,
'unesco_site_url' => $heritage->unesco_site_url,
'main_image_url' => $heritage->main_image_url,
'short_description_jp' => $heritage->descriptions?->short_description_ja,
'state_parties' => $statePartyCodeList,
'state_parties_meta' => $statePartiesMeta,
Expand Down
1 change: 1 addition & 0 deletions src/app/Packages/Domains/WorldHeritageReadQueryService.php
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ public function findByIdsPreserveOrder(array $ids): Collection
'world_heritage_sites.longitude',
'world_heritage_sites.short_description',
'world_heritage_sites.unesco_site_url',
'world_heritage_sites.main_image_url',
])
->with([
'countries' => static function ($q): void {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public function __construct(
private readonly ?string $shortDescriptionJp = null,
private readonly array $statePartyCodes = [],
private readonly array $statePartiesMeta = [],
private readonly ?string $mainImageUrl = null,
){}


Expand Down Expand Up @@ -125,6 +126,11 @@ public function getUnescoSiteUrl(): ?string
return $this->unescoSiteUrl;
}

public function getMainImageUrl(): ?string
{
return $this->mainImageUrl;
}

public function getStatePartyCodes(): array
{
return $this->statePartyCodes ?: $this->getStatePartyCodesOrFallback();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,8 @@ public function toSummaryArray(): array
'unesco_site_url' => $heritage->getUnescoSiteUrl(),
'state_party_codes' => $heritage->getStatePartyCodes(),
'state_parties_meta' => $heritage->getStatePartiesMeta(),
'thumbnail' => $heritage->getThumbnailUrl(),
'thumbnail_url' => $heritage->getMainImageUrl()
?? ($heritage->getImages()[0]['url'] ?? null),
];
}, $this->heritages);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@ public static function build(array $data): WorldHeritageDto
shortDescriptionJp: $data['short_description_jp'] ?? null,
statePartyCodes: $statePartyCodes,
statePartiesMeta: $statePartiesMeta,
mainImageUrl: $data['main_image_url'] ?? null,
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@ public static function build(array $data): WorldHeritageDto
shortDescriptionJp: $data['short_description_jp'] ?? null,
statePartyCodes: $statePartyCodes,
statePartiesMeta: $statePartiesMeta,
mainImageUrl: $data['main_image_url'] ?? null,
);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -211,8 +211,8 @@ public function test_summary_array_matches_expected_with_thumbnail(): void
$this->assertArrayNotHasKey('images', $item);
$this->assertArrayNotHasKey('imageUrl', $item);
$this->assertArrayNotHasKey('state_parties', $item);
$this->assertArrayHasKey('thumbnail', $item);
$this->assertTrue(is_string($item['thumbnail']) || is_null($item['thumbnail']));
$this->assertArrayHasKey('thumbnail_url', $item);
$this->assertTrue(is_string($item['thumbnail_url']) || is_null($item['thumbnail_url']));

return collect($item)->keyBy(static fn($v, $k) => Str::snake($k))->toArray();
})->toArray();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,7 @@ private function mockDto(): WorldHeritageDto
$mock->shouldReceive('getStatePartiesMeta')
->andReturn($this->arrayData()['state_parties_meta']);

$mock->shouldReceive('getThumbnailUrl')
$mock->shouldReceive('getMainImageUrl')
->andReturn($this->arrayData()['thumbnail_url']);

$mock->shouldReceive('getCountryNameJp')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use App\Packages\Features\QueryUseCases\Factory\ViewModel\WorldHeritageViewModelCollectionFactory;
use App\Packages\Features\QueryUseCases\ViewModel\WorldHeritageViewModelCollection;
use Tests\TestCase;
use App\Packages\Features\QueryUseCases\Dto\ImageDto;

class WorldHeritageViewModelCollectionFactoryTest extends TestCase
{
Expand Down Expand Up @@ -103,15 +102,6 @@ private function arrayData(): array
private function mockDtoCollection(): WorldHeritageDtoCollection
{
$dtos = array_map(static function (array $data) {
$thumbnail = isset($data['thumbnail_url']) && $data['thumbnail_url']
? new ImageDto(
id: $data['id'] ?? 0,
url: $data['thumbnail_url'],
sortOrder: 0,
isPrimary: true,
)
: null;

return new WorldHeritageDto(
id: $data['id'],
officialName: $data['official_name'],
Expand All @@ -131,11 +121,12 @@ private function mockDtoCollection(): WorldHeritageDtoCollection
bufferZoneHectares: $data['buffer_zone_hectares'] ?? null,
shortDescription: $data['short_description'] ?? null,
images: null,
imageUrl: $thumbnail,
imageUrl: null,
unescoSiteUrl: $data['unesco_site_url'] ?? null,
shortDescriptionJp: $data['short_description_jp'] ?? null,
statePartyCodes: $data['state_party_codes'] ?? ($data['state_parties'] ?? []),
statePartiesMeta: $data['state_parties_meta'] ?? []
statePartiesMeta: $data['state_parties_meta'] ?? [],
mainImageUrl: $data['thumbnail_url'] ?? null,
);
}, $this->arrayData());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@ public function __construct(

public function getThumbnailUrl(): ?string
{
return $this->dto->getThumbnailUrl();
return $this->dto->getMainImageUrl()
?? ($this->dto->getImages()[0]['url'] ?? null);
}

public function getId(): int
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
public function up(): void
{
Schema::table('world_heritage_sites', function (Blueprint $table) {
$table->string('main_image_url', 2048)->nullable()->after('short_description');
});
}

public function down(): void
{
Schema::table('world_heritage_sites', function (Blueprint $table) {
$table->dropColumn('main_image_url');
});
}
};
Loading
Loading