parent::__construct($attributes);
}
+
}
--- /dev/null
+<?php
+
+namespace App\Http\Controllers\Admin\Operations\Badges;
+
+
+use App\Models\Badges\Assertion;
+use App\Models\Badges\BadgeClass;
+use App\Models\Badges\Issuer;
+use Cubist\Util\Files\Files;
+use Illuminate\Support\Facades\Route;
+use App\Http\Middleware\CheckIfAdmin;
+
+trait OpenBadgesOperation
+{
+ protected function setupOpenBadgesRoutes($segment, $routeName, $controller)
+ {
+
+
+ Route::match(['get'], '/ob/assertion/{uid}', $controller . '@openBadgesAssertion')->withoutMiddleware([CheckIfAdmin::class]);
+ Route::match(['get'], '/ob/assertion/{uid}/image', $controller . '@openBadgesAssertionImage')->withoutMiddleware([CheckIfAdmin::class]);
+ Route::match(['get'], '/ob/issuer/{uid}', $controller . '@openBadgesIssuer')->withoutMiddleware([CheckIfAdmin::class]);
+ Route::match(['get'], '/ob/issuer/{uid}/image', $controller . '@openBadgesIssuerImage')->withoutMiddleware([CheckIfAdmin::class]);
+ Route::match(['get'], '/ob/badge/{uid}', $controller . '@openBadgesBadge')->withoutMiddleware([CheckIfAdmin::class]);
+ Route::match(['get'], '/ob/badge/{uid}/image', $controller . '@openBadgesBadgeImage')->withoutMiddleware([CheckIfAdmin::class]);
+ }
+
+ public function openBadgesAssertion($uid)
+ {
+ return response()->json($this->_getAssertionInstance($uid)->getOpenBadgesData());
+ }
+
+ public function openBadgesAssertionImage($uid)
+ {
+ return response()->file($this->_getAssertionInstance($uid)->getImagePath(), ['content-type' => 'image/png']);
+ }
+
+ /**
+ * @param $uid
+ * @return Assertion
+ */
+ protected function _getAssertionInstance($uid)
+ {
+ return Assertion::withoutGlobalScopes()->whereUid($uid)->first();
+ }
+
+ /**
+ * @param $uid
+ * @return Issuer
+ */
+ protected function _getIssuerInstance($uid)
+ {
+ return Issuer::withoutGlobalScopes()->whereUid($uid)->first();
+ }
+
+ /**
+ * @param $uid
+ * @return BadgeClass
+ */
+ protected function _getBadgeInstance($uid)
+ {
+ return BadgeClass::withoutGlobalScopes()->whereUid($uid)->first();
+ }
+
+ public function openBadgesIssuer($uid)
+ {
+ return response()->json($this->_getIssuerInstance($uid)->getOpenBadgesData());
+ }
+
+ public function openBadgesIssuerImage($uid)
+ {
+ $file = $this->_getIssuerInstance($uid)->getImagePath();
+ return response()->file($file, ['content-type' => Files::getMimeType($file)]);
+ }
+
+ public function openBadgesBadge($uid)
+ {
+
+ return response()->json($this->_getBadgeInstance($uid)->getOpenBadgesData());
+ }
+
+ public function openBadgesBadgeImage($uid)
+ {
+ return response()->file($this->_getBadgeInstance($uid)->getImagePath(), ['content-type' => 'image/png']);
+ }
+}
+
namespace App\Models\Badges;
use App\Fields\Badge;
+use App\Http\Controllers\Admin\Operations\Badges\OpenBadgesOperation;
use Cubist\Backpack\Magic\Fields\Code;
use Cubist\Backpack\Magic\Fields\Datetime;
use Cubist\Backpack\Magic\Fields\Email;
+use Cubist\Backpack\Magic\Fields\NoValue;
use Cubist\Backpack\Magic\Fields\Text;
use Cubist\Util\Files\Files;
protected static $_ownerAttribute = null;
+ protected $_operations = [OpenBadgesOperation::class];
+
public function setFields()
{
parent::setFields();
$this->addField('badge', Badge::class, __('Badge'), ['column' => true]);
}
- public function getAssertionJSON()
+ public function getOpenBadgesData($context = true)
{
+ return array_merge(parent::getOpenBadgesData($context), ["type" => "Assertion",
+ "recipient" => [
+ "type" => "email",
+ 'hashed' => true,
+ "identity" => 'sha256$' . hash('sha256', $this->email),
+ ],
+ "issuedOn" => (new \DateTime($this->created_at))->format(\DateTime::ATOM),
+ "verification" => [
+ "type" => "hosted"
+ ],
+ "badge" => $this->getBadgeClassInstance()->getOpenBadgeURL()
+ ]);
+ }
+ /**
+ * @return BadgeClass
+ */
+ public function getBadgeClassInstance()
+ {
+ return BadgeClass::withoutGlobalScopes()->find($this->badge);
}
public function onSaved(): bool
$d['date'] = (new \DateTime($this->created_at))->format('Y-m-d');
$image = BadgeClass::generateImage($d);
- $dest = Files::mkdir(protected_path('badge/assertions')) . $this->uid . '.png';
+ $dest = $this->getImagePath();
$im = new \Imagick($image);
- $im->setImageProperty('openbadges', 'https://toolbox.fluidbook.com/ob/assertion/' . $this->uid);
+ $im->setImageProperty('openbadges', $this->getOpenBadgeURL());
$im->writeImage($dest);
return $res;
}
+ public function getImagePath()
+ {
+ return Files::mkdir(protected_path('badge/assertions')) . $this->uid . '.png';
+ }
+
+ public function getOpenBadgeURL()
+ {
+ return 'https://toolbox.fluidbook.com/ob/assertion/' . $this->uid;
+ }
+
}
$this->addField('name', Text::class, __('Nom du certificat'), ['column' => true]);
$this->addField('area', Text::class, __('Domaine de formation'));
$this->addField('description', Textarea::class, __('Description du certificat'), ['hint' => __('Description de la formation. Sera intégré dans les métadonnées du certificat, mais invisible dans l\'image')]);
+ $this->addField('criteria', Textarea::class, __('Critères'), ['hint' => __('Contenus de la formation, compétences validées, connaissances aquises, etc.')]);
$this->addField('locale', ElearningLocale::class, __('Locale'), ['default' => 'en']);
$this->addField('template', Files::class, __('Template du badge'));
$this->addField('preview', 'NoValue', __('Preview'), ['column_escape' => false, 'column' => true, 'column_type' => 'model_function', 'column_function_name' => 'getPreviewImage', 'column_limit' => -1]);
}
+ public function getOpenBadgesData($context = true)
+ {
+
+ return array_merge(parent::getOpenBadgesData($context), ["type" => "BadgeClass",
+ "name" => $this->name,
+ "description" => $this->description,
+ "criteria" => ['narative' => $this->criteria],
+ 'issuer' => $this->getIssuerInstance()->getOpenBadgeURL()
+ ]);
+ }
+
+ /**
+ * @return Issuer
+ */
+ public function getIssuerInstance()
+ {
+ return Issuer::withoutGlobalScopes()->find($this->issuer);
+ }
+
public function onSaved(): bool
{
$res = parent::onSaved();
$this->generateSampleImage();
+ $this->getImagePath();
return $res;
}
return $d;
}
+ public function getImagePath()
+ {
+ $data = $this->getPreviewData();
+ $data['earner'] = $data['completed'] = $data['date'] = '';
+ return self::generateImage($data);
+ }
+
public function generateSampleImage()
{
return self::generateImage($this->getPreviewData());
}
+ public function getOpenBadgeURL()
+ {
+ return 'https://toolbox.fluidbook.com/ob/badge/' . $this->uid;
+ }
+
}
public function setFields()
{
parent::setFields();
- $this->addField('uid', HiddenVisible::class, __('UID'), ['column' => true, 'unique' => true]);
- if(null!==static::$_ownerAttribute) {
+ $this->addField('uid', HiddenVisible::class, __('UID'), ['column' => true, 'unique' => true, 'column_escape' => false, 'column_type' => 'model_function', 'column_function_name' => 'getUIDColumn', 'column_limit' => 200000]);
+ if (null !== static::$_ownerAttribute) {
$this->addOwnerField();
}
}
+ public function getOpenBadgesData($context = true)
+ {
+ $res = [];
+ if ($context) {
+ $res["@context"] = "https://w3id.org/openbadges/v2";
+
+ }
+ $res['id'] = $this->getOpenBadgeURL();
+ $res['image'] = $this->getOpenBadgeURL() . '/image';
+ return $res;
+ }
+
+ public function getUIDColumn()
+ {
+ $url = $this->getOpenBadgeURL();
+ if (!$url) {
+ return $this->uid;
+ }
+
+ return '<a href="' . $url . '" target="_blank">' . $this->uid . '</a>';
+ }
+
public function onSaving(): bool
{
if (!$this->uid) {
return parent::onSaving();
}
+ public function getOpenBadgeURL()
+ {
+ return false;
+ }
+
}
namespace App\Models\Badges;
+use Cubist\Backpack\Magic\Fields\Email;
use Cubist\Backpack\Magic\Fields\Images;
use Cubist\Backpack\Magic\Fields\Text;
use Cubist\Backpack\Magic\Fields\URL;
$this->addField('name', Text::class, __('Nom de l\'émetteur'), ['column' => true]);
$this->addField('url', URL::class, __('URL'));
+ $this->addField('email', Email::class, __('E-mail'));
$this->addField('logo', Images::class, __('Logo'));
}
+
+ public function getOpenBadgesData($context = true)
+ {
+ return array_merge(parent::getOpenBadgesData($context), [
+ "name" => $this->name,
+ "type" => "Profile",
+ "url" => $this->url,
+ "email" => $this->email,
+ "verification" => [
+ "allowedOrigins" => "toolbox.fluidbook.com"
+ ]
+ ]);
+ }
+
+ public function getOpenBadgeURL()
+ {
+ return 'https://toolbox.fluidbook.com/ob/issuer/' . $this->uid;
+ }
+
+ public function getImagePath()
+ {
+ return $this->getFirstMediaInField('logo')->getPath();
+ }
}