Skip to content

Commit

Permalink
#5 - students crud (#31)
Browse files Browse the repository at this point in the history
* #5 - wip: crud for students

* #5 - added creating students

* #5 - wip: added editing students

* #5 - added students deleting

* #5 - cr fixes

* Update lang/en/validation.php

Co-authored-by: Krzysztof Rewak <[email protected]>

---------

Co-authored-by: Krzysztof Rewak <[email protected]>
  • Loading branch information
kamilpiech97 and krzysztofrewak authored Sep 20, 2023
1 parent 673c5f1 commit 2bbefb2
Show file tree
Hide file tree
Showing 43 changed files with 1,172 additions and 372 deletions.
60 changes: 60 additions & 0 deletions app/Http/Controllers/Dashboard/StudentController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<?php

declare(strict_types=1);

namespace App\Http\Controllers\Dashboard;

use App\Http\Controllers\Controller;
use App\Http\Requests\StoreStudentRequest;
use App\Http\Requests\UpdateStudentRequest;
use App\Models\Student;
use Illuminate\Http\RedirectResponse;
use Inertia\Response;

class StudentController extends Controller
{
public function index(): Response
{
return inertia("Dashboard/Student/Index", [
"students" => Student::query()->paginate(),
]);
}

public function create(): Response
{
return inertia("Dashboard/Student/Create");
}

public function store(StoreStudentRequest $request): RedirectResponse
{
Student::query()->create($request->validated());

return redirect()
->route("students.index")
->with("success", "Dodano studenta");
}

public function edit(Student $student): Response
{
return inertia("Dashboard/Student/Edit", [
"student" => $student,
]);
}

public function update(UpdateStudentRequest $request, Student $student): RedirectResponse
{
$student->update($request->validated());

return redirect()
->route("students.index")
->with("success", "Zaktualizowano studenta");
}

public function destroy(Student $student): RedirectResponse
{
$student->delete();

return redirect()->back()
->with("success", "Usunięto studenta");
}
}
11 changes: 11 additions & 0 deletions app/Http/Middleware/HandleInertiaRequests.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Inertia\Middleware;

Expand All @@ -19,6 +20,16 @@ public function version(Request $request): ?string
public function share(Request $request): array
{
return array_merge(parent::share($request), [
"flash" => $this->getFlashedData($request),
]);
}

protected function getFlashedData(Request $request): Closure
{
return fn(): array => [
"success" => $request->session()->get("success"),
"error" => $request->session()->get("error"),
"info" => $request->session()->get("info"),
];
}
}
19 changes: 19 additions & 0 deletions app/Http/Requests/StoreStudentRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class StoreStudentRequest extends FormRequest
{
public function rules(): array
{
return [
"name" => ["required", "max:255"],
"surname" => ["required", "max:255"],
"index_number" => ["required", "max:255", "unique:students,index_number"],
];
}
}
19 changes: 19 additions & 0 deletions app/Http/Requests/UpdateStudentRequest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateStudentRequest extends FormRequest
{
public function rules(): array
{
return [
"name" => ["required", "max:255"],
"surname" => ["required", "max:255"],
"index_number" => ["required", "max:255", "unique:students,index_number,{$this->student->id}"],
];
}
}
21 changes: 21 additions & 0 deletions app/Models/Student.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
<?php

declare(strict_types=1);

namespace App\Models;

use Illuminate\Database\Eloquent\Concerns\HasUlids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
use HasFactory;
use HasUlids;

protected $fillable = [
"name",
"surname",
"index_number",
];
}
2 changes: 1 addition & 1 deletion config/app.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
"url" => env("APP_URL", "http://localhost"),
"asset_url" => env("ASSET_URL"),
"timezone" => "UTC",
"locale" => "en",
"locale" => "pl",
"fallback_locale" => "en",
"faker_locale" => "en_US",
"key" => env("APP_KEY"),
Expand Down
19 changes: 19 additions & 0 deletions database/factories/StudentFactory.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<?php

declare(strict_types=1);

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

class StudentFactory extends Factory
{
public function definition(): array
{
return [
"name" => fake()->name(),
"surname" => fake()->lastName(),
"index_number" => fake()->unique()->numberBetween(1, 10000),
];
}
}
25 changes: 25 additions & 0 deletions database/migrations/2023_09_17_075139_create_students_table.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

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::create("students", function (Blueprint $table): void {
$table->ulid("id")->primary();
$table->string("name");
$table->string("surname");
$table->string("index_number")->unique();
$table->timestamps();
});
}

public function down(): void
{
Schema::dropIfExists("students");
}
};
9 changes: 9 additions & 0 deletions lang/en/auth.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<?php

declare(strict_types=1);

return [
"failed" => "These credentials do not match our records.",
"password" => "The provided password is incorrect.",
"throttle" => "Too many login attempts. Please try again in :seconds seconds.",
];
8 changes: 8 additions & 0 deletions lang/en/pagination.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

declare(strict_types=1);

return [
"previous" => "&laquo; Previous",
"next" => "Next &raquo;",
];
11 changes: 11 additions & 0 deletions lang/en/passwords.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
<?php

declare(strict_types=1);

return [
"reset" => "Your password has been reset.",
"sent" => "We have emailed your password reset link.",
"throttled" => "Please wait before retrying.",
"token" => "This password reset token is invalid.",
"user" => "We can't find a user with that email address.",
];
150 changes: 150 additions & 0 deletions lang/en/validation.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,150 @@
<?php

declare(strict_types=1);

return [
"accepted" => "The :attribute field must be accepted.",
"accepted_if" => "The :attribute field must be accepted when :other is :value.",
"active_url" => "The :attribute field must be a valid URL.",
"after" => "The :attribute field must be a date after :date.",
"after_or_equal" => "The :attribute field must be a date after or equal to :date.",
"alpha" => "The :attribute field must only contain letters.",
"alpha_dash" => "The :attribute field must only contain letters, numbers, dashes, and underscores.",
"alpha_num" => "The :attribute field must only contain letters and numbers.",
"array" => "The :attribute field must be an array.",
"ascii" => "The :attribute field must only contain single-byte alphanumeric characters and symbols.",
"before" => "The :attribute field must be a date before :date.",
"before_or_equal" => "The :attribute field must be a date before or equal to :date.",
"between" => [
"array" => "The :attribute field must have between :min and :max items.",
"file" => "The :attribute field must be between :min and :max kilobytes.",
"numeric" => "The :attribute field must be between :min and :max.",
"string" => "The :attribute field must be between :min and :max characters.",
],
"boolean" => "The :attribute field must be true or false.",
"can" => "The :attribute field contains an unauthorized value.",
"confirmed" => "The :attribute field confirmation does not match.",
"current_password" => "The password is incorrect.",
"date" => "The :attribute field must be a valid date.",
"date_equals" => "The :attribute field must be a date equal to :date.",
"date_format" => "The :attribute field must match the format :format.",
"decimal" => "The :attribute field must have :decimal decimal places.",
"declined" => "The :attribute field must be declined.",
"declined_if" => "The :attribute field must be declined when :other is :value.",
"different" => "The :attribute field and :other must be different.",
"digits" => "The :attribute field must be :digits digits.",
"digits_between" => "The :attribute field must be between :min and :max digits.",
"dimensions" => "The :attribute field has invalid image dimensions.",
"distinct" => "The :attribute field has a duplicate value.",
"doesnt_end_with" => "The :attribute field must not end with one of the following: :values.",
"doesnt_start_with" => "The :attribute field must not start with one of the following: :values.",
"email" => "The :attribute field must be a valid email address.",
"ends_with" => "The :attribute field must end with one of the following: :values.",
"enum" => "The selected :attribute is invalid.",
"exists" => "The selected :attribute is invalid.",
"file" => "The :attribute field must be a file.",
"filled" => "The :attribute field must have a value.",
"gt" => [
"array" => "The :attribute field must have more than :value items.",
"file" => "The :attribute field must be greater than :value kilobytes.",
"numeric" => "The :attribute field must be greater than :value.",
"string" => "The :attribute field must be greater than :value characters.",
],
"gte" => [
"array" => "The :attribute field must have :value items or more.",
"file" => "The :attribute field must be greater than or equal to :value kilobytes.",
"numeric" => "The :attribute field must be greater than or equal to :value.",
"string" => "The :attribute field must be greater than or equal to :value characters.",
],
"image" => "The :attribute field must be an image.",
"in" => "The selected :attribute is invalid.",
"in_array" => "The :attribute field must exist in :other.",
"integer" => "The :attribute field must be an integer.",
"ip" => "The :attribute field must be a valid IP address.",
"ipv4" => "The :attribute field must be a valid IPv4 address.",
"ipv6" => "The :attribute field must be a valid IPv6 address.",
"json" => "The :attribute field must be a valid JSON string.",
"lowercase" => "The :attribute field must be lowercase.",
"lt" => [
"array" => "The :attribute field must have less than :value items.",
"file" => "The :attribute field must be less than :value kilobytes.",
"numeric" => "The :attribute field must be less than :value.",
"string" => "The :attribute field must be less than :value characters.",
],
"lte" => [
"array" => "The :attribute field must not have more than :value items.",
"file" => "The :attribute field must be less than or equal to :value kilobytes.",
"numeric" => "The :attribute field must be less than or equal to :value.",
"string" => "The :attribute field must be less than or equal to :value characters.",
],
"mac_address" => "The :attribute field must be a valid MAC address.",
"max" => [
"array" => "The :attribute field must not have more than :max items.",
"file" => "The :attribute field must not be greater than :max kilobytes.",
"numeric" => "The :attribute field must not be greater than :max.",
"string" => "The :attribute field must not be greater than :max characters.",
],
"max_digits" => "The :attribute field must not have more than :max digits.",
"mimes" => "The :attribute field must be a file of type: :values.",
"mimetypes" => "The :attribute field must be a file of type: :values.",
"min" => [
"array" => "The :attribute field must have at least :min items.",
"file" => "The :attribute field must be at least :min kilobytes.",
"numeric" => "The :attribute field must be at least :min.",
"string" => "The :attribute field must be at least :min characters.",
],
"min_digits" => "The :attribute field must have at least :min digits.",
"missing" => "The :attribute field must be missing.",
"missing_if" => "The :attribute field must be missing when :other is :value.",
"missing_unless" => "The :attribute field must be missing unless :other is :value.",
"missing_with" => "The :attribute field must be missing when :values is present.",
"missing_with_all" => "The :attribute field must be missing when :values are present.",
"multiple_of" => "The :attribute field must be a multiple of :value.",
"not_in" => "The selected :attribute is invalid.",
"not_regex" => "The :attribute field format is invalid.",
"numeric" => "The :attribute field must be a number.",
"password" => [
"letters" => "The :attribute field must contain at least one letter.",
"mixed" => "The :attribute field must contain at least one uppercase and one lowercase letter.",
"numbers" => "The :attribute field must contain at least one number.",
"symbols" => "The :attribute field must contain at least one symbol.",
"uncompromised" => "The given :attribute has appeared in a data leak. Please choose a different :attribute.",
],
"present" => "The :attribute field must be present.",
"prohibited" => "The :attribute field is prohibited.",
"prohibited_if" => "The :attribute field is prohibited when :other is :value.",
"prohibited_unless" => "The :attribute field is prohibited unless :other is in :values.",
"prohibits" => "The :attribute field prohibits :other from being present.",
"regex" => "The :attribute field format is invalid.",
"required" => "The :attribute field is required.",
"required_array_keys" => "The :attribute field must contain entries for: :values.",
"required_if" => "The :attribute field is required when :other is :value.",
"required_if_accepted" => "The :attribute field is required when :other is accepted.",
"required_unless" => "The :attribute field is required unless :other is in :values.",
"required_with" => "The :attribute field is required when :values is present.",
"required_with_all" => "The :attribute field is required when :values are present.",
"required_without" => "The :attribute field is required when :values is not present.",
"required_without_all" => "The :attribute field is required when none of :values are present.",
"same" => "The :attribute field must match :other.",
"size" => [
"array" => "The :attribute field must contain :size items.",
"file" => "The :attribute field must be :size kilobytes.",
"numeric" => "The :attribute field must be :size.",
"string" => "The :attribute field must be :size characters.",
],
"starts_with" => "The :attribute field must start with one of the following: :values.",
"string" => "The :attribute field must be a string.",
"timezone" => "The :attribute field must be a valid timezone.",
"unique" => "The :attribute has already been taken.",
"uploaded" => "The :attribute failed to upload.",
"uppercase" => "The :attribute field must be uppercase.",
"url" => "The :attribute field must be a valid URL.",
"ulid" => "The :attribute field must be a valid ULID.",
"uuid" => "The :attribute field must be a valid UUID.",
"custom" => [
"attribute-name" => [
"rule-name" => "custom-message",
],
],
"attributes" => [],
];
8 changes: 8 additions & 0 deletions lang/pl/pagination.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
<?php

declare(strict_types=1);

return [
"next" => "Następna",
"previous" => "Poprzednia",
];
Loading

0 comments on commit 2bbefb2

Please sign in to comment.