SMS service

This commit is contained in:
Simon Pocrnjič
2025-10-24 21:39:10 +02:00
parent 3a2eed7dda
commit 930ac83604
52 changed files with 3830 additions and 36 deletions
+52
View File
@@ -0,0 +1,52 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SmsLog extends Model
{
use HasFactory;
protected $table = 'sms_logs';
protected $fillable = [
'uuid',
'profile_id',
'template_id',
'to_number',
'sender',
'message',
'status',
'provider_message_id',
'error_code',
'error_message',
'cost',
'currency',
'meta',
'queued_at',
'sent_at',
'delivered_at',
'failed_at',
];
protected $casts = [
'meta' => 'array',
'queued_at' => 'datetime',
'sent_at' => 'datetime',
'delivered_at' => 'datetime',
'failed_at' => 'datetime',
'cost' => 'decimal:2',
];
public function profile()
{
return $this->belongsTo(SmsProfile::class, 'profile_id');
}
public function template()
{
return $this->belongsTo(SmsTemplate::class, 'template_id');
}
}
+56
View File
@@ -0,0 +1,56 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SmsProfile extends Model
{
use HasFactory;
protected $table = 'sms_profiles';
protected $fillable = [
'uuid',
'name',
'active',
'api_username',
'default_sender_id',
'settings',
];
protected $casts = [
'active' => 'boolean',
'settings' => 'array',
];
protected $hidden = [
'encrypted_api_password',
];
// Write-only password setter
public function setApiPasswordAttribute(string $plain): void
{
$this->attributes['encrypted_api_password'] = app(\App\Services\MailSecretEncrypter::class)->encrypt($plain);
}
public function decryptApiPassword(): ?string
{
if (! isset($this->attributes['encrypted_api_password'])) {
return null;
}
return app(\App\Services\MailSecretEncrypter::class)->decrypt($this->attributes['encrypted_api_password']);
}
public function senders()
{
return $this->hasMany(SmsSender::class, 'profile_id');
}
public function logs()
{
return $this->hasMany(SmsLog::class, 'profile_id');
}
}
+30
View File
@@ -0,0 +1,30 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SmsSender extends Model
{
use HasFactory;
protected $table = 'sms_senders';
protected $fillable = [
'profile_id',
'sname',
'phone_number',
'description',
'active',
];
protected $casts = [
'active' => 'boolean',
];
public function profile()
{
return $this->belongsTo(SmsProfile::class, 'profile_id');
}
}
+53
View File
@@ -0,0 +1,53 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class SmsTemplate extends Model
{
use HasFactory;
protected $table = 'sms_templates';
protected $fillable = [
'uuid',
'name',
'slug',
'content',
'variables_json',
'is_active',
'default_profile_id',
'default_sender_id',
'allow_custom_body',
'action_id',
'decision_id',
];
protected $casts = [
'is_active' => 'boolean',
'variables_json' => 'array',
'allow_custom_body' => 'boolean',
];
public function defaultProfile()
{
return $this->belongsTo(SmsProfile::class, 'default_profile_id');
}
public function defaultSender()
{
return $this->belongsTo(SmsSender::class, 'default_sender_id');
}
public function action()
{
return $this->belongsTo(Action::class);
}
public function decision()
{
return $this->belongsTo(Decision::class);
}
}