]> BookStack Code Mirror - bookstack/commitdiff
Started base work on attribute system
authorDan Brown <redacted>
Fri, 6 May 2016 19:33:08 +0000 (20:33 +0100)
committerDan Brown <redacted>
Fri, 6 May 2016 19:33:08 +0000 (20:33 +0100)
app/Attribute.php [new file with mode: 0644]
app/Entity.php
app/Http/Controllers/AttributeController.php [new file with mode: 0644]
app/Http/routes.php
app/Repos/AttributeRepo.php [new file with mode: 0644]
app/Services/PermissionService.php
database/migrations/2016_05_06_185215_create_attributes_table.php [new file with mode: 0644]

diff --git a/app/Attribute.php b/app/Attribute.php
new file mode 100644 (file)
index 0000000..62dc62b
--- /dev/null
@@ -0,0 +1,19 @@
+<?php namespace BookStack;
+
+/**
+ * Class Attribute
+ * @package BookStack
+ */
+class Attribute extends Model
+{
+    protected $fillable = ['name', 'value'];
+
+    /**
+     * Get the entity that this attribute belongs to
+     * @return \Illuminate\Database\Eloquent\Relations\MorphTo
+     */
+    public function entity()
+    {
+        return $this->morphTo('entity');
+    }
+}
\ No newline at end of file
index a0b25eba75823dfb53c1dac267b223463d6194ea..abf3e834ede4b129c2e467f55476e28e67fde725 100644 (file)
@@ -54,6 +54,15 @@ abstract class Entity extends Ownable
         return $this->morphMany(View::class, 'viewable');
     }
 
+    /**
+     * Get the Attribute models that have been user assigned to this entity.
+     * @return \Illuminate\Database\Eloquent\Relations\MorphMany
+     */
+    public function attributes()
+    {
+        return $this->morphMany(Attribute::class, 'entity');
+    }
+
     /**
      * Get this entities restrictions.
      */
@@ -114,6 +123,22 @@ abstract class Entity extends Ownable
         return strtolower(static::getClassName());
     }
 
+    /**
+     * Get an instance of an entity of the given type.
+     * @param $type
+     * @return Entity
+     */
+    public static function getEntityInstance($type)
+    {
+        $types = ['Page', 'Book', 'Chapter'];
+        $className = str_replace([' ', '-', '_'], '', ucwords($type));
+        if (!in_array($className, $types)) {
+            return null;
+        }
+
+        return app('BookStack\\' . $className);
+    }
+
     /**
      * Gets a limited-length version of the entities name.
      * @param int $length
diff --git a/app/Http/Controllers/AttributeController.php b/app/Http/Controllers/AttributeController.php
new file mode 100644 (file)
index 0000000..09523af
--- /dev/null
@@ -0,0 +1,32 @@
+<?php namespace BookStack\Http\Controllers;
+
+use BookStack\Repos\AttributeRepo;
+use Illuminate\Http\Request;
+
+use BookStack\Http\Requests;
+
+class AttributeController extends Controller
+{
+
+    protected $attributeRepo;
+
+    /**
+     * AttributeController constructor.
+     * @param $attributeRepo
+     */
+    public function __construct(AttributeRepo $attributeRepo)
+    {
+        $this->attributeRepo = $attributeRepo;
+    }
+
+
+    /**
+     * Get all the Attributes for a particular entity
+     * @param $entityType
+     * @param $entityId
+     */
+    public function getForEntity($entityType, $entityId)
+    {
+        
+    }
+}
index 9565b7576e5540ac63211b96f1be3d5d53f3eaa2..8b7ec3bc27166c85fa73b0bc911aa9293fd1e650 100644 (file)
@@ -80,11 +80,16 @@ Route::group(['middleware' => 'auth'], function () {
         Route::delete('/{imageId}', 'ImageController@destroy');
     });
 
-    // Ajax routes
+    // AJAX routes
     Route::put('/ajax/page/{id}/save-draft', 'PageController@saveDraft');
     Route::get('/ajax/page/{id}', 'PageController@getPageAjax');
     Route::delete('/ajax/page/{id}', 'PageController@ajaxDestroy');
 
+    // Attribute routes (AJAX)
+    Route::group(['prefix' => 'ajax/attributes'], function() {
+        Route::get('/get/{entityType}/{entityId}', 'AttributeController@getForEntity');
+    });
+
     // Links
     Route::get('/link/{id}', 'PageController@redirectFromLink');
 
diff --git a/app/Repos/AttributeRepo.php b/app/Repos/AttributeRepo.php
new file mode 100644 (file)
index 0000000..d5cf5b0
--- /dev/null
@@ -0,0 +1,32 @@
+<?php namespace BookStack\Repos;
+
+use BookStack\Attribute;
+use BookStack\Entity;
+use BookStack\Services\PermissionService;
+
+/**
+ * Class AttributeRepo
+ * @package BookStack\Repos
+ */
+class AttributeRepo
+{
+
+    protected $attribute;
+    protected $entity;
+    protected $permissionService;
+
+    /**
+     * AttributeRepo constructor.
+     * @param Attribute $attr
+     * @param Entity $ent
+     * @param PermissionService $ps
+     */
+    public function __construct(Attribute $attr, Entity $ent, PermissionService $ps)
+    {
+        $this->attribute = $attr;
+        $this->entity = $ent;
+        $this->permissionService = $ps;
+    }
+
+
+}
\ No newline at end of file
index 2d5ee97a55891a677c7cb5889e23a0f29fa03935..17c1b12858a77ab9b98393afb61d7f307665e520 100644 (file)
@@ -400,9 +400,7 @@ class PermissionService
             }
         });
 
-        if ($this->isAdmin) return $query;
-        $this->currentAction = $action;
-        return $this->entityRestrictionQuery($query);
+        return $this->enforceEntityRestrictions($query, $action);
     }
 
     /**
@@ -413,9 +411,7 @@ class PermissionService
      */
     public function enforceChapterRestrictions($query, $action = 'view')
     {
-        if ($this->isAdmin) return $query;
-        $this->currentAction = $action;
-        return $this->entityRestrictionQuery($query);
+        return $this->enforceEntityRestrictions($query, $action);
     }
 
     /**
@@ -425,6 +421,17 @@ class PermissionService
      * @return mixed
      */
     public function enforceBookRestrictions($query, $action = 'view')
+    {
+        $this->enforceEntityRestrictions($query, $action);
+    }
+
+    /**
+     * Add restrictions for a generic entity
+     * @param $query
+     * @param string $action
+     * @return mixed
+     */
+    public function enforceEntityRestrictions($query, $action = 'view')
     {
         if ($this->isAdmin) return $query;
         $this->currentAction = $action;
diff --git a/database/migrations/2016_05_06_185215_create_attributes_table.php b/database/migrations/2016_05_06_185215_create_attributes_table.php
new file mode 100644 (file)
index 0000000..df3e554
--- /dev/null
@@ -0,0 +1,38 @@
+<?php
+
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Database\Migrations\Migration;
+
+class CreateAttributesTable extends Migration
+{
+    /**
+     * Run the migrations.
+     *
+     * @return void
+     */
+    public function up()
+    {
+        Schema::create('attributes', function (Blueprint $table) {
+            $table->increments('id');
+            $table->integer('entity_id');
+            $table->string('entity_type', 100);
+            $table->string('name');
+            $table->string('value');
+            $table->timestamps();
+
+            $table->index('name');
+            $table->index('value');
+            $table->index(['entity_id', 'entity_type']);
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     *
+     * @return void
+     */
+    public function down()
+    {
+        Schema::drop('attributes');
+    }
+}