<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Support\Facades\Hash;
use Spatie\Activitylog\Traits\LogsActivity;
use Tymon\JWTAuth\Contracts\JWTSubject;
class User extends Authenticatable implements JWTSubject
{
use Notifiable, LogsActivity;
protected static $logName = 'user';
protected static $logFillable = true;
protected static $logUnguarded = true;
protected $fillable = [
'name', 'email', 'password',
];
protected $hidden = [
'password', 'remember_token',
];
protected $casts = [
'email_verified_at' => 'datetime',
];
public function getJWTIdentifier()
{
return $this->getKey();
}
public function getJWTCustomClaims()
{
return ['role' => 'user'];
}
public static function getList(array $validated): array
{
$model = User::when($validated['name'] ?? null, function ($query) use ($validated) {
return $query->where('name', 'like', '%' . $validated['name'] . '%');
})
->when($validated['start_at'] ?? null, function ($query) use ($validated) {
return $query->whereBetween('created_at', [$validated['start_at'], $validated['end_at']]);
});
$total = $model->count('id');
$users = $model->select(['id', 'name', 'email', 'created_at', 'updated_at'])
->orderBy($validated['sort'] ?? 'created_at', $validated['order'] === 'ascending' ? 'asc' : 'desc')
->offset(($validated['offset'] - 1) * $validated['limit'])
->limit($validated['limit'])
->get();
return [
'users' => $users,
'total' => $total
];
}
public static function create(array $attributes)
{
$attributes['password'] = Hash::make($attributes['password']);
return static::query()->create($attributes);
}
public static function updateSave(array $data)
{
if (isset($data['password'])) {
$data['password'] = Hash::make($data['password']);
}
$user = User::find($data['id']);
unset($data['id']);
return [
'result' => $user->update($data),
'user' => $user
];
}
}