Files
HRM-System/database/seeders/MediaItemSeeder.php
2026-04-13 08:16:56 +08:00

182 lines
11 KiB
PHP

<?php
namespace Database\Seeders;
use App\Models\MediaDirectory;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Str;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
class MediaItemSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
$isSaas = isSaas();
// Get super admin and companies
$superAdmin = User::where('type', 'superadmin')->first();
$companies = User::where('type', 'company')->get();
if (!$superAdmin && $isSaas) {
$this->command->warn('No super admin found. Please run DefaultCompanySeeder first.');
return;
}
if ($isSaas) {
// SaaS mode: Create media for both super admin and companies
if ($superAdmin) {
$this->createSuperAdminMedia($superAdmin);
}
foreach ($companies as $company) {
$this->createCompanyMedia($company);
}
} else {
// Non-SaaS mode: Create media only for companies
foreach ($companies as $company) {
$this->createCompanyMedia($company);
}
}
$this->command->info('MediaItem seeder completed successfully!');
}
/**
* Create media directories and items for Super Admin
*/
private function createSuperAdminMedia($superAdmin)
{
// Create main system directories for Super Admin only
$directories = [
['name' => 'System Templates', 'slug' => 'system-templates'],
['name' => 'System Documentation', 'slug' => 'system-documentation'],
['name' => 'Default Assets', 'slug' => 'default-assets']
];
foreach ($directories as $dirData) {
if (!MediaDirectory::where('slug', $dirData['slug'])->where('created_by', $superAdmin->id)->exists()) {
MediaDirectory::create([
'name' => $dirData['name'],
'slug' => $dirData['slug'],
'parent_id' => null,
'created_by' => $superAdmin->id,
]);
}
}
// Create system media items for Super Admin
$mediaItems = [
['collection_name' => 'system', 'name' => 'Default System Logo', 'file_name' => 'system-default-logo.png', 'mime_type' => 'image/png', 'size' => 15360, 'directory' => 'default-assets'],
['collection_name' => 'templates', 'name' => 'System Template Image', 'file_name' => 'system-template-image.png', 'mime_type' => 'image/png', 'size' => 25600, 'directory' => 'system-templates'],
['collection_name' => 'documentation', 'name' => 'System Documentation', 'file_name' => 'system-user-manual.pdf', 'mime_type' => 'application/pdf', 'size' => 1048576, 'directory' => 'system-documentation'],
['collection_name' => 'system', 'name' => 'System Banner', 'file_name' => 'system-banner.png', 'mime_type' => 'image/png', 'size' => 204800, 'directory' => 'default-assets'],
['collection_name' => 'system', 'name' => 'System Icon Set', 'file_name' => 'system-icons.png', 'mime_type' => 'image/png', 'size' => 51200, 'directory' => 'default-assets'],
['collection_name' => 'templates', 'name' => 'Email Header Template', 'file_name' => 'email-header-template.png', 'mime_type' => 'image/png', 'size' => 30720, 'directory' => 'system-templates'],
['collection_name' => 'templates', 'name' => 'Invoice Template', 'file_name' => 'invoice-template.png', 'mime_type' => 'image/png', 'size' => 40960, 'directory' => 'system-templates'],
['collection_name' => 'documentation', 'name' => 'API Documentation', 'file_name' => 'api-documentation.pdf', 'mime_type' => 'application/pdf', 'size' => 512000, 'directory' => 'system-documentation'],
['collection_name' => 'system', 'name' => 'Default Avatar', 'file_name' => 'default-avatar.png', 'mime_type' => 'image/png', 'size' => 20480, 'directory' => 'default-assets'],
['collection_name' => 'system', 'name' => 'Loading Animation', 'file_name' => 'loading-animation.png', 'mime_type' => 'image/png', 'size' => 102400, 'directory' => 'default-assets'],
['collection_name' => 'templates', 'name' => 'Report Template', 'file_name' => 'report-template.png', 'mime_type' => 'image/png', 'size' => 35840, 'directory' => 'system-templates'],
['collection_name' => 'system', 'name' => 'Error Page Image', 'file_name' => 'error-page.png', 'mime_type' => 'image/png', 'size' => 81920, 'directory' => 'default-assets'],
['collection_name' => 'system', 'name' => 'Success Icon', 'file_name' => 'success-icon.png', 'mime_type' => 'image/png', 'size' => 12288, 'directory' => 'default-assets'],
['collection_name' => 'documentation', 'name' => 'Installation Guide', 'file_name' => 'installation-guide.pdf', 'mime_type' => 'application/pdf', 'size' => 256000, 'directory' => 'system-documentation'],
['collection_name' => 'templates', 'name' => 'Certificate Template', 'file_name' => 'certificate-template.png', 'mime_type' => 'image/png', 'size' => 122880, 'directory' => 'system-templates']
];
foreach ($mediaItems as $mediaData) {
$directory = MediaDirectory::where('slug', $mediaData['directory'])->where('created_by', $superAdmin->id)->first();
if (!Media::where('file_name', $mediaData['file_name'])->where('created_by', $superAdmin->id)->exists()) {
$media = new Media();
$media->model_type = User::class;
$media->model_id = $superAdmin->id;
$media->uuid = Str::uuid();
$media->collection_name = $mediaData['collection_name'];
$media->name = $mediaData['name'];
$media->file_name = $mediaData['file_name'];
$media->mime_type = $mediaData['mime_type'];
$media->disk = 'public';
$media->conversions_disk = 'public';
$media->size = $mediaData['size'];
$media->manipulations = [];
$media->custom_properties = [];
$media->generated_conversions = [];
$media->responsive_images = [];
$media->order_column = 1;
$media->directory_id = $directory?->id;
$media->created_by = $superAdmin->id;
$media->saveQuietly();
}
}
}
/**
* Create media directories and items for Company
*/
private function createCompanyMedia($company)
{
// Create organized directories for Company with company name prefix
$companyName = str_replace(' ', '-', strtolower($company->name));
$directories = [
['name' => $company->name . ' - Assets', 'slug' => $companyName . '-assets'],
['name' => $company->name . ' - Documents', 'slug' => $companyName . '-documents'],
['name' => $company->name . ' - Branding', 'slug' => $companyName . '-branding']
];
foreach ($directories as $dirData) {
if (!MediaDirectory::where('slug', $dirData['slug'])->where('created_by', $company->id)->exists()) {
MediaDirectory::create([
'name' => $dirData['name'],
'slug' => $dirData['slug'],
'parent_id' => null,
'created_by' => $company->id,
]);
}
}
// Create organized media items for Company
$companyName = str_replace(' ', '-', strtolower($company->name));
$mediaItems = [
['collection_name' => 'branding', 'name' => $company->name . ' Logo', 'file_name' => $companyName . '-logo.png', 'mime_type' => 'image/png', 'size' => 25600, 'directory' => $companyName . '-branding'],
['collection_name' => 'documents', 'name' => $company->name . ' Employee Handbook', 'file_name' => $companyName . '-employee-handbook.pdf', 'mime_type' => 'application/pdf', 'size' => 512000, 'directory' => $companyName . '-documents'],
['collection_name' => 'assets', 'name' => $company->name . ' Office Photo', 'file_name' => $companyName . '-office-photo.png', 'mime_type' => 'image/png', 'size' => 307200, 'directory' => $companyName . '-assets'],
['collection_name' => 'branding', 'name' => $company->name . ' Business Card', 'file_name' => $companyName . '-business-card.png', 'mime_type' => 'image/png', 'size' => 40960, 'directory' => $companyName . '-branding'],
['collection_name' => 'branding', 'name' => $company->name . ' Letterhead', 'file_name' => $companyName . '-letterhead.png', 'mime_type' => 'image/png', 'size' => 61440, 'directory' => $companyName . '-branding'],
['collection_name' => 'documents', 'name' => $company->name . ' Policy Document', 'file_name' => $companyName . '-policy-document.pdf', 'mime_type' => 'application/pdf', 'size' => 256000, 'directory' => $companyName . '-documents'],
['collection_name' => 'documents', 'name' => $company->name . ' Training Manual', 'file_name' => $companyName . '-training-manual.pdf', 'mime_type' => 'application/pdf', 'size' => 768000, 'directory' => $companyName . '-documents'],
['collection_name' => 'assets', 'name' => $company->name . ' Team Photo', 'file_name' => $companyName . '-team-photo.png', 'mime_type' => 'image/png', 'size' => 409600, 'directory' => $companyName . '-assets'],
['collection_name' => 'assets', 'name' => $company->name . ' Building Exterior', 'file_name' => $companyName . '-building-exterior.png', 'mime_type' => 'image/png', 'size' => 512000, 'directory' => $companyName . '-assets'],
['collection_name' => 'branding', 'name' => $company->name . ' Social Media Banner', 'file_name' => $companyName . '-social-banner.png', 'mime_type' => 'image/png', 'size' => 153600, 'directory' => $companyName . '-branding']
];
foreach ($mediaItems as $mediaData) {
$directory = MediaDirectory::where('slug', $mediaData['directory'])->where('created_by', $company->id)->first();
if (!Media::where('file_name', $mediaData['file_name'])->where('created_by', $company->id)->exists()) {
Media::create([
'model_type' => User::class,
'model_id' => $company->id,
'uuid' => Str::uuid(),
'collection_name' => $mediaData['collection_name'],
'name' => $mediaData['name'],
'file_name' => $mediaData['file_name'],
'mime_type' => $mediaData['mime_type'],
'disk' => 'public',
'conversions_disk' => 'public',
'size' => $mediaData['size'],
'manipulations' => [],
'custom_properties' => [],
'generated_conversions' => [],
'responsive_images' => [],
'order_column' => 1,
'directory_id' => $directory?->id,
'created_by' => $company->id,
]);
}
}
}
}