mirror of
https://github.com/koel/koel
synced 2024-11-14 16:37:28 +00:00
chore: cache model attributes (#1839)
This commit is contained in:
parent
f2d0d0cba8
commit
ae923547ff
7 changed files with 38 additions and 31 deletions
|
@ -96,8 +96,9 @@ class Album extends Model
|
||||||
|
|
||||||
protected function hasCover(): Attribute
|
protected function hasCover(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => $this->cover_path
|
return Attribute::get(
|
||||||
&& (app()->runningUnitTests() || File::exists($this->cover_path)));
|
fn (): bool => $this->cover_path && (app()->runningUnitTests() || File::exists($this->cover_path))
|
||||||
|
)->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function coverPath(): Attribute
|
protected function coverPath(): Attribute
|
||||||
|
@ -106,7 +107,7 @@ class Album extends Model
|
||||||
$cover = Arr::get($this->attributes, 'cover');
|
$cover = Arr::get($this->attributes, 'cover');
|
||||||
|
|
||||||
return $cover ? album_cover_path($cover) : null;
|
return $cover ? album_cover_path($cover) : null;
|
||||||
});
|
})->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -115,7 +116,7 @@ class Album extends Model
|
||||||
*/
|
*/
|
||||||
protected function name(): Attribute
|
protected function name(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(static fn (string $value) => html_entity_decode($value));
|
return Attribute::get(static fn (string $value) => html_entity_decode($value))->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function thumbnailName(): Attribute
|
protected function thumbnailName(): Attribute
|
||||||
|
@ -128,17 +129,19 @@ class Album extends Model
|
||||||
$parts = pathinfo($this->cover_path);
|
$parts = pathinfo($this->cover_path);
|
||||||
|
|
||||||
return sprintf('%s_thumb.%s', $parts['filename'], $parts['extension']);
|
return sprintf('%s_thumb.%s', $parts['filename'], $parts['extension']);
|
||||||
});
|
})->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function thumbnailPath(): Attribute
|
protected function thumbnailPath(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn () => $this->thumbnail_name ? album_cover_path($this->thumbnail_name) : null);
|
return Attribute::get(fn () => $this->thumbnail_name ? album_cover_path($this->thumbnail_name) : null)
|
||||||
|
->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function thumbnail(): Attribute
|
protected function thumbnail(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn () => $this->thumbnail_name ? album_cover_url($this->thumbnail_name) : null);
|
return Attribute::get(fn () => $this->thumbnail_name ? album_cover_url($this->thumbnail_name) : null)
|
||||||
|
->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @deprecated Only here for backward compat with mobile apps */
|
/** @deprecated Only here for backward compat with mobile apps */
|
||||||
|
|
|
@ -97,7 +97,8 @@ class Artist extends Model
|
||||||
*/
|
*/
|
||||||
protected function name(): Attribute
|
protected function name(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(static fn (string $value): string => html_entity_decode($value) ?: self::UNKNOWN_NAME);
|
return Attribute::get(static fn (string $value): string => html_entity_decode($value) ?: self::UNKNOWN_NAME)
|
||||||
|
->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -105,12 +106,13 @@ class Artist extends Model
|
||||||
*/
|
*/
|
||||||
protected function image(): Attribute
|
protected function image(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(static fn (?string $value): ?string => artist_image_url($value));
|
return Attribute::get(static fn (?string $value): ?string => artist_image_url($value))->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function imagePath(): Attribute
|
protected function imagePath(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): ?string => artist_image_path(Arr::get($this->attributes, 'image')));
|
return Attribute::get(fn (): ?string => artist_image_path(Arr::get($this->attributes, 'image')))
|
||||||
|
->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function hasImage(): Attribute
|
protected function hasImage(): Attribute
|
||||||
|
@ -119,7 +121,7 @@ class Artist extends Model
|
||||||
$image = Arr::get($this->attributes, 'image');
|
$image = Arr::get($this->attributes, 'image');
|
||||||
|
|
||||||
return $image && (app()->runningUnitTests() || File::exists(artist_image_path($image)));
|
return $image && (app()->runningUnitTests() || File::exists(artist_image_path($image)));
|
||||||
});
|
})->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @return array<mixed> */
|
/** @return array<mixed> */
|
||||||
|
|
|
@ -36,11 +36,11 @@ class License extends Model
|
||||||
|
|
||||||
protected function shortKey(): Attribute
|
protected function shortKey(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): string => '****-' . Str::afterLast($this->key, '-'));
|
return Attribute::get(fn (): string => '****-' . Str::afterLast($this->key, '-'))->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function activatedAt(): Attribute
|
protected function activatedAt(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn () => $this->instance->createdAt);
|
return Attribute::get(fn () => $this->instance->createdAt)->shouldCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -90,7 +90,7 @@ class Playlist extends Model
|
||||||
|
|
||||||
protected function isSmart(): Attribute
|
protected function isSmart(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => (bool) $this->rule_groups?->isNotEmpty());
|
return Attribute::get(fn (): bool => (bool) $this->rule_groups?->isNotEmpty())->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function ruleGroups(): Attribute
|
protected function ruleGroups(): Attribute
|
||||||
|
@ -101,7 +101,7 @@ class Playlist extends Model
|
||||||
|
|
||||||
protected function cover(): Attribute
|
protected function cover(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(static fn (?string $value): ?string => playlist_cover_url($value));
|
return Attribute::get(static fn (?string $value): ?string => playlist_cover_url($value))->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function coverPath(): Attribute
|
protected function coverPath(): Attribute
|
||||||
|
@ -110,7 +110,7 @@ class Playlist extends Model
|
||||||
$cover = Arr::get($this->attributes, 'cover');
|
$cover = Arr::get($this->attributes, 'cover');
|
||||||
|
|
||||||
return $cover ? playlist_cover_path($cover) : null;
|
return $cover ? playlist_cover_path($cover) : null;
|
||||||
});
|
})->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function ownedBy(User $user): bool
|
public function ownedBy(User $user): bool
|
||||||
|
@ -185,9 +185,9 @@ class Playlist extends Model
|
||||||
|
|
||||||
protected function isCollaborative(): Attribute
|
protected function isCollaborative(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => !$this->is_smart
|
return Attribute::get(
|
||||||
&& LicenseFacade::isPlus()
|
fn (): bool => !$this->is_smart && LicenseFacade::isPlus() && $this->collaborators->isNotEmpty()
|
||||||
&& $this->collaborators->isNotEmpty());
|
)->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @inheritdoc */
|
/** @inheritdoc */
|
||||||
|
|
|
@ -34,6 +34,6 @@ class PlaylistCollaborationToken extends Model
|
||||||
|
|
||||||
protected function expired(): Attribute
|
protected function expired(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => $this->created_at->addDays(7)->isPast());
|
return Attribute::get(fn (): bool => $this->created_at->addDays(7)->isPast())->shouldCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -134,11 +134,6 @@ class Song extends Model
|
||||||
return $this->belongsTo(Album::class);
|
return $this->belongsTo(Album::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function albumArtist(): Attribute
|
|
||||||
{
|
|
||||||
return Attribute::get(fn () => $this->album?->artist);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function podcast(): BelongsTo
|
public function podcast(): BelongsTo
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Podcast::class);
|
return $this->belongsTo(Podcast::class);
|
||||||
|
@ -154,6 +149,11 @@ class Song extends Model
|
||||||
return $this->hasMany(Interaction::class);
|
return $this->hasMany(Interaction::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function albumArtist(): Attribute
|
||||||
|
{
|
||||||
|
return Attribute::get(fn () => $this->album?->artist)->shouldCache();
|
||||||
|
}
|
||||||
|
|
||||||
protected function type(): Attribute
|
protected function type(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn () => $this->podcast_id ? PlayableType::PODCAST_EPISODE : PlayableType::SONG);
|
return Attribute::get(fn () => $this->podcast_id ? PlayableType::PODCAST_EPISODE : PlayableType::SONG);
|
||||||
|
@ -175,7 +175,7 @@ class Song extends Model
|
||||||
|
|
||||||
protected function storageMetadata(): Attribute
|
protected function storageMetadata(): Attribute
|
||||||
{
|
{
|
||||||
return new Attribute(
|
return (new Attribute(
|
||||||
get: function (): SongStorageMetadata {
|
get: function (): SongStorageMetadata {
|
||||||
try {
|
try {
|
||||||
switch ($this->storage) {
|
switch ($this->storage) {
|
||||||
|
@ -202,7 +202,7 @@ class Song extends Model
|
||||||
return LocalMetadata::make($this->path);
|
return LocalMetadata::make($this->path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
))->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getPathFromS3BucketAndKey(string $bucket, string $key): string
|
public static function getPathFromS3BucketAndKey(string $bucket, string $key): string
|
||||||
|
|
|
@ -109,12 +109,14 @@ class User extends Authenticatable
|
||||||
|
|
||||||
protected function avatar(): Attribute
|
protected function avatar(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): string => avatar_or_gravatar(Arr::get($this->attributes, 'avatar'), $this->email));
|
return Attribute::get(fn (): string => avatar_or_gravatar(Arr::get($this->attributes, 'avatar'), $this->email))
|
||||||
|
->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function hasCustomAvatar(): Attribute
|
protected function hasCustomAvatar(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => (bool) Arr::get($this->attributes, 'avatar'));
|
return Attribute::get(fn (): bool => (bool) Arr::get($this->attributes, 'avatar'))
|
||||||
|
->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function isProspect(): Attribute
|
protected function isProspect(): Attribute
|
||||||
|
@ -124,11 +126,11 @@ class User extends Authenticatable
|
||||||
|
|
||||||
protected function isSso(): Attribute
|
protected function isSso(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => License::isPlus() && $this->sso_provider);
|
return Attribute::get(fn (): bool => License::isPlus() && $this->sso_provider)->shouldCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function connectedToLastfm(): Attribute
|
protected function connectedToLastfm(): Attribute
|
||||||
{
|
{
|
||||||
return Attribute::get(fn (): bool => (bool) $this->preferences->lastFmSessionKey);
|
return Attribute::get(fn (): bool => (bool) $this->preferences->lastFmSessionKey)->shouldCache();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue