// __('!! e-Learning')
+use App\Http\Middleware\CheckIfAdmin;
use App\Jobs\ElearningMediaDownload;
+use App\Jobs\QuizDownload;
use App\Models\ELearningMedia;
+use App\Models\Quiz;
+use Cubist\Backpack\Http\Controllers\Base\XSendFileController;
use Illuminate\Support\Facades\Route;
use Prologue\Alerts\Facades\Alert;
{
protected function setupDownloadRoutes($segment, $routeName, $controller)
{
- Route::match(['get'], $segment . '/{id}/download/{action}', $controller . '@download');
+ Route::match(['get'], $segment . '/{id}/package/{action}/{version?}', $controller . '@package');
+ Route::match(['get'], $segment . '/{id}_{hash}/download/{file}', $controller . '@download')->withoutMiddleware([CheckIfAdmin::class]);;
}
protected function setupDownloadDefaults()
$this->crud->addButtonFromView('line', 'download', 'elearningmedia.download', 'end');
}
- protected function download($id, $action)
+ protected function package($id, $action, $version = null)
{
- ElearningMediaDownload::dispatch(ELearningMedia::find($id), $action, backpack_user())->onQueue('download');;
+ if (!ElearningMedia::hasPermission($id, 'read')) {
+ abort(401);
+ }
+ $media = ElearningMedia::withoutGlobalScopes()->find($id);
+ $version = $version ?? $media->scorm_version;
+ ElearningMediaDownload::dispatch($media, $action, $version, backpack_user())->onQueue('download');;
Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash();
return redirect(backpack_url('elearning-media'));
}
+
+ protected function download($id, $hash, $file)
+ {
+ $media = ElearningMedia::withoutGlobalScopes()->where('id', $id)->where('hash', $hash)->first();
+ if (null === $media) {
+ abort(404, __('Ce fichier est indisponible'));
+ }
+ $path = protected_path('elearning-media/download/' . $id . '/' . $file);
+ if (!file_exists($path)) {
+ abort(404, __('Le fichier n\'existe pas'));
+ }
+ return XSendFileController::sendfile($path);
+ }
+
+// protected function download($id, $action)
+// {
+// ElearningMediaDownload::dispatch(ELearningMedia::find($id), $action, backpack_user())->onQueue('download');;
+// Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash();
+// return redirect(backpack_url('elearning-media'));
+// }
}
namespace App\Http\Controllers\Admin\Operations\ELearningPackage;
+use App\Http\Middleware\CheckIfAdmin;
use App\Jobs\ElearningPackageDownload;
use App\Models\ELearningPackage;
+use Cubist\Backpack\Http\Controllers\Base\XSendFileController;
use Illuminate\Support\Facades\Route;
use Prologue\Alerts\Facades\Alert;
{
protected function setupDownloadRoutes($segment, $routeName, $controller)
{
- Route::match(['get'], $segment . '/{id}/download/{action}', $controller . '@download');
+ Route::match(['get'], $segment . '/{id}/package/{action}/{version?}', $controller . '@package');
+ Route::match(['get'], $segment . '/{id}_{hash}/download/{file}', $controller . '@download')->withoutMiddleware([CheckIfAdmin::class]);;
}
protected function setupDownloadDefaults()
$this->crud->addButtonFromView('line', 'download', 'elearningpackage.download', 'end');
}
- protected function download($id, $action)
+ protected function package($id, $action, $version = null)
{
- ElearningPackageDownload::dispatch(ELearningPackage::find($id), $action, backpack_user())->onQueue('download');
+ if (!ElearningPackage::hasPermission($id, 'read')) {
+ abort(401);
+ }
+ $media = ElearningPackage::withoutGlobalScopes()->find($id);
+ $version = $version ?? $media->scorm_version;
+ ElearningPackageDownload::dispatch($media, $action, $version, backpack_user())->onQueue('download');;
Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash();
return redirect(backpack_url('elearning-package'));
}
+
+ protected function download($id, $hash, $file)
+ {
+ $media = ElearningPackage::withoutGlobalScopes()->where('id', $id)->where('hash', $hash)->first();
+ if (null === $media) {
+ abort(404, __('Ce fichier est indisponible'));
+ }
+ $path = protected_path('elearningmedia/download/' . $id . '/' . $file);
+ if (!file_exists($path)) {
+ abort(404, __('Le fichier n\'existe pas'));
+ }
+ return XSendFileController::sendfile($path);
+ }
+
+// protected function download($id, $action)
+// {
+// ElearningPackageDownload::dispatch(ELearningPackage::find($id), $action, backpack_user())->onQueue('download');
+// Alert::add('success', __('La compilation a été placée en file d\'attente. Vous recevrez un email lorsqu\'elle sera terminée.'))->flash();
+// return redirect(backpack_url('elearning-package'));
+// }
}
namespace App\Jobs\Maintenance;
use App\Jobs\Base;
+use App\Models\ELearningMedia;
+use App\Models\ELearningPackage;
use App\Models\FluidbookPublication;
use App\Models\Quiz;
use Illuminate\Support\Facades\Log;
{
public function handle()
{
+ $classes = ['Quiz' => Quiz::class, 'Elearning Media' => ELearningMedia::class, 'Elearning Package' => ELearningPackage::class];
+
+ foreach ($classes as $name => $class) {
+ $class::withoutGlobalScopes()->where('created_ok', '0')->forceDelete();
+ foreach ($class::withoutGlobalScopes()->where(function ($query) {
+ $query->whereNull('hash')->orWhere('hash', '');
+ })->get() as $instance) {
+ //Log::warning($name . ' #' . $instance->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $instance->hash]);
+ $instance->save();
+ };
+
+
+ }
+
/** @var FluidbookPublication $fluidbook */
- foreach (FluidbookPublication::withoutGlobalScopes()->where('created_ok', '1')->where(function ($query) {
+ FluidbookPublication::withoutGlobalScopes()->where('created_ok', '0')->forceDelete();
+ foreach (FluidbookPublication::withoutGlobalScopes()->where(function ($query) {
$query->whereNull('hash')->orWhere('hash', '')->orWhereNull('cid')->orWhere('cid', '');
})->get() as $fluidbook) {
- Log::warning('Fluidbook #' . $fluidbook->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $fluidbook->hash, 'cid' => $fluidbook->cid]);
+ //Log::warning('Fluidbook #' . $fluidbook->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $fluidbook->hash, 'cid' => $fluidbook->cid]);
$fluidbook->save();
}
- /** @var Quiz $fluidbook */
- foreach (Quiz::withoutGlobalScopes()->where('created_ok', '1')->where(function ($query) {
- $query->whereNull('hash')->orWhere('hash', '');
- })->get() as $quiz) {
- Log::warning('Quiz #' . $quiz->id . ' had empty hash or cid (hash: hash , cid: :cid)', ['hash' => $quiz->hash]);
- $quiz->save();
- }
+
}
}
use App\Http\Controllers\Admin\Operations\ELearningMedia\PreviewOperation;
use App\Http\Controllers\Admin\Operations\ELearningMedia\DownloadOperation;
use App\Models\Base\ToolboxModel;
+use App\Models\Traits\CheckHash;
use App\Models\Traits\SCORMVersionTrait;
use Cubist\Backpack\Magic\Fields\Files;
use Cubist\Backpack\Magic\Fields\Hidden;
class ELearningMedia extends ToolboxModel
{
use SCORMVersionTrait;
+ use CheckHash;
protected $table = 'elearning_media';
{
parent::setFields();
+ $this->addHashField();
+
$this->addField(['name' => 'client',
'label' => __('Nom du client'),
'type' => 'Text',
return $title;
}
+ public function onSaving(): bool
+ {
+ $this->checkHash();
+ return parent::onSaving();
+ }
+
public function getIdTitleAttribute()
{
return $this->id . ' - ' . $this->title;
use App\Http\Controllers\Admin\Operations\ELearningPackage\PreviewOperation;
use App\Http\Controllers\Admin\Operations\ELearningPackage\DownloadOperation;
use App\Models\Base\ToolboxModel;
+use App\Models\Traits\CheckHash;
use App\Models\Traits\SCORMVersionTrait;
use App\Services\WorkshopV2;
use App\SubForms\ElearningPackageContent;
use Cubist\Util\Files\VirtualDirectory;
use Cubist\Util\Zip;
use DirectoryIterator;
+
// __('!! e-Learning')
class ELearningPackage extends ToolboxModel
{
use SCORMVersionTrait;
+ use CheckHash;
protected $table = 'elearning_package';
protected static $_permissionBase = 'elearning-package';
- protected $_operations = [ImportOperation::class, PreviewOperation::class, DownloadOperation::class,ChangeownerOperation::class];
+ protected $_operations = [ImportOperation::class, PreviewOperation::class, DownloadOperation::class, ChangeownerOperation::class];
public function setFields()
{
parent::setFields();
+ $this->addHashField();
+
$this->addField(['name' => 'client',
'label' => __('Nom du client'),
'type' => 'Text',
return $res;
}
+ public function onSaving(): bool
+ {
+ $this->checkHash();
+ return parent::onSaving();
+ }
+
/**
* @param $id int
* @param $vdir VirtualDirectory
$this->_main();
- $this->addField('hash', Hidden::class);
+ $this->addHashField();
$this->addField('cid', Hidden::class);
{
parent::setFields();
- $this->addField('hash', Hidden::class);
+ $this->addHashField();
$this->addField(['name' => 'client',
'label' => __('Nom du client'),
namespace App\Models\Traits;
+use Cubist\Backpack\Magic\Fields\Hidden;
+
trait CheckHash
{
protected function checkHash()
$this->hash = md5(uniqid('fluidbook_hash'), false);
}
}
+
+ protected function addHashField(){
+ $this->addField('hash', Hidden::class);
+ }
}