|
4 | 4 |
|
5 | 5 | use App\DTO\PageDTO; |
6 | 6 | use App\Models\News; |
| 7 | +use App\Models\OpenSource; |
7 | 8 | use App\Models\Page; |
8 | 9 | use App\Models\Product; |
9 | 10 | use App\Models\Service; |
| 11 | +use App\Models\Technology; |
10 | 12 | use Illuminate\Support\Carbon; |
11 | 13 | use Illuminate\Support\Collection; |
12 | 14 | use Illuminate\Support\Str; |
@@ -91,6 +93,36 @@ public function service(Service $service, bool $withReferences = false, ?string |
91 | 93 | ); |
92 | 94 | } |
93 | 95 |
|
| 96 | + public function technology(Technology $technology, bool $withReferences = false, ?string $locale = null): PageDTO |
| 97 | + { |
| 98 | + return new PageDTO( |
| 99 | + locale: $locale ?? $technology->locale->value, |
| 100 | + routeKey: 'technologies.show', |
| 101 | + routeName: Str::slug(title: $locale ?? $technology->locale->value).'.technologies.show', |
| 102 | + title: $technology->title, |
| 103 | + description: $technology->teaser, |
| 104 | + image: $technology->image, |
| 105 | + lastModificationDate: Carbon::parse($technology->updated_at ?? now()), |
| 106 | + routeParameters: ['locale' => $technology->locale, 'technology' => $technology], |
| 107 | + referencePages: $withReferences ? $this->technologyReferencePages($technology) : null, |
| 108 | + ); |
| 109 | + } |
| 110 | + |
| 111 | + public function openSource(OpenSource $openSource, bool $withReferences = false, ?string $locale = null): PageDTO |
| 112 | + { |
| 113 | + return new PageDTO( |
| 114 | + locale: $locale ?? $openSource->locale->value, |
| 115 | + routeKey: 'open-source.show', |
| 116 | + routeName: Str::slug(title: $locale ?? $openSource->locale->value).'.open-source.show', |
| 117 | + title: $openSource->title, |
| 118 | + description: $openSource->teaser, |
| 119 | + image: $openSource->image, |
| 120 | + lastModificationDate: Carbon::parse($openSource->updated_at ?? now()), |
| 121 | + routeParameters: ['locale' => $openSource->locale, 'openSource' => $openSource], |
| 122 | + referencePages: $withReferences ? $this->openSourceReferencePages($openSource) : null, |
| 123 | + ); |
| 124 | + } |
| 125 | + |
94 | 126 | /** |
95 | 127 | * @return Collection<int, PageDTO> |
96 | 128 | */ |
@@ -151,6 +183,46 @@ private function serviceReferencePages(Service $service): Collection |
151 | 183 | return collect($pages); |
152 | 184 | } |
153 | 185 |
|
| 186 | + /** |
| 187 | + * @return Collection<int, PageDTO> |
| 188 | + */ |
| 189 | + private function technologyReferencePages(Technology $technology): Collection |
| 190 | + { |
| 191 | + $pages = []; |
| 192 | + |
| 193 | + foreach ($technology->references as $reference) { |
| 194 | + $reference->load(['target']); |
| 195 | + |
| 196 | + if (! $reference->target instanceof Technology) { |
| 197 | + continue; |
| 198 | + } |
| 199 | + |
| 200 | + $pages[] = $this->technology(technology: $reference->target, withReferences: false, locale: $reference->reference_locale); |
| 201 | + } |
| 202 | + |
| 203 | + return collect($pages); |
| 204 | + } |
| 205 | + |
| 206 | + /** |
| 207 | + * @return Collection<int, PageDTO> |
| 208 | + */ |
| 209 | + private function openSourceReferencePages(OpenSource $openSource): Collection |
| 210 | + { |
| 211 | + $pages = []; |
| 212 | + |
| 213 | + foreach ($openSource->references as $reference) { |
| 214 | + $reference->load(['target']); |
| 215 | + |
| 216 | + if (! $reference->target instanceof OpenSource) { |
| 217 | + continue; |
| 218 | + } |
| 219 | + |
| 220 | + $pages[] = $this->openSource(openSource: $reference->target, withReferences: false, locale: $reference->reference_locale); |
| 221 | + } |
| 222 | + |
| 223 | + return collect($pages); |
| 224 | + } |
| 225 | + |
154 | 226 | private function findPage(): ?Page |
155 | 227 | { |
156 | 228 | return Page::where('locale', $this->locale) |
|
0 commit comments