JFIFxxC      C  " }!1AQa"q2#BR$3br %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz w!1AQaq"2B #3Rbr{ gilour

File "Link.php"

Full Path: /home/markqprx/iniasli.pro/app-20260222054640/Models/Link.php
File size: 5.2 KB
MIME-type: text/x-php
Charset: utf-8

<?php

namespace App\Models;

use Common\Core\BaseModel;
use Common\Domains\CustomDomain;
use Common\Pages\CustomPage;
use Common\Tags\Tag;
use Common\Workspaces\Traits\BelongsToWorkspace;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\MorphMany;
use Illuminate\Database\Eloquent\Relations\MorphToMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Hash;

class Link extends BaseModel
{
    use SoftDeletes, HasFactory, HasShortUrlAttribute, BelongsToWorkspace;

    const MODEL_TYPE = 'link';

    protected $guarded = ['id'];
    protected $hidden = ['password'];
    protected $appends = ['short_url', 'has_password', 'model_type'];
    protected $attributes = ['type' => 'default'];

    protected $casts = [
        'id' => 'integer',
        'domain_id' => 'integer',
        'user_id' => 'integer',
        'active' => 'boolean',
        'has_password' => 'boolean',
        'expires_at' => 'datetime',
        'clicked_at' => 'datetime',
        'activates_at' => 'datetime',
    ];

    public function rules(): MorphMany
    {
        return $this->morphMany(LinkeableRule::class, 'linkeable');
    }

    public function clicks(): MorphMany
    {
        return $this->morphMany(LinkeableClick::class, 'linkeable');
    }

    public function tags(): MorphToMany
    {
        return $this->morphToMany(Tag::class, 'taggable');
    }

    public function user(): BelongsTo
    {
        return $this->belongsTo(User::class);
    }

    public function groups(): BelongsToMany
    {
        // will get scoped by "type" column on "link_groups" table
        return $this->belongsToMany(
            LinkGroup::class,
            'link_group_link',
            null,
            'link_group_id',
        );
    }

    public function biolinks(): BelongsToMany
    {
        // will get scoped by "type" column on "link_groups" table
        return $this->belongsToMany(
            Biolink::class,
            'link_group_link',
            null,
            'link_group_id',
        );
    }

    public function pixels(): BelongsToMany
    {
        return $this->morphToMany(
            TrackingPixel::class,
            'linkeable',
            'link_tracking_pixel',
        );
    }

    public function domain(): BelongsTo
    {
        return $this->belongsTo(CustomDomain::class, 'domain_id')->select([
            'id',
            'host',
        ]);
    }

    public function customPage(): BelongsTo
    {
        return $this->belongsTo(CustomPage::class, 'type_id');
    }

    public function overlay(): BelongsTo
    {
        return $this->belongsTo(LinkOverlay::class, 'type_id');
    }

    public function getHasPasswordAttribute()
    {
        return !!Arr::get($this->attributes, 'password');
    }

    public function getLongUrlAttribute($value)
    {
        return parse_url($value, PHP_URL_SCHEME) === null
            ? "https://$value"
            : $value;
    }

    public function setPasswordAttribute($value)
    {
        $this->attributes['password'] = $value ? Hash::make($value) : null;
    }

    public function scopeWhereHash(Builder $builder, string $hash): Builder
    {
        return $this->where('hash', $hash)->orWhere('alias', $hash);
    }

    public function toSearchableArray(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'alias' => $this->alias,
            'long_url' => $this->long_url,
            'description' => $this->description,
            'hash' => $this->hash,
            'type' => $this->type,
            'active' => $this->active,
            'groups' => $this->groups->pluck('id'),
            'biolinks' => $this->biolinks->pluck('id'),
            'user_id' => $this->user_id,
            'created_at' => $this->created_at->timestamp ?? '_null',
            'updated_at' => $this->updated_at->timestamp ?? '_null',
            'expires_at' => $this->expires_at->timestamp ?? '_null',
            'password' => $this->password,
            'clicks_count' => $this->clicks_count,
            'tags' => $this->tags->map(function (Tag $tag) {
                return $tag->getSearchableValues();
            }),
            'workspace_id' => $this->workspace_id ?? '_null',
        ];
    }

    public function toNormalizedArray(): array
    {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'description' => $this->short_url,
            'image' => $this->image,
        ];
    }

    protected function makeAllSearchableUsing($query)
    {
        return $query->with(['groups', 'tags', 'biolinks']);
    }

    public static function filterableFields(): array
    {
        return [
            'id',
            'type',
            'active',
            'groups',
            'user_id',
            'created_at',
            'updated_at',
            'expires_at',
            'password',
            'clicks_count',
            'workspace_id',
        ];
    }

    public static function getModelTypeAttribute(): string
    {
        return Link::MODEL_TYPE;
    }
}