diff --git a/app/Models/Resume.php b/app/Models/Resume.php index 3d3b5fc..d34f455 100644 --- a/app/Models/Resume.php +++ b/app/Models/Resume.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Policies\ResumePolicy; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -25,11 +26,15 @@ class Resume extends Model return $this->belongsTo(User::class, 'creator_id'); } + public function slots(): HasMany + { + return $this->hasMany(ResumeSlot::class); + } + public function components(): BelongsToMany { - return $this->belongsToMany(ResumeComponent::class, 'resume_resume_component') - ->withPivot('order', 'data') - ->withTimestamps() - ->orderBy('order'); + return $this->belongsToMany(ResumeComponent::class) + ->using(ResumeSlot::class) + ->orderBy('resume_slots.order'); } } diff --git a/app/Models/ResumeComponent.php b/app/Models/ResumeComponent.php index 8ad1e4b..d63e916 100644 --- a/app/Models/ResumeComponent.php +++ b/app/Models/ResumeComponent.php @@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Attributes\UsePolicy; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; #[UsePolicy(ResumeComponentPolicy::class)] class ResumeComponent extends Model @@ -21,7 +22,24 @@ class ResumeComponent extends Model public function resumes(): BelongsToMany { return $this->belongsToMany(Resume::class, 'resume_resume_component') - ->withPivot('order', 'data') + ->using(ResumeSlot::class) + ->withTimestamps(); + } + + public function slots(): HasMany + { + return $this->hasMany(ResumeSlot::class); + } + + public function inputs(): HasMany + { + return $this->hasMany(ResumeComponentInput::class); + } + + public function dataTypes(): BelongsToMany + { + return $this->belongsToMany(ResumeComponentDataType::class) + ->using(ResumeComponentInput::class) ->withTimestamps(); } } diff --git a/app/Models/ResumeComponentDataType.php b/app/Models/ResumeComponentDataType.php index 9a940cc..8e4a952 100644 --- a/app/Models/ResumeComponentDataType.php +++ b/app/Models/ResumeComponentDataType.php @@ -4,6 +4,8 @@ namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\Relations\BelongsToMany; +use Illuminate\Database\Eloquent\Relations\HasMany; class ResumeComponentDataType extends Model { @@ -14,4 +16,16 @@ class ResumeComponentDataType extends Model 'data_structure', 'vue_component_name' ]; + + public function inputs(): HasMany + { + return $this->hasMany(ResumeComponentInput::class); + } + + public function components(): BelongsToMany + { + return $this->belongsToMany(ResumeComponent::class) + ->using(ResumeComponentInput::class) + ->withTimestamps(); + } } diff --git a/app/Models/ResumeComponentInput.php b/app/Models/ResumeComponentInput.php new file mode 100644 index 0000000..1126c40 --- /dev/null +++ b/app/Models/ResumeComponentInput.php @@ -0,0 +1,39 @@ + */ + use HasFactory; + + protected $fillable = [ + 'resume_component_id', + 'resume_component_data_type_id', + 'name', + 'placeholder' + ]; + + public function resumes() + { + return ; + } + + public function component(): BelongsTo + { + return $this->belongsTo(ResumeComponent::class); + } + + public function dataType(): BelongsTo + { + return $this->belongsTo(ResumeComponentDataType::class); + } +} diff --git a/app/Models/ResumeSlot.php b/app/Models/ResumeSlot.php new file mode 100644 index 0000000..92c2b0f --- /dev/null +++ b/app/Models/ResumeSlot.php @@ -0,0 +1,32 @@ + */ + use HasFactory; + + protected $fillable = [ + 'resume_id', + 'resume_component_id', + 'order', + ]; + + public function resume() + { + return $this->belongsTo(Resume::class); + } + + public function component() + { + return $this->belongsTo(ResumeComponent::class); + } +} diff --git a/app/Models/ResumeSlotValue.php b/app/Models/ResumeSlotValue.php new file mode 100644 index 0000000..c1039eb --- /dev/null +++ b/app/Models/ResumeSlotValue.php @@ -0,0 +1,51 @@ + */ + use HasFactory; + + protected $fillable = [ + 'resume_slot_id', + 'resume_component_input_id', + 'value' + ]; + + public function resume(): BelongsTo + { + return $this->belongsTo(Resume::class) + ->using(ResumeSlot::class); + } + + public function component(): BelongsTo + { + return $this->belongsTo(ResumeComponent::class) + ->using(ResumeSlot::class); + } + + public function dataType(): BelongsTo + { + return $this->belongsTo(ResumeComponentDataType::class) + ->using(ResumeComponentInput::class); + } + + public function slot(): BelongsTo + { + return $this->belongsTo(ResumeSlot::class); + } + + public function componentInput(): BelongsTo + { + return $this->belongsTo(ResumeComponentInput::class); + } +} diff --git a/database/factories/ResumeComponentInputFactory.php b/database/factories/ResumeComponentInputFactory.php new file mode 100644 index 0000000..fbcb493 --- /dev/null +++ b/database/factories/ResumeComponentInputFactory.php @@ -0,0 +1,23 @@ + + */ +class ResumeComponentInputFactory extends Factory +{ + /** + * Define the model's default state. + * + * @return array + */ + public function definition(): array + { + return [ + + ]; + } +} diff --git a/database/migrations/2025_08_15_161427_create_resumes_table.php b/database/migrations/2025_08_15_161427_create_resumes.php similarity index 100% rename from database/migrations/2025_08_15_161427_create_resumes_table.php rename to database/migrations/2025_08_15_161427_create_resumes.php diff --git a/database/migrations/2025_08_16_110416_create_resume_components_table.php b/database/migrations/2025_08_16_110416_create_resume_components.php similarity index 100% rename from database/migrations/2025_08_16_110416_create_resume_components_table.php rename to database/migrations/2025_08_16_110416_create_resume_components.php diff --git a/database/migrations/2025_08_16_112542_create_resume_resume_component_link.php b/database/migrations/2025_08_16_112542_create_resume_slots.php similarity index 74% rename from database/migrations/2025_08_16_112542_create_resume_resume_component_link.php rename to database/migrations/2025_08_16_112542_create_resume_slots.php index 19f79a7..516e509 100644 --- a/database/migrations/2025_08_16_112542_create_resume_resume_component_link.php +++ b/database/migrations/2025_08_16_112542_create_resume_slots.php @@ -13,7 +13,7 @@ return new class extends Migration */ public function up(): void { - Schema::create('resume_resume_component', function (Blueprint $table) { + Schema::create('resume_slots', function (Blueprint $table) { $table->id(); $table->foreignIdFor(Resume::class)->constrained()->onDelete('cascade'); @@ -21,8 +21,6 @@ return new class extends Migration $table->integer('order')->default(0); - $table->json('data')->comment('JSON structure to define the data for the resume component'); - $table->timestamps(); }); } @@ -32,6 +30,6 @@ return new class extends Migration */ public function down(): void { - Schema::dropIfExists('resume_resume_component_link'); + Schema::dropIfExists('resume_slots'); } }; diff --git a/database/migrations/2025_08_16_113258_create_resume_component_data_types_table.php b/database/migrations/2025_08_16_113258_create_resume_component_data_types.php similarity index 74% rename from database/migrations/2025_08_16_113258_create_resume_component_data_types_table.php rename to database/migrations/2025_08_16_113258_create_resume_component_data_types.php index 704dcb8..d447be7 100644 --- a/database/migrations/2025_08_16_113258_create_resume_component_data_types_table.php +++ b/database/migrations/2025_08_16_113258_create_resume_component_data_types.php @@ -14,7 +14,7 @@ return new class extends Migration Schema::create('resume_component_data_types', function (Blueprint $table) { $table->id(); - $table->json('data_structure')->comment('JSON structure to define the data validation in laravel validation format (https://laravel.com/docs/12.x/validation#quick-writing-the-validation-logic)'); + $table->string('data_structure')->comment('valid format for the value in Laravel validation format (https://laravel.com/docs/12.x/validation#quick-writing-the-validation-logic)'); $table->string('vue_component_name'); $table->timestamps(); diff --git a/database/migrations/2025_08_16_125232_create_resume_component_inputs.php b/database/migrations/2025_08_16_125232_create_resume_component_inputs.php new file mode 100644 index 0000000..aa87fa7 --- /dev/null +++ b/database/migrations/2025_08_16_125232_create_resume_component_inputs.php @@ -0,0 +1,36 @@ +id(); + + $table->foreignIdFor(ResumeComponent::class)->constrained()->onDelete('cascade'); + $table->foreignIdFor(ResumeComponentDataType::class)->constrained()->onDelete('cascade'); + + $table->string('name'); + $table->string("placeholder"); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('resume_component_inputs'); + } +}; diff --git a/database/migrations/2025_08_17_094123_create_resume_slot_values.php b/database/migrations/2025_08_17_094123_create_resume_slot_values.php new file mode 100644 index 0000000..94bc4b6 --- /dev/null +++ b/database/migrations/2025_08_17_094123_create_resume_slot_values.php @@ -0,0 +1,35 @@ +id(); + + $table->foreignIdFor(ResumeSlot::class); + $table->foreignIdFor(ResumeComponentInput::class); + + $table->string('value'); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('resume_slot_value'); + } +};