|
@@ -0,0 +1,168 @@
|
|
|
|
+<?php
|
|
|
|
+
|
|
|
|
+namespace App\Models;
|
|
|
|
+
|
|
|
|
+use Encore\Admin\Traits\DefaultDatetimeFormat;
|
|
|
|
+use Illuminate\Database\Eloquent\Model;
|
|
|
|
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
|
|
|
|
+use Illuminate\Http\Request;
|
|
|
|
+use Illuminate\Support\Str;
|
|
|
|
+
|
|
|
|
+class CdmsPermissions extends Model
|
|
|
|
+{
|
|
|
|
+ use DefaultDatetimeFormat;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @var array
|
|
|
|
+ */
|
|
|
|
+ protected $fillable = ['name', 'slug', 'http_method', 'http_path'];
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @var array
|
|
|
|
+ */
|
|
|
|
+ public static $httpMethods = [
|
|
|
|
+ 'GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS', 'HEAD',
|
|
|
|
+ ];
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Create a new Eloquent model instance.
|
|
|
|
+ *
|
|
|
|
+ * @param array $attributes
|
|
|
|
+ */
|
|
|
|
+ public function __construct(array $attributes = [])
|
|
|
|
+ {
|
|
|
|
+ $connection = config('tenancy.database.connection') ?: config('database.default');
|
|
|
|
+
|
|
|
|
+ $this->setConnection($connection);
|
|
|
|
+
|
|
|
|
+ $this->setTable(config('tenancy.database.permissions_table'));
|
|
|
|
+
|
|
|
|
+ parent::__construct($attributes);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Permission belongs to many roles.
|
|
|
|
+ *
|
|
|
|
+ * @return BelongsToMany
|
|
|
|
+ */
|
|
|
|
+ public function roles(): BelongsToMany
|
|
|
|
+ {
|
|
|
|
+ $pivotTable = config('tenancy.database.role_permissions_table');
|
|
|
|
+
|
|
|
|
+ $relatedModel = config('tenancy.database.roles_model');
|
|
|
|
+
|
|
|
|
+ return $this->belongsToMany($relatedModel, $pivotTable, 'permission_id', 'role_id');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * If request should pass through the current permission.
|
|
|
|
+ *
|
|
|
|
+ * @param Request $request
|
|
|
|
+ *
|
|
|
|
+ * @return bool
|
|
|
|
+ */
|
|
|
|
+ public function shouldPassThrough(Request $request): bool
|
|
|
|
+ {
|
|
|
|
+ if (empty($this->http_method) && empty($this->http_path)) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $method = $this->http_method;
|
|
|
|
+
|
|
|
|
+ $matches = array_map(function ($path) use ($method) {
|
|
|
|
+ $path = trim(config('tenancy.route.prefix'), '/').$path;
|
|
|
|
+
|
|
|
|
+ if (Str::contains($path, ':')) {
|
|
|
|
+ list($method, $path) = explode(':', $path);
|
|
|
|
+ $method = explode(',', $method);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return compact('method', 'path');
|
|
|
|
+ }, explode("\n", $this->http_path));
|
|
|
|
+
|
|
|
|
+ foreach ($matches as $match) {
|
|
|
|
+ if ($this->matchRequest($match, $request)) {
|
|
|
|
+ return true;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * filter \r.
|
|
|
|
+ *
|
|
|
|
+ * @param string $path
|
|
|
|
+ *
|
|
|
|
+ * @return mixed
|
|
|
|
+ */
|
|
|
|
+ public function getHttpPathAttribute($path)
|
|
|
|
+ {
|
|
|
|
+ return str_replace("\r\n", "\n", $path);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * If a request match the specific HTTP method and path.
|
|
|
|
+ *
|
|
|
|
+ * @param array $match
|
|
|
|
+ * @param Request $request
|
|
|
|
+ *
|
|
|
|
+ * @return bool
|
|
|
|
+ */
|
|
|
|
+ protected function matchRequest(array $match, Request $request): bool
|
|
|
|
+ {
|
|
|
|
+ if ($match['path'] == '/') {
|
|
|
|
+ $path = '/';
|
|
|
|
+ } else {
|
|
|
|
+ $path = trim($match['path'], '/');
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!$request->is($path)) {
|
|
|
|
+ return false;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ $method = collect($match['method'])->filter()->map(function ($method) {
|
|
|
|
+ return strtoupper($method);
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ return $method->isEmpty() || $method->contains($request->method());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @param $method
|
|
|
|
+ */
|
|
|
|
+ public function setHttpMethodAttribute($method)
|
|
|
|
+ {
|
|
|
|
+ if (is_array($method)) {
|
|
|
|
+ $this->attributes['http_method'] = implode(',', $method);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * @param $method
|
|
|
|
+ *
|
|
|
|
+ * @return array
|
|
|
|
+ */
|
|
|
|
+ public function getHttpMethodAttribute($method)
|
|
|
|
+ {
|
|
|
|
+ if (is_string($method)) {
|
|
|
|
+ return array_filter(explode(',', $method));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return $method;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Detach models from the relationship.
|
|
|
|
+ *
|
|
|
|
+ * @return void
|
|
|
|
+ */
|
|
|
|
+ protected static function boot()
|
|
|
|
+ {
|
|
|
|
+ parent::boot();
|
|
|
|
+
|
|
|
|
+ static::deleting(function ($model) {
|
|
|
|
+ $model->roles()->detach();
|
|
|
|
+ });
|
|
|
|
+ }
|
|
|
|
+}
|