]> _ Git - fluidbook-toolbox.git/commitdiff
wait #7003 @2.5
authorVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 16 Jul 2024 10:00:17 +0000 (12:00 +0200)
committerVincent Vanwaelscappel <vincent@cubedesigners.com>
Tue, 16 Jul 2024 10:00:17 +0000 (12:00 +0200)
app/Fields/BadgeIssuer.php
app/Http/Controllers/Admin/Operations/Badges/OpenBadgesOperation.php [new file with mode: 0644]
app/Models/Badges/Assertion.php
app/Models/Badges/BadgeClass.php
app/Models/Badges/Base.php
app/Models/Badges/Issuer.php

index 20f97956cd29510c721bc3810a15490431c43472..f421af15b86338c76144abc17bf952c961fb4aa4 100644 (file)
@@ -15,4 +15,5 @@ class BadgeIssuer extends SelectFromModel
 
         parent::__construct($attributes);
     }
+
 }
diff --git a/app/Http/Controllers/Admin/Operations/Badges/OpenBadgesOperation.php b/app/Http/Controllers/Admin/Operations/Badges/OpenBadgesOperation.php
new file mode 100644 (file)
index 0000000..3102e11
--- /dev/null
@@ -0,0 +1,86 @@
+<?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']);
+    }
+}
+
index 5ff012be4bad7e803d17fbb293bfa1cfda7488f0..dbef947a89a956eaf988f5896ca61df87885a252 100644 (file)
@@ -3,9 +3,11 @@
 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;
 
@@ -21,6 +23,8 @@ class Assertion extends Base
 
     protected static $_ownerAttribute = null;
 
+    protected $_operations = [OpenBadgesOperation::class];
+
     public function setFields()
     {
         parent::setFields();
@@ -32,9 +36,28 @@ class Assertion extends Base
         $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
@@ -47,13 +70,23 @@ class Assertion extends Base
         $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;
+    }
+
 }
index a0b7823b4d2e7925a7b01958431bb466a8a268cf..45225605e0517ae2c3a24860c636aa4c8fd0b010 100644 (file)
@@ -27,16 +27,37 @@ class BadgeClass extends Base
         $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;
     }
 
@@ -57,6 +78,13 @@ class BadgeClass extends Base
         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());
@@ -117,5 +145,10 @@ class BadgeClass extends Base
 
     }
 
+    public function getOpenBadgeURL()
+    {
+        return 'https://toolbox.fluidbook.com/ob/badge/' . $this->uid;
+    }
+
 
 }
index 90fb421d03e06ccf46454c714c807b8399a61b3a..902f2d9480df51542d1f7e8219d933999494ab9e 100644 (file)
@@ -17,12 +17,34 @@ class Base extends ToolboxModel
     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) {
@@ -31,4 +53,9 @@ class Base extends ToolboxModel
         return parent::onSaving();
     }
 
+    public function getOpenBadgeURL()
+    {
+        return false;
+    }
+
 }
index ed96ff7cdf9b4dc7515fa830a54f5275c8c472e3..5ca7c0e0469004f8a12de76ead245cf345d28349 100644 (file)
@@ -2,6 +2,7 @@
 
 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;
@@ -21,8 +22,32 @@ class Issuer extends Base
 
         $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();
+    }
 }