wip
This commit is contained in:
@@ -16,7 +16,6 @@ class ExceptionHandler extends Handler
|
||||
"password",
|
||||
"password_confirmation",
|
||||
];
|
||||
|
||||
protected array $handleByInertia = [
|
||||
Response::HTTP_INTERNAL_SERVER_ERROR,
|
||||
Response::HTTP_SERVICE_UNAVAILABLE,
|
||||
|
@@ -99,4 +99,3 @@ class VacationRequestWaitsForApprovalNotification extends Notification
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -9,5 +9,6 @@ use Toby\Eloquent\Models\VacationRequest;
|
||||
interface VacationRequestRule
|
||||
{
|
||||
public function check(VacationRequest $vacationRequest): bool;
|
||||
|
||||
public function errorMessage(): string;
|
||||
}
|
||||
|
@@ -21,7 +21,6 @@ class Holiday extends Model
|
||||
use HasFactory;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
"date" => "date",
|
||||
];
|
||||
|
@@ -26,9 +26,7 @@ class Profile extends Model
|
||||
use HasAvatar;
|
||||
|
||||
protected $primaryKey = "user_id";
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
"employment_form" => EmploymentForm::class,
|
||||
"employment_date" => "date",
|
||||
|
44
app/Eloquent/Models/Resume.php
Normal file
44
app/Eloquent/Models/Resume.php
Normal file
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Eloquent\Models;
|
||||
|
||||
use Database\Factories\ResumeFactory;
|
||||
use Illuminate\Database\Eloquent\Casts\AsCollection;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Database\Eloquent\Relations\BelongsTo;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property ?User $user
|
||||
* @property string $name
|
||||
* @property Collection $education
|
||||
* @property Collection $languages
|
||||
* @property Collection $technologies
|
||||
* @property Collection $projects
|
||||
*/
|
||||
class Resume extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $guarded = [];
|
||||
protected $casts = [
|
||||
"education" => AsCollection::class,
|
||||
"languages" => AsCollection::class,
|
||||
"technologies" => AsCollection::class,
|
||||
"projects" => AsCollection::class,
|
||||
];
|
||||
|
||||
public function user(): BelongsTo
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
|
||||
protected static function newFactory(): ResumeFactory
|
||||
{
|
||||
return ResumeFactory::new();
|
||||
}
|
||||
}
|
23
app/Eloquent/Models/Technology.php
Normal file
23
app/Eloquent/Models/Technology.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Eloquent\Models;
|
||||
|
||||
use Database\Factories\TechnologyFactory;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* @property int $id
|
||||
* @property string $name
|
||||
*/
|
||||
class Technology extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected static function newFactory(): TechnologyFactory
|
||||
{
|
||||
return TechnologyFactory::new();
|
||||
}
|
||||
}
|
@@ -33,18 +33,15 @@ class User extends Authenticatable
|
||||
use SoftDeletes;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
"role" => Role::class,
|
||||
"last_active_at" => "datetime",
|
||||
"employment_form" => EmploymentForm::class,
|
||||
"employment_date" => "date",
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
"remember_token",
|
||||
];
|
||||
|
||||
protected $with = [
|
||||
"profile",
|
||||
];
|
||||
|
@@ -41,7 +41,6 @@ class VacationRequest extends Model
|
||||
use HasStates;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
"type" => VacationType::class,
|
||||
"state" => VacationRequestState::class,
|
||||
|
@@ -22,7 +22,6 @@ class VacationRequestActivity extends Model
|
||||
use HasFactory;
|
||||
|
||||
protected $guarded = [];
|
||||
|
||||
protected $casts = [
|
||||
"from" => VacationRequestState::class,
|
||||
"to" => VacationRequestState::class,
|
||||
|
@@ -4,26 +4,108 @@ declare(strict_types=1);
|
||||
|
||||
namespace Toby\Infrastructure\Http\Controllers;
|
||||
|
||||
use Illuminate\Auth\Access\AuthorizationException;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Inertia\Response;
|
||||
use Toby\Eloquent\Helpers\YearPeriodRetriever;
|
||||
use Toby\Eloquent\Models\Holiday;
|
||||
use Toby\Infrastructure\Http\Requests\HolidayRequest;
|
||||
use Toby\Infrastructure\Http\Resources\HolidayFormDataResource;
|
||||
use Toby\Infrastructure\Http\Resources\HolidayResource;
|
||||
use Toby\Eloquent\Models\Resume;
|
||||
use Toby\Eloquent\Models\Technology;
|
||||
use Toby\Eloquent\Models\User;
|
||||
use Toby\Infrastructure\Http\Requests\ResumeRequest;
|
||||
use Toby\Infrastructure\Http\Resources\ResumeFormResource;
|
||||
use Toby\Infrastructure\Http\Resources\ResumeResource;
|
||||
use Toby\Infrastructure\Http\Resources\SimpleUserResource;
|
||||
|
||||
class ResumeController extends Controller
|
||||
{
|
||||
public function index(Request $request): Response
|
||||
public function index(): Response
|
||||
{
|
||||
return inertia("Resumes/Index");
|
||||
$resumes = Resume::query()
|
||||
->paginate();
|
||||
|
||||
return inertia("Resumes/Index", [
|
||||
"resumes" => ResumeResource::collection($resumes),
|
||||
]);
|
||||
}
|
||||
|
||||
public function create(): Response
|
||||
{
|
||||
return inertia("Resumes/Create",[
|
||||
]);
|
||||
$users = User::query()
|
||||
->orderByProfileField("last_name")
|
||||
->orderByProfileField("first_name")
|
||||
->get();
|
||||
|
||||
return inertia("Resumes/Create", [
|
||||
"users" => SimpleUserResource::collection($users),
|
||||
"technologies" => Technology::all()->pluck("name"),
|
||||
]);
|
||||
}
|
||||
|
||||
public function store(ResumeRequest $request): RedirectResponse
|
||||
{
|
||||
$resume = new Resume();
|
||||
|
||||
if ($request->hasEmployee()) {
|
||||
$resume->user()->associate($request->getEmployee());
|
||||
} else {
|
||||
$resume->name = $request->getName();
|
||||
}
|
||||
|
||||
$resume->fill([
|
||||
"education" => $request->getEducation(),
|
||||
"languages" => $request->getLanguageLevels(),
|
||||
"technologies" => $request->getTechnologyLevels(),
|
||||
"projects" => $request->getProjects(),
|
||||
]);
|
||||
|
||||
$resume->save();
|
||||
|
||||
return redirect()
|
||||
->route("resumes.index")
|
||||
->with("success", __("Resume has been created."));
|
||||
}
|
||||
|
||||
public function edit(Resume $resume): Response
|
||||
{
|
||||
$users = User::query()
|
||||
->orderByProfileField("last_name")
|
||||
->orderByProfileField("first_name")
|
||||
->get();
|
||||
|
||||
return inertia("Resumes/Edit", [
|
||||
"resume" => new ResumeFormResource($resume),
|
||||
"users" => SimpleUserResource::collection($users),
|
||||
"technologies" => Technology::all()->pluck("name"),
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(Resume $resume, ResumeRequest $request): RedirectResponse
|
||||
{
|
||||
if ($request->hasEmployee()) {
|
||||
$resume->user()->associate($request->getEmployee());
|
||||
} else {
|
||||
$resume->user()->dissociate();
|
||||
$resume->name = $request->getName();
|
||||
}
|
||||
|
||||
$resume->fill([
|
||||
"education" => $request->getEducation(),
|
||||
"languages" => $request->getLanguageLevels(),
|
||||
"technologies" => $request->getTechnologyLevels(),
|
||||
"projects" => $request->getProjects(),
|
||||
]);
|
||||
|
||||
$resume->save();
|
||||
|
||||
return redirect()
|
||||
->route("resumes.index")
|
||||
->with("success", __("Resume has been updated."));
|
||||
}
|
||||
|
||||
public function destroy(Resume $resume): RedirectResponse
|
||||
{
|
||||
$resume->delete();
|
||||
|
||||
return redirect()
|
||||
->route("resumes.index")
|
||||
->with("success", __("Resume has been deleted."));
|
||||
}
|
||||
}
|
||||
|
@@ -40,7 +40,6 @@ class Kernel extends HttpKernel
|
||||
TrimStrings::class,
|
||||
ConvertEmptyStringsToNull::class,
|
||||
];
|
||||
|
||||
protected $middlewareGroups = [
|
||||
"web" => [
|
||||
EncryptCookies::class,
|
||||
@@ -58,7 +57,6 @@ class Kernel extends HttpKernel
|
||||
SubstituteBindings::class,
|
||||
],
|
||||
];
|
||||
|
||||
protected $routeMiddleware = [
|
||||
"auth" => Authenticate::class,
|
||||
"auth.basic" => AuthenticateWithBasicAuth::class,
|
||||
|
77
app/Infrastructure/Http/Requests/ResumeRequest.php
Normal file
77
app/Infrastructure/Http/Requests/ResumeRequest.php
Normal file
@@ -0,0 +1,77 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Infrastructure\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Support\Collection;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Toby\Eloquent\Models\User;
|
||||
|
||||
class ResumeRequest extends FormRequest
|
||||
{
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
"user" => ["nullable", "exists:users,id"],
|
||||
"name" => ["required_without:user"],
|
||||
|
||||
"education.*.school" => ["required"],
|
||||
"education.*.degree" => ["required"],
|
||||
"education.*.fieldOfStudy" => ["required"],
|
||||
"education.*.startDate" => ["required", "date_format:Y-m-d"],
|
||||
"education.*.endDate" => ["required", "date_format:Y-m-d", "after:startDate"],
|
||||
|
||||
"languages.*.name" => ["required", "distinct"],
|
||||
"languages.*.level" => ["required", Rule::in(1, 2, 3, 4, 5, 6)],
|
||||
|
||||
"technologies.*.name" => ["required", "exists:technologies,name", "distinct"],
|
||||
"technologies.*.level" => ["required", Rule::in(1, 2, 3, 4, 5)],
|
||||
|
||||
"projects.*.description" => ["required"],
|
||||
"projects.*.technologies" => ["required"],
|
||||
"projects.*.startDate" => ["required", "date_format:Y-m-d"],
|
||||
"projects.*.endDate" => ["required", "date_format:Y-m-d", "after:startDate"],
|
||||
"projects.*.tasks" => ["required"],
|
||||
];
|
||||
}
|
||||
|
||||
public function hasEmployee(): bool
|
||||
{
|
||||
return $this->has("user");
|
||||
}
|
||||
|
||||
public function getEmployee(): User
|
||||
{
|
||||
/** @var User $user */
|
||||
$user = User::query()->find($this->get("user"));
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
public function getName(): string
|
||||
{
|
||||
return $this->get("name");
|
||||
}
|
||||
|
||||
public function getLanguageLevels(): Collection
|
||||
{
|
||||
return $this->collect("languages");
|
||||
}
|
||||
|
||||
public function getTechnologyLevels(): Collection
|
||||
{
|
||||
return $this->collect("technologies");
|
||||
}
|
||||
|
||||
public function getEducation(): Collection
|
||||
{
|
||||
return $this->collect("education");
|
||||
}
|
||||
|
||||
public function getProjects(): Collection
|
||||
{
|
||||
return $this->collect("projects");
|
||||
}
|
||||
}
|
26
app/Infrastructure/Http/Resources/ResumeFormResource.php
Normal file
26
app/Infrastructure/Http/Resources/ResumeFormResource.php
Normal file
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Infrastructure\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class ResumeFormResource extends JsonResource
|
||||
{
|
||||
public static $wrap = null;
|
||||
|
||||
public function toArray($request): array
|
||||
{
|
||||
return [
|
||||
"id" => $this->id,
|
||||
"user" => $this->user_id,
|
||||
"name" => $this->name,
|
||||
"description" => $this->description,
|
||||
"education" => $this->education,
|
||||
"languages" => $this->languages,
|
||||
"technologies" => $this->technologies,
|
||||
"projects" => $this->projects,
|
||||
];
|
||||
}
|
||||
}
|
24
app/Infrastructure/Http/Resources/ResumeResource.php
Normal file
24
app/Infrastructure/Http/Resources/ResumeResource.php
Normal file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Toby\Infrastructure\Http\Resources;
|
||||
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
|
||||
class ResumeResource extends JsonResource
|
||||
{
|
||||
public static $wrap = null;
|
||||
|
||||
public function toArray($request): array
|
||||
{
|
||||
return [
|
||||
"id" => $this->id,
|
||||
"user" => new SimpleUserResource($this->user),
|
||||
"name" => $this->name,
|
||||
"description" => $this->description,
|
||||
"createdAt" => $this->created_at->toDisplayString(),
|
||||
"updatedAt" => $this->updated_at->toDisplayString(),
|
||||
];
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user