reconstruction of the project
This commit is contained in:
@@ -2,12 +2,19 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use App\Models\BaseModel;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
|
||||
class UserNotification extends BaseModel
|
||||
{
|
||||
protected $table = 'user_notifications';
|
||||
protected $primaryKey = 'id';
|
||||
|
||||
/**
|
||||
* CI: timestamps disabled (uses delivered_at)
|
||||
*/
|
||||
public $timestamps = false;
|
||||
|
||||
protected $fillable = [
|
||||
'notification_id',
|
||||
'user_id',
|
||||
@@ -17,5 +24,100 @@ class UserNotification extends BaseModel
|
||||
'school_year',
|
||||
'semester',
|
||||
];
|
||||
public $timestamps = false;
|
||||
|
||||
protected $casts = [
|
||||
'notification_id' => 'integer',
|
||||
'user_id' => 'integer',
|
||||
'is_read' => 'boolean',
|
||||
'delivered' => 'boolean',
|
||||
'delivered_at' => 'datetime',
|
||||
];
|
||||
|
||||
/* ============================================================
|
||||
* Relationships (optional)
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
public function user(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class, 'user_id');
|
||||
}
|
||||
|
||||
public function notification(): BelongsTo
|
||||
{
|
||||
// Change Notification::class if your model name differs
|
||||
return $this->belongsTo(Notification::class, 'notification_id');
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Scopes
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
public function scopeForUser(Builder $q, int $userId): Builder
|
||||
{
|
||||
return $q->where('user_id', $userId);
|
||||
}
|
||||
|
||||
public function scopeUnread(Builder $q): Builder
|
||||
{
|
||||
return $q->where('is_read', 0);
|
||||
}
|
||||
|
||||
public function scopeRead(Builder $q): Builder
|
||||
{
|
||||
return $q->where('is_read', 1);
|
||||
}
|
||||
|
||||
public function scopeDelivered(Builder $q): Builder
|
||||
{
|
||||
return $q->where('delivered', 1);
|
||||
}
|
||||
|
||||
public function scopeUndelivered(Builder $q): Builder
|
||||
{
|
||||
return $q->where(function (Builder $w) {
|
||||
$w->whereNull('delivered')->orWhere('delivered', 0);
|
||||
});
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Helpers
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
public function markDelivered(?\DateTimeInterface $at = null): self
|
||||
{
|
||||
$this->delivered = true;
|
||||
$this->delivered_at = $at ?: now();
|
||||
$this->save();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function markRead(): self
|
||||
{
|
||||
$this->is_read = true;
|
||||
$this->save();
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/* ============================================================
|
||||
* Optional validation helper
|
||||
* ============================================================
|
||||
*/
|
||||
|
||||
public static function rules(bool $updating = false): array
|
||||
{
|
||||
$req = $updating ? 'sometimes' : 'required';
|
||||
|
||||
return [
|
||||
'notification_id' => [$req, 'integer', 'min:1', 'exists:notifications,id'],
|
||||
'user_id' => [$req, 'integer', 'min:1', 'exists:users,id'],
|
||||
'is_read' => ['nullable', 'boolean'],
|
||||
'delivered' => ['nullable', 'boolean'],
|
||||
'delivered_at' => ['nullable', 'date'],
|
||||
];
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user