feat(website-type): add presentation fields and site logo relationship to WebsiteType model
This commit is contained in:
@@ -2,14 +2,21 @@
|
|||||||
|
|
||||||
namespace App\Domains\Tenant\Models;
|
namespace App\Domains\Tenant\Models;
|
||||||
|
|
||||||
|
use App\Domains\Attachable\Models\Attachment;
|
||||||
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
use Illuminate\Database\Eloquent\Attributes\Fillable;
|
||||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||||
use Illuminate\Database\Eloquent\Model;
|
use Illuminate\Database\Eloquent\Model;
|
||||||
|
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||||
use Illuminate\Database\Eloquent\Relations\HasMany;
|
use Illuminate\Database\Eloquent\Relations\HasMany;
|
||||||
|
|
||||||
#[Fillable([
|
#[Fillable([
|
||||||
'codigo',
|
'codigo',
|
||||||
'nombre',
|
'nombre',
|
||||||
|
'primary_color',
|
||||||
|
'secondary_color',
|
||||||
|
'danger_color',
|
||||||
|
'success_color',
|
||||||
|
'site_logo',
|
||||||
])]
|
])]
|
||||||
class WebsiteType extends Model
|
class WebsiteType extends Model
|
||||||
{
|
{
|
||||||
@@ -17,6 +24,14 @@ class WebsiteType extends Model
|
|||||||
|
|
||||||
protected $table = 'website_type';
|
protected $table = 'website_type';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return BelongsTo<Attachment, $this>
|
||||||
|
*/
|
||||||
|
public function siteLogo(): BelongsTo
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Attachment::class, 'site_logo');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return HasMany<WebsiteTypeExtra, $this>
|
* @return HasMany<WebsiteTypeExtra, $this>
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -37,6 +37,11 @@ class TenantResource extends JsonResource
|
|||||||
fn () => $this->websiteType ? [
|
fn () => $this->websiteType ? [
|
||||||
'codigo' => $this->websiteType->codigo,
|
'codigo' => $this->websiteType->codigo,
|
||||||
'nombre' => $this->websiteType->nombre,
|
'nombre' => $this->websiteType->nombre,
|
||||||
|
'primary_color' => $this->websiteType->primary_color,
|
||||||
|
'secondary_color' => $this->websiteType->secondary_color,
|
||||||
|
'danger_color' => $this->websiteType->danger_color,
|
||||||
|
'success_color' => $this->websiteType->success_color,
|
||||||
|
'site_logo' => $this->websiteType->siteLogo?->getTemporaryUrl(1440),
|
||||||
] : null
|
] : null
|
||||||
),
|
),
|
||||||
'extras' => $this->whenLoaded(
|
'extras' => $this->whenLoaded(
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ class TenantInformationService
|
|||||||
'headerLogo',
|
'headerLogo',
|
||||||
'footerLogo',
|
'footerLogo',
|
||||||
'socialMedia',
|
'socialMedia',
|
||||||
'websiteType',
|
'websiteType.siteLogo',
|
||||||
'websiteExtras.websiteTypeExtra',
|
'websiteExtras.websiteTypeExtra',
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|||||||
49
app/Domains/Tenant/Services/WebsiteTypeService.php
Normal file
49
app/Domains/Tenant/Services/WebsiteTypeService.php
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Domains\Tenant\Services;
|
||||||
|
|
||||||
|
use App\Domains\Attachable\Models\Attachment;
|
||||||
|
use App\Domains\Attachable\Services\AttachmentService;
|
||||||
|
use App\Domains\Tenant\Models\WebsiteType;
|
||||||
|
use Illuminate\Support\Facades\DB;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
|
class WebsiteTypeService
|
||||||
|
{
|
||||||
|
public function __construct(
|
||||||
|
protected AttachmentService $attachmentService,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a website type and store its site logo.
|
||||||
|
*
|
||||||
|
* @param array<string, mixed> $data
|
||||||
|
*/
|
||||||
|
public function create(array $data): WebsiteType
|
||||||
|
{
|
||||||
|
return DB::transaction(function () use ($data): WebsiteType {
|
||||||
|
$siteLogo = $data['site_logo'] ?? null;
|
||||||
|
|
||||||
|
unset($data['site_logo']);
|
||||||
|
|
||||||
|
$siteLogoAttachmentId = null;
|
||||||
|
|
||||||
|
if ($siteLogo) {
|
||||||
|
$attachment = Str::isUuid($siteLogo)
|
||||||
|
? Attachment::query()->where('key', $siteLogo)->first()
|
||||||
|
: $this->attachmentService->store($siteLogo, 'website-types');
|
||||||
|
|
||||||
|
if ($attachment) {
|
||||||
|
$siteLogoAttachmentId = $attachment->id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$data['site_logo'] = $siteLogoAttachmentId;
|
||||||
|
|
||||||
|
/** @var WebsiteType $websiteType */
|
||||||
|
$websiteType = WebsiteType::query()->create($data);
|
||||||
|
|
||||||
|
return $websiteType;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
|
||||||
|
return new class extends Migration
|
||||||
|
{
|
||||||
|
public function up(): void
|
||||||
|
{
|
||||||
|
Schema::table('website_type', function (Blueprint $table): void {
|
||||||
|
$table->string('primary_color')->nullable()->after('nombre');
|
||||||
|
$table->string('secondary_color')->nullable()->after('primary_color');
|
||||||
|
$table->string('danger_color')->nullable()->after('secondary_color');
|
||||||
|
$table->string('success_color')->nullable()->after('danger_color');
|
||||||
|
$table->unsignedBigInteger('site_logo')->nullable()->after('success_color');
|
||||||
|
|
||||||
|
$table->foreign('site_logo')
|
||||||
|
->references('id')
|
||||||
|
->on('attachments')
|
||||||
|
->nullOnDelete();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down(): void
|
||||||
|
{
|
||||||
|
Schema::table('website_type', function (Blueprint $table): void {
|
||||||
|
if (Schema::getConnection()->getDriverName() !== 'sqlite') {
|
||||||
|
$table->dropForeign(['site_logo']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$table->dropColumn([
|
||||||
|
'primary_color',
|
||||||
|
'secondary_color',
|
||||||
|
'danger_color',
|
||||||
|
'success_color',
|
||||||
|
'site_logo',
|
||||||
|
]);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
namespace Tests\Feature\Tenant;
|
namespace Tests\Feature\Tenant;
|
||||||
|
|
||||||
|
use App\Domains\Attachable\Enums\AttachmentType;
|
||||||
|
use App\Domains\Attachable\Models\Attachment;
|
||||||
use App\Domains\Tenant\Models\Tenant;
|
use App\Domains\Tenant\Models\Tenant;
|
||||||
use App\Domains\Tenant\Models\WebsiteType;
|
use App\Domains\Tenant\Models\WebsiteType;
|
||||||
use Illuminate\Foundation\Testing\RefreshDatabase;
|
use Illuminate\Foundation\Testing\RefreshDatabase;
|
||||||
@@ -20,6 +22,11 @@ class WebsiteExtrasTest extends TestCase
|
|||||||
'id',
|
'id',
|
||||||
'codigo',
|
'codigo',
|
||||||
'nombre',
|
'nombre',
|
||||||
|
'primary_color',
|
||||||
|
'secondary_color',
|
||||||
|
'danger_color',
|
||||||
|
'success_color',
|
||||||
|
'site_logo',
|
||||||
'created_at',
|
'created_at',
|
||||||
'updated_at',
|
'updated_at',
|
||||||
], Schema::getColumnListing('website_type'));
|
], Schema::getColumnListing('website_type'));
|
||||||
@@ -49,9 +56,21 @@ class WebsiteExtrasTest extends TestCase
|
|||||||
|
|
||||||
public function test_models_map_the_diagram_relations_and_casts(): void
|
public function test_models_map_the_diagram_relations_and_casts(): void
|
||||||
{
|
{
|
||||||
|
$siteLogo = Attachment::query()->create([
|
||||||
|
'key' => '92bb3986-fb22-4871-b98c-fc5663d78aa6',
|
||||||
|
'path' => 'website-types/site-logo.png',
|
||||||
|
'filename' => 'site-logo.png',
|
||||||
|
'type' => AttachmentType::Image,
|
||||||
|
'mime_type' => 'image/png',
|
||||||
|
]);
|
||||||
$type = WebsiteType::query()->create([
|
$type = WebsiteType::query()->create([
|
||||||
'codigo' => 'store',
|
'codigo' => 'store',
|
||||||
'nombre' => 'Tienda',
|
'nombre' => 'Tienda',
|
||||||
|
'primary_color' => '#111111',
|
||||||
|
'secondary_color' => '#222222',
|
||||||
|
'danger_color' => '#ff0000',
|
||||||
|
'success_color' => '#00aa55',
|
||||||
|
'site_logo' => $siteLogo->id,
|
||||||
]);
|
]);
|
||||||
$typeExtra = $type->extras()->create([
|
$typeExtra = $type->extras()->create([
|
||||||
'codigo' => 'whatsapp',
|
'codigo' => 'whatsapp',
|
||||||
@@ -72,6 +91,11 @@ class WebsiteExtrasTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
$this->assertTrue($type->extras()->firstOrFail()->is($typeExtra));
|
$this->assertTrue($type->extras()->firstOrFail()->is($typeExtra));
|
||||||
|
$this->assertSame('#111111', $type->primary_color);
|
||||||
|
$this->assertSame('#222222', $type->secondary_color);
|
||||||
|
$this->assertSame('#ff0000', $type->danger_color);
|
||||||
|
$this->assertSame('#00aa55', $type->success_color);
|
||||||
|
$this->assertTrue($type->siteLogo()->firstOrFail()->is($siteLogo));
|
||||||
$this->assertSame($type->codigo, $typeExtra->website_type_code);
|
$this->assertSame($type->codigo, $typeExtra->website_type_code);
|
||||||
$this->assertSame('whatsapp', $typeExtra->codigo);
|
$this->assertSame('whatsapp', $typeExtra->codigo);
|
||||||
$this->assertTrue($type->tenants()->firstOrFail()->is($tenant));
|
$this->assertTrue($type->tenants()->firstOrFail()->is($tenant));
|
||||||
|
|||||||
Reference in New Issue
Block a user