ldc-dam/app/Http/Controllers/Api/MediaController.php
2022-08-01 17:38:13 +02:00

86 lines
3.1 KiB
PHP

<?php
namespace App\Http\Controllers\Api;
use App\Enums\MediaStatut;
use App\Http\Controllers\Controller;
use App\Http\Resources\Api\MediaListResource;
use App\Http\Resources\Api\MediaPictureResource;
use App\Http\Resources\Api\MediaResource;
use App\Models\Article;
use App\Models\Media;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Http\Resources\Json\ResourceCollection as JsonResourceCollection;
use Illuminate\Support\Facades\DB;
class MediaController extends Controller
{
/**
* Show specific media
*
* @param \App\Models\Media $media
* @return \Illuminate\Http\Resources\Json\JsonResource
*/
public function show(Media $media): JsonResource
{
return new MediaResource($media);
}
/**
* Get Media list of the latest version for each vue type and variant
* of media that is linked with an article.
*
* Working example
* SELECT `mediaList`.`id`,`mediaList`.`arcadia_id`,`mediaList`.`libelle`,`mediaList`.`uid`,
* `mediaList`.`version`,`mediaList`.`type_vue_id`,`mediaList`.`variante_id`,`mediaList`.`created_at`,`mediaList`.`updated_at`
* FROM (
* SELECT `media`.*
* from `media`
* JOIN `media_article` ON `media_article`.`media_id` =`media`.`id`
* JOIN `articles` ON `articles`.`id` =`media_article`.`article_id` AND `articles`.`noArt` = 2842
* WHERE
* `media`.type_media_id IN (1,5) AND
* `media`.isLocked = 0 AND
* `media`.statut != 0
* ORDER BY `version` DESC
* LIMIT 18446744073709551615
* ) AS mediaList
* GROUP BY `type_vue_id`,`variante_id`
*
* @param \App\Models\Article $article
* @return \Illuminate\Http\Resources\Json\ResourceCollection
*/
public function getMediaListByArticle(Article $article): JsonResourceCollection
{
// ! Hack to allow group by (may have side effects)
DB::statement("SET SQL_MODE=''");
/** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Media> */
$mediaList = Media::cacheForever()->withTrashed()->fromSub(
Media::query()->whereHas('articles', function ($q) use ($article) {
$q->where('noArt', $article->noArt);
})->whereHas('typeMedia', function ($q) {
$q->whereIn('libelle', ['Photo', 'jpeg']);
})->where('isLocked', false)
->where('statut', '!=', MediaStatut::brouillon)
->orderBy('version', 'DESC')
// ! Maria Hack: use limit to preserve order.
->limit(\PHP_INT_MAX),
'mediaList'
)->groupBy(['mediaList.type_vue_id', 'mediaList.variante_id'])
->paginate();
return new MediaListResource($mediaList, true);
}
/**
* Get Media picture resource
*
* @param \App\Models\Media $media
* @return \Illuminate\Http\Resources\Json\JsonResource
*/
public function getMediaPicture(Media $media): JsonResource
{
return new MediaPictureResource($media);
}
}