2022-07-28 12:32:37 +02:00
|
|
|
<?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> */
|
2022-08-01 16:27:22 +02:00
|
|
|
$mediaList = Media::cacheForever()->withTrashed()->fromSub(
|
2022-07-28 12:32:37 +02:00
|
|
|
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'])
|
2022-08-01 16:27:22 +02:00
|
|
|
->paginate();
|
2022-07-28 12:32:37 +02:00
|
|
|
|
2022-08-01 17:38:13 +02:00
|
|
|
return new MediaListResource($mediaList, true);
|
2022-07-28 12:32:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 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);
|
|
|
|
|
}
|
|
|
|
|
}
|