From e5ef214753fe75d3d4b3b45cddc83a5c3e84ebe8 Mon Sep 17 00:00:00 2001 From: Rokas Puzonas Date: Sun, 29 Oct 2023 21:41:27 +0200 Subject: [PATCH] add tests --- app/Http/Controllers/QuestionController.php | 91 +++++++++++++++++++ app/Http/Controllers/TestController.php | 83 +++++++++++++++++ app/Models/Question.php | 24 +++++ app/Models/Test.php | 27 ++++++ app/Models/User.php | 5 + config/database.php | 40 -------- .../2023_10_29_153809_create_tests_table.php | 29 ++++++ ...23_10_29_172100_create_questions_table.php | 31 +++++++ database/seeders/DatabaseSeeder.php | 27 ++++-- lang/lt.json | 4 +- resources/views/layouts/navigation.blade.php | 10 ++ resources/views/profile/edit.blade.php | 10 +- resources/views/questions/edit.blade.php | 26 ++++++ resources/views/tests/edit.blade.php | 83 +++++++++++++++++ resources/views/tests/index.blade.php | 50 ++++++++++ resources/views/users/index.blade.php | 2 - routes/web.php | 10 ++ 17 files changed, 498 insertions(+), 54 deletions(-) create mode 100644 app/Http/Controllers/QuestionController.php create mode 100644 app/Http/Controllers/TestController.php create mode 100644 app/Models/Question.php create mode 100644 app/Models/Test.php create mode 100644 database/migrations/2023_10_29_153809_create_tests_table.php create mode 100644 database/migrations/2023_10_29_172100_create_questions_table.php create mode 100644 resources/views/questions/edit.blade.php create mode 100644 resources/views/tests/edit.blade.php create mode 100644 resources/views/tests/index.blade.php diff --git a/app/Http/Controllers/QuestionController.php b/app/Http/Controllers/QuestionController.php new file mode 100644 index 0000000..56f281c --- /dev/null +++ b/app/Http/Controllers/QuestionController.php @@ -0,0 +1,91 @@ +validate([ + "question" => "required|string", + "answer" => "required|string", + "points" => "required|integer|min:1", + "test_id" => "required|integer", + ]); + + Question::create($validated); + + return redirect(route("tests.edit", [ + "test" => Test::where("id", $validated["test_id"])->first() + ])); + } + + /** + * Display the specified resource. + */ + public function show(Question $question) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Question $question) + { + return view("questions.edit", [ + "question" => $question, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Question $question) + { + $validated = $request->validate([ + "question" => "required|string", + "answer" => "required|string", + "points" => "required|integer|min:1" + ]); + + $question->update($validated); + + return view("tests.edit", [ + "test" => $validated["test_id"] + ]); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Question $question) + { + $question->delete(); + + return redirect(route("tests.edit", $question->test_id)); + } +} diff --git a/app/Http/Controllers/TestController.php b/app/Http/Controllers/TestController.php new file mode 100644 index 0000000..0bdfb42 --- /dev/null +++ b/app/Http/Controllers/TestController.php @@ -0,0 +1,83 @@ + $request->user()->tests()->get() + ]); + } + + /** + * Show the form for creating a new resource. + */ + public function create() + { + // + } + + /** + * Store a newly created resource in storage. + */ + public function store(Request $request) + { + $validated = $request->validate([ + "name" => "required|string" + ]); + + $request->user()->tests()->create($validated); + + return redirect(route("tests.index")); + } + + /** + * Display the specified resource. + */ + public function show(Test $test) + { + // + } + + /** + * Show the form for editing the specified resource. + */ + public function edit(Test $test) + { + return view("tests.edit", [ + "test" => $test, + ]); + } + + /** + * Update the specified resource in storage. + */ + public function update(Request $request, Test $test) + { + $validated = $request->validate([ + "name" => "required|string" + ]); + + $test->update($validated); + + return redirect(route("tests.index")); + } + + /** + * Remove the specified resource from storage. + */ + public function destroy(Test $test) + { + $test->delete(); + + return redirect(route("tests.index")); + } +} diff --git a/app/Models/Question.php b/app/Models/Question.php new file mode 100644 index 0000000..4272b65 --- /dev/null +++ b/app/Models/Question.php @@ -0,0 +1,24 @@ +belongsTo(Test::class); + } +} diff --git a/app/Models/Test.php b/app/Models/Test.php new file mode 100644 index 0000000..fcf6412 --- /dev/null +++ b/app/Models/Test.php @@ -0,0 +1,27 @@ +belongsTo(User::class); + } + + public function questions(): HasMany + { + return $this->hasMany(Question::class); + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 20bbd33..d35a2be 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -49,4 +49,9 @@ class User extends Authenticatable { return $this->hasMany(Chirp::class); } + + public function tests(): HasMany + { + return $this->hasMany(Test::class); + } } diff --git a/config/database.php b/config/database.php index 137ad18..be92f0e 100644 --- a/config/database.php +++ b/config/database.php @@ -108,44 +108,4 @@ return [ 'migrations' => 'migrations', - /* - |-------------------------------------------------------------------------- - | Redis Databases - |-------------------------------------------------------------------------- - | - | Redis is an open source, fast, and advanced key-value store that also - | provides a richer body of commands than a typical key-value system - | such as APC or Memcached. Laravel makes it easy to dig right in. - | - */ - - 'redis' => [ - - 'client' => env('REDIS_CLIENT', 'phpredis'), - - 'options' => [ - 'cluster' => env('REDIS_CLUSTER', 'redis'), - 'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'), - ], - - 'default' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_DB', '0'), - ], - - 'cache' => [ - 'url' => env('REDIS_URL'), - 'host' => env('REDIS_HOST', '127.0.0.1'), - 'username' => env('REDIS_USERNAME'), - 'password' => env('REDIS_PASSWORD'), - 'port' => env('REDIS_PORT', '6379'), - 'database' => env('REDIS_CACHE_DB', '1'), - ], - - ], - ]; diff --git a/database/migrations/2023_10_29_153809_create_tests_table.php b/database/migrations/2023_10_29_153809_create_tests_table.php new file mode 100644 index 0000000..d280bbf --- /dev/null +++ b/database/migrations/2023_10_29_153809_create_tests_table.php @@ -0,0 +1,29 @@ +id(); + $table->foreignId("user_id")->references("id")->on("users")->constrained()->cascadeOnDelete(); + $table->string("name"); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('tests'); + } +}; diff --git a/database/migrations/2023_10_29_172100_create_questions_table.php b/database/migrations/2023_10_29_172100_create_questions_table.php new file mode 100644 index 0000000..6f98c70 --- /dev/null +++ b/database/migrations/2023_10_29_172100_create_questions_table.php @@ -0,0 +1,31 @@ +id(); + $table->foreignId("test_id")->references("id")->on("tests")->constrained()->cascadeOnDelete(); + $table->string("question"); + $table->string("answer"); + $table->unsignedInteger("points")->default(1); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('questions'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a9f4519..9b3a803 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -3,7 +3,10 @@ namespace Database\Seeders; // use Illuminate\Database\Console\Seeds\WithoutModelEvents; + +use App\Models\User; use Illuminate\Database\Seeder; +use Illuminate\Support\Facades\Hash; class DatabaseSeeder extends Seeder { @@ -12,11 +15,23 @@ class DatabaseSeeder extends Seeder */ public function run(): void { - // \App\Models\User::factory(10)->create(); - - // \App\Models\User::factory()->create([ - // 'name' => 'Test User', - // 'email' => 'test@example.com', - // ]); + User::create([ + 'name' => "admin", + 'email' => "admin@admin", + 'password' => Hash::make("admin"), + 'role' => "admin" + ]); + User::create([ + 'name' => "Bob teacher", + 'email' => "bob@teacher", + 'password' => Hash::make("bob"), + 'role' => "teacher" + ]); + User::create([ + 'name' => "Alice student", + 'email' => "alice@student", + 'password' => Hash::make("alice"), + 'role' => "student" + ]); } } diff --git a/lang/lt.json b/lang/lt.json index 8d2f144..1a05c1b 100644 --- a/lang/lt.json +++ b/lang/lt.json @@ -13,5 +13,7 @@ "Edit": "Atnaujinti", "Delete": "Ištrinti", "Save": "Saugoti", - "Cancel": "Atšaukti" + "Cancel": "Atšaukti", + "Create test": "Sukurti testą", + "Tests": "Testai" } diff --git a/resources/views/layouts/navigation.blade.php b/resources/views/layouts/navigation.blade.php index 3a9dd81..21537f4 100644 --- a/resources/views/layouts/navigation.blade.php +++ b/resources/views/layouts/navigation.blade.php @@ -23,6 +23,11 @@ {{ __('Users') }} @endif + @if (Auth::user()->role == "teacher") + + {{ __('Tests') }} + + @endif @@ -86,6 +91,11 @@ {{ __('Users') }} @endif + @if (Auth::user()->role == "teacher") + + {{ __('Tests') }} + + @endif diff --git a/resources/views/profile/edit.blade.php b/resources/views/profile/edit.blade.php index e0e1d38..b27a21a 100644 --- a/resources/views/profile/edit.blade.php +++ b/resources/views/profile/edit.blade.php @@ -19,11 +19,11 @@ -
-
- @include('profile.partials.delete-user-form') -
-
+ {{--
--}} + {{--
--}} + {{-- @include('profile.partials.delete-user-form') --}} + {{--
--}} + {{--
--}} diff --git a/resources/views/questions/edit.blade.php b/resources/views/questions/edit.blade.php new file mode 100644 index 0000000..5723c20 --- /dev/null +++ b/resources/views/questions/edit.blade.php @@ -0,0 +1,26 @@ + +
+
+ @csrf + @method("patch") +
+ {{ __("Question") }} + + + + {{ __("Answer") }} + + + + {{ __("Points") }} + + +
+ +
+ {{ __("Save") }} + {{ __("Cancel") }} +
+
+
+
diff --git a/resources/views/tests/edit.blade.php b/resources/views/tests/edit.blade.php new file mode 100644 index 0000000..8945987 --- /dev/null +++ b/resources/views/tests/edit.blade.php @@ -0,0 +1,83 @@ + +
+
+ @csrf + @method("patch") +
+ {{ __("Name") }} + + +
+ +
+ {{ __("Save") }} + {{ __("Cancel") }} +
+
+ +
+ +
+ @csrf +
+ + + {{ __("Question") }} + + + + {{ __("Answer") }} + + + + {{ __("Points") }} + + +
+ +
+ {{ __("Add question") }} +
+
+ + + + + + + + + + @foreach ($test->questions()->get() as $question) + + + + + + + @endforeach +
{{ __("Question") }}{{ __("Answer") }}{{ __("Points") }}
{{ $question->question }}{{ $question->answer }}{{ $question->points }} + + + + + + + {{ __("Edit") }} + +
+ @csrf + @method("delete") + + {{ __("Delete") }} + +
+
+
+
+
+
diff --git a/resources/views/tests/index.blade.php b/resources/views/tests/index.blade.php new file mode 100644 index 0000000..a7a3881 --- /dev/null +++ b/resources/views/tests/index.blade.php @@ -0,0 +1,50 @@ + +
+
+ @csrf +
+ {{ __("Name") }} + + +
+ + {{ __('Create test') }} +
+ + + + + + + + @foreach ($tests as $test) + + + + + @endforeach +
{{ __("Name") }}
{{ $test->name }} + + + + + + + {{ __("Edit") }} + +
+ @csrf + @method("delete") + + {{ __("Delete") }} + +
+
+
+
+
+
diff --git a/resources/views/users/index.blade.php b/resources/views/users/index.blade.php index 03daec3..d587a3b 100644 --- a/resources/views/users/index.blade.php +++ b/resources/views/users/index.blade.php @@ -8,7 +8,6 @@ - {{--
--}} @@ -50,6 +49,5 @@ @endforeach
{{ __("Name") }}
- {{--
--}} diff --git a/routes/web.php b/routes/web.php index e4d007f..c32d51e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -2,6 +2,8 @@ use App\Http\Controllers\ChirpController; use App\Http\Controllers\ProfileController; +use App\Http\Controllers\QuestionController; +use App\Http\Controllers\TestController; use App\Http\Controllers\UserController; use Illuminate\Support\Facades\Route; @@ -38,4 +40,12 @@ Route::resource("users", UserController::class) ->only(["index", "store", "edit", "update", "destroy"]) ->middleware(["auth", "verified"]); +Route::resource("tests", TestController::class) + ->only(["index", "store", "edit", "update", "destroy"]) + ->middleware(["auth", "verified"]); + +Route::resource("questions", QuestionController::class) + ->only(["index", "store", "edit", "update", "destroy"]) + ->middleware(["auth", "verified"]); + require __DIR__.'/auth.php';