Created Resume model
Some checks failed
linter / quality (push) Successful in 3m0s
tests / ci (push) Failing after 6m19s

This commit is contained in:
2025-08-15 19:17:39 +02:00
parent 0eaf20efa7
commit e3444ef799
9 changed files with 285 additions and 0 deletions

View File

@@ -0,0 +1,66 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreResumeRequest;
use App\Http\Requests\UpdateResumeRequest;
use App\Models\Resume;
class ResumeController extends Controller
{
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(StoreResumeRequest $request)
{
//
}
/**
* Display the specified resource.
*/
public function show(Resume $resume)
{
//
}
/**
* Show the form for editing the specified resource.
*/
public function edit(Resume $resume)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(UpdateResumeRequest $request, Resume $resume)
{
//
}
/**
* Remove the specified resource from storage.
*/
public function destroy(Resume $resume)
{
//
}
}

View File

@@ -0,0 +1,27 @@
<?php
namespace App\Http\Requests;
use App\Models\Resume;
use Illuminate\Foundation\Http\FormRequest;
class StoreResumeRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return $this->user()->can('create', Resume::class);
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return UpdateResumeRequest::rules();
}
}

View File

@@ -0,0 +1,31 @@
<?php
namespace App\Http\Requests;
use App\Models\Resume;
use App\Policies\ResumePolicy;
use Illuminate\Foundation\Http\FormRequest;
class UpdateResumeRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*/
public function authorize(): bool
{
return $this->user()->can('update', $this->resume);
}
/**
* Get the validation rules that apply to the request.
*
* @return array<string, \Illuminate\Contracts\Validation\ValidationRule|array<mixed>|string>
*/
public function rules(): array
{
return [
'name' => 'required|string|max:255',
'creator_id' => 'required|exists:users,id',
];
}
}

25
app/Models/Resume.php Normal file
View File

@@ -0,0 +1,25 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Attributes\UsePolicy;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
#[UsePolicy(ResumePolicy::class)]
class Resume extends Model
{
/** @use HasFactory<\Database\Factories\ResumeFactory> */
use HasFactory;
protected $fillable = [
'name',
'creator_id'
];
public function creator(): BelongsTo
{
return $this->belongsTo(User::class, 'creator_id');
}
}

View File

@@ -0,0 +1,57 @@
<?php
namespace App\Policies;
use App\Models\Resume;
use App\Models\User;
use Illuminate\Auth\Access\Response;
class ResumePolicy
{
private function isCreator(User $user, Resume $resume): Response
{
return $user->id === $resume->creator_id
? Response::allow()
: Response::deny('You do not own this resume.');
}
/**
* Determine whether the user can view the model.
*/
public function view(User $user, Resume $resume): Response
{
return $this->isCreator($user, $resume);
}
/**
* Determine whether the user can create models.
*/
public function create(User $user): bool
{
return true;
}
/**
* Determine whether the user can update the model.
*/
public function update(User $user, Resume $resume): Response
{
return $this->isCreator($user, $resume);
}
/**
* Determine whether the user can delete the model.
*/
public function delete(User $user, Resume $resume): Response
{
return $this->isCreator($user, $resume);
}
/**
* Determine whether the user can restore the model.
*/
public function restore(User $user, Resume $resume): Response
{
return $this->isCreator($user, $resume);
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace Database\Factories;
use App\Models\User;
use Illuminate\Database\Eloquent\Factories\Factory;
/**
* @extends \Illuminate\Database\Eloquent\Factories\Factory<\App\Models\Resume>
*/
class ResumeFactory extends Factory
{
/**
* Define the model's default state.
*
* @return array<string, mixed>
*/
public function definition(): array
{
return [
'name' => "CV " . $this->faker->company(),
'creator_id' => User::inRandomOrder()->first()->id,
];
}
}

View File

@@ -0,0 +1,32 @@
<?php
use App\Models\User;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::create('resumes', function (Blueprint $table) {
$table->id();
$table->string('name', 255);
$table->foreignIdFor(User::class, "creator_id")->constrained()->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::dropIfExists('resumes');
}
};

View File

@@ -0,0 +1,19 @@
<?php
namespace Database\Seeders;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
class ResumeSeeder extends Seeder
{
/**
* Run the database seeds.
*/
public function run(): void
{
\App\Models\Resume::factory()
->count(10)
->create();
}
}

View File

@@ -1,5 +1,6 @@
<?php
use App\Http\Controllers\ResumeController;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
@@ -11,5 +12,7 @@ Route::get('dashboard', function () {
return Inertia::render('Dashboard');
})->middleware(['auth', 'verified'])->name('dashboard');
Route::resource('resumes', ResumeController::class);
require __DIR__.'/settings.php';
require __DIR__.'/auth.php';