Use transformer for model files

Signed-off-by: snipe <snipe@snipe.net>
This commit is contained in:
snipe 2025-01-20 20:20:35 +00:00
parent 5afcd8ddb3
commit 0d7304eb8b
3 changed files with 59 additions and 37 deletions

View file

@ -9,6 +9,7 @@ use App\Http\Controllers\Controller;
use App\Models\AssetModel; use App\Models\AssetModel;
use App\Models\Actionlog; use App\Models\Actionlog;
use App\Http\Requests\UploadFileRequest; use App\Http\Requests\UploadFileRequest;
use App\Http\Transformers\AssetModelsTransformer;
use Illuminate\Http\JsonResponse; use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Log;
use Symfony\Component\HttpFoundation\StreamedResponse; use Symfony\Component\HttpFoundation\StreamedResponse;
@ -68,37 +69,15 @@ class AssetModelFilesController extends Controller
/** /**
* List the files for an asset. * List the files for an asset.
* *
* @param int $assetModelId * @param int $assetmodel
* @since [v7.0.12] * @since [v7.0.12]
* @author [r-xyz] * @author [r-xyz]
*/ */
public function list($assetModelId = null) : JsonResponse public function list($assetmodel_id) : JsonResponse | array
{ {
// Start by checking if the asset being acted upon exists $assetmodel = AssetModel::with('uploads')->find($assetmodel_id);
if (! $assetModel = AssetModel::find($assetModelId)) { $this->authorize('view', $assetmodel);
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.does_not_exist')), 404); return (new AssetModelsTransformer)->transformAssetModelFiles($assetmodel, $assetmodel->uploads()->count());
}
// the asset is valid
if (isset($assetModel->id)) {
$this->authorize('view', $assetModel);
// Check that there are some uploads on this asset that can be listed
if ($assetModel->uploads->count() > 0) {
$files = array();
foreach ($assetModel->uploads as $upload) {
array_push($files, $upload);
}
// Give the list of files back to the user
return response()->json(Helper::formatStandardApiResponse('success', $files, trans('admin/models/message.upload.success')));
}
// There are no files.
return response()->json(Helper::formatStandardApiResponse('success', array(), trans('admin/models/message.upload.success')));
}
// Send back an error message
return response()->json(Helper::formatStandardApiResponse('error', null, trans('admin/models/message.download.error')), 500);
} }
/** /**

View file

@ -87,6 +87,41 @@ class AssetModelsTransformer
return $array; return $array;
} }
public function transformAssetModelFiles($assetmodel, $total)
{
$array = [];
foreach ($assetmodel->uploads as $file) {
$array[] = self::transformAssetModelFile($file, $assetmodel);
}
return (new DatatablesTransformer)->transformDatatables($array, $total);
}
public function transformAssetModelFile($file, $assetmodel)
{
$array = [
'id' => (int) $file->id,
'filename' => e($file->filename),
'url' => route('show/modelfile', [$assetmodel->id, $file->id]),
'created_by' => ($file->adminuser) ? [
'id' => (int) $file->adminuser->id,
'name'=> e($file->adminuser->present()->fullName),
] : null,
'created_at' => Helper::getFormattedDateObject($file->created_at, 'datetime'),
'updated_at' => Helper::getFormattedDateObject($file->updated_at, 'datetime'),
'deleted_at' => Helper::getFormattedDateObject($file->deleted_at, 'datetime'),
];
$permissions_array['available_actions'] = [
'delete' => (Gate::allows('update', AssetModel::class) && ($assetmodel->deleted_at == '')),
];
$array += $permissions_array;
return $array;
}
public function transformAssetModelsDatatable($assetmodels) public function transformAssetModelsDatatable($assetmodels)
{ {
return (new DatatablesTransformer)->transformDatatables($assetmodels); return (new DatatablesTransformer)->transformDatatables($assetmodels);

View file

@ -43,11 +43,10 @@ class AssetModelFilesTest extends TestCase
->getJson( ->getJson(
route('api.models.files.index', ['model_id' => $model[0]["id"]])) route('api.models.files.index', ['model_id' => $model[0]["id"]]))
->assertOk() ->assertOk()
->assertJsonStructure([ ->assertJsonStructure([
'status', 'rows',
'messages', 'total',
'payload', ]);
]);
} }
public function testAssetModelApiDownloadsFile() public function testAssetModelApiDownloadsFile()
@ -66,20 +65,25 @@ class AssetModelFilesTest extends TestCase
route('api.models.files.store', ['model_id' => $model[0]["id"]]), [ route('api.models.files.store', ['model_id' => $model[0]["id"]]), [
'file' => [UploadedFile::fake()->create("test.jpg", 100)] 'file' => [UploadedFile::fake()->create("test.jpg", 100)]
]) ])
->assertOk(); ->assertOk()
->assertJsonStructure([
'status',
'messages',
]);
// List the files to get the file ID // List the files to get the file ID
$result = $this->actingAsForApi($user) $result = $this->actingAsForApi($user)
->getJson( ->getJson(
route('api.models.files.index', ['model_id' => $model[0]["id"]])) route('api.models.files.index', ['model_id' => $model[0]["id"]]))
->assertOk(); ->assertOk();
// Get the file // Get the file
$this->actingAsForApi($user) $this->actingAsForApi($user)
->get( ->get(
route('api.models.files.show', [ route('api.models.files.show', [
'model_id' => $model[0]["id"], 'model_id' => $model[0]["id"],
'file_id' => $result->decodeResponseJson()->json()["payload"][0]["id"], 'file_id' => $result->decodeResponseJson()->json()["rows"][0]["id"],
])) ]))
->assertOk(); ->assertOk();
} }
@ -113,8 +117,12 @@ class AssetModelFilesTest extends TestCase
->delete( ->delete(
route('api.models.files.destroy', [ route('api.models.files.destroy', [
'model_id' => $model[0]["id"], 'model_id' => $model[0]["id"],
'file_id' => $result->decodeResponseJson()->json()["payload"][0]["id"], 'file_id' => $result->decodeResponseJson()->json()["rows"][0]["id"],
])) ]))
->assertOk(); ->assertOk()
->assertJsonStructure([
'status',
'messages',
]);
} }
} }