coolify/app/Models/S3Storage.php

77 lines
2.1 KiB
PHP
Raw Normal View History

2023-08-07 15:31:42 +02:00
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
2023-10-10 13:10:43 +02:00
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Storage;
2023-08-07 15:31:42 +02:00
class S3Storage extends BaseModel
{
use HasFactory;
2023-08-07 15:31:42 +02:00
protected $guarded = [];
2024-06-10 22:43:34 +02:00
2023-08-07 18:46:40 +02:00
protected $casts = [
2023-10-10 13:10:43 +02:00
'is_usable' => 'boolean',
2023-08-07 18:46:40 +02:00
'key' => 'encrypted',
'secret' => 'encrypted',
];
2023-08-07 15:31:42 +02:00
2024-06-10 22:43:34 +02:00
public static function ownedByCurrentTeam(array $select = ['*'])
2023-08-07 15:31:42 +02:00
{
$selectArray = collect($select)->concat(['id']);
2024-06-10 22:43:34 +02:00
2023-08-22 17:44:49 +02:00
return S3Storage::whereTeamId(currentTeam()->id)->select($selectArray->all())->orderBy('name');
2023-08-07 15:31:42 +02:00
}
2024-06-10 22:43:34 +02:00
2023-10-10 13:10:43 +02:00
public function isUsable()
{
return $this->is_usable;
}
2023-10-10 13:10:43 +02:00
public function team()
{
return $this->belongsTo(Team::class);
}
2024-06-10 22:43:34 +02:00
public function awsUrl()
{
2023-08-07 15:31:42 +02:00
return "{$this->endpoint}/{$this->bucket}";
}
public function testConnection(bool $shouldSave = false)
{
2023-10-10 13:10:43 +02:00
try {
set_s3_target($this);
Storage::disk('custom-s3')->files();
$this->unusable_email_sent = false;
$this->is_usable = true;
} catch (\Throwable $e) {
$this->is_usable = false;
if ($this->unusable_email_sent === false && is_transactional_emails_active()) {
2024-07-24 21:11:12 +02:00
$mail = new MailMessage;
2023-10-10 13:10:43 +02:00
$mail->subject('Coolify: S3 Storage Connection Error');
2024-04-26 14:09:54 +02:00
$mail->view('emails.s3-connection-error', ['name' => $this->name, 'reason' => $e->getMessage(), 'url' => route('storage.show', ['storage_uuid' => $this->uuid])]);
2023-10-10 13:10:43 +02:00
$users = collect([]);
$members = $this->team->members()->get();
foreach ($members as $user) {
if ($user->isAdmin()) {
$users->push($user);
}
}
foreach ($users as $user) {
send_user_an_email($mail, $user->email);
}
$this->unusable_email_sent = true;
}
throw $e;
} finally {
if ($shouldSave) {
$this->save();
}
2023-10-10 13:10:43 +02:00
}
2023-08-07 15:31:42 +02:00
}
}