clean up attributes

This commit is contained in:
2023-07-31 10:05:13 +10:00
parent 6dc226ab0b
commit 70b53ce21a
5 changed files with 71 additions and 16 deletions

View File

@@ -125,7 +125,7 @@ class ArticleConductor extends Conductor
public function includeAttachments(Model $model) public function includeAttachments(Model $model)
{ {
return $model->getAttachments()->map(function ($attachment) { return $model->getAttachments()->map(function ($attachment) {
return MediaConductor::includeModel(request(), 'attachments', $attachment->getMedia()); return MediaConductor::includeModel(request(), 'attachments', $attachment->media);
}); });
} }
@@ -138,7 +138,7 @@ class ArticleConductor extends Conductor
public function includeGallery(Model $model) public function includeGallery(Model $model)
{ {
return $model->getGallery()->map(function ($item) { return $model->getGallery()->map(function ($item) {
return MediaConductor::includeModel(request(), 'gallery', $item->getMedia()); return MediaConductor::includeModel(request(), 'gallery', $item->media);
}); });
} }

View File

@@ -110,7 +110,7 @@ class EventConductor extends Conductor
return $model->getAttachments()->map(function ($attachment) use ($user) { return $model->getAttachments()->map(function ($attachment) use ($user) {
if ($attachment->private === false || ($user !== null && $user->hasPermission('admin/events') === true)) { if ($attachment->private === false || ($user !== null && $user->hasPermission('admin/events') === true)) {
return MediaConductor::includeModel(request(), 'attachments', $attachment->getMedia()); return MediaConductor::includeModel(request(), 'attachments', $attachment->media);
} }
}); });
} }

View File

@@ -46,10 +46,41 @@ class Attachment extends Model
* *
* @return null|Media * @return null|Media
*/ */
public function getMedia(): ?Media public function getMediaAttribute(): ?Media
{ {
return Cache::remember("attachment:{$this->id}:media", now()->addDays(28), function () { $mediaId = '0';
$media = null;
if (Cache::has("attachment:{$this->id}:media") === true) {
$mediaId = Cache::get("attachment:{$this->id}:media");
} else {
$media = $this->media()->first();
if ($media === null) {
return null;
}
$mediaId = $media->id;
Cache::put("attachment:{$this->id}:media", $mediaId, now()->addDays(28));
}
return Cache::remember("media:{$mediaId}", now()->addDays(28), function () use ($media) {
if ($media !== null) {
return $media;
}
return $this->media()->first(); return $this->media()->first();
}); });
} }
/**
* Set the media for this item.
*
* @param Media $media The media model.
* @return void
*/
public function setMediaAttribute(Media $media): void
{
$this->media()->associate($media)->save();
Cache::put("attachment:{$this->id}:media", $media->id, now()->addDays(28));
}
} }

View File

@@ -67,7 +67,7 @@ class Gallery extends Model
* *
* @return null|Media The media model. * @return null|Media The media model.
*/ */
public function getMedia(): ?Media public function getMediaAttribute(): ?Media
{ {
$mediaId = '0'; $mediaId = '0';
$media = null; $media = null;
@@ -92,4 +92,16 @@ class Gallery extends Model
return $this->media()->first(); return $this->media()->first();
}); });
} }
/**
* Set the media for this item.
*
* @param Media $media The media model.
* @return void
*/
public function setMediaAttribute(Media $media): void
{
$this->media()->associate($media)->save();
Cache::put("gallery:{$this->id}:media", $media->id, now()->addDays(28));
}
} }

View File

@@ -103,9 +103,9 @@ class User extends Authenticatable implements Auditable
/** /**
* Get the list of permissions of the user * Get the list of permissions of the user
* *
* @return Illuminate\Database\Eloquent\Collection * @return Illuminate\Database\Eloquent\Relations\HasMany
*/ */
public function permissions(): Collection public function permissions(): HasMany
{ {
return $this->hasMany(Permission::class); return $this->hasMany(Permission::class);
} }
@@ -123,6 +123,23 @@ class User extends Authenticatable implements Auditable
}); });
} }
/**
* Set the permission attribute
*
* @param array $newPermissions The new permissions to set to the user.
* @return void
*/
public function setPermissionsAttribute(array $newPermissions): void
{
$existingPermissions = $this->permissions->pluck('permission')->toArray();
$this->revokePermission(array_diff($this->permissions, $newPermissions));
$this->givePermission(array_diff($newPermissions, $this->permissions));
$cacheKey = "user:{$this->id}:permissions";
Cache::delete($cacheKey);
}
/** /**
* Test if user has permission * Test if user has permission
* *
@@ -146,19 +163,14 @@ class User extends Authenticatable implements Auditable
$permissions = [$permissions]; $permissions = [$permissions];
} }
$permissions = collect($permissions)->map(function ($permission) { $newPermissions = array_map(function ($permission) {
return ['permission' => $permission]; return ['permission' => $permission];
}); }, array_diff($permissions, $this->permissions));
$existingPermissions = $this->permissions;
$newPermissions = $permissions->reject(function ($permission) use ($existingPermissions) {
return $existingPermissions->contains('permission', $permission['permission']);
});
$cacheKey = "user:{$this->id}:permissions"; $cacheKey = "user:{$this->id}:permissions";
Cache::forget($cacheKey); Cache::forget($cacheKey);
return $this->permissions()->createMany($newPermissions->toArray()); return $this->permissions()->createMany($newPermissions);
} }