diff --git a/app/Http/Controllers/AnswerToTaskController.php b/app/Http/Controllers/AnswerToTaskController.php new file mode 100644 index 0000000..5b32528 --- /dev/null +++ b/app/Http/Controllers/AnswerToTaskController.php @@ -0,0 +1,70 @@ +all(); + + + $answer = AnswerToTask::create($input+ ['task_id' => $task->id, + 'student_id' => 1]); + return response()->json($answer, 201); + + } + + public function show(Task $task, Student $student) { + $name = BankTask::find($task->banktask_id)->name; + + $answer = AnswerToTask::where([ + ['student_id', '=', $student->id], + ['task_id', '=', $task->id] + ])->get(); + $answer->name = $name; + $answer->deadline = $task->deadline; + $studentFile = TaskFile::where([ + ['user_id', '=', '2'], // Auth::id() + ['task_id', '=', $task->id], + ['review', '=', 0] + ]) + ->get(['id','name', 'type', 'url']); + $teacherFile = TaskFile::where([ + ['user_id', '=', '2'], // Auth::id() + ['task_id', '=', $task->id], + ['review', '=', 1] + ]) + ->get(['id','name', 'type', 'url']); + + return response()->json([ + 'answer' => $answer, + 'files' => [ + 'student' => $studentFile, + 'teacher' => $teacherFile + ] + ],200); + } + + public function delete(AnswerToTask $answer){ + $answer->delete(); + + return response()->json(true, 204); + } + + public function update(AnswerToTask $answer, Request $request) { + $answer->description = $request->input('description'); + $answer->save(); + + return $answer; + + } + +} diff --git a/app/Http/Controllers/BankTaskController.php b/app/Http/Controllers/BankTask/BankTaskController.php similarity index 93% rename from app/Http/Controllers/BankTaskController.php rename to app/Http/Controllers/BankTask/BankTaskController.php index a6fbf34..a7534ac 100644 --- a/app/Http/Controllers/BankTaskController.php +++ b/app/Http/Controllers/BankTask/BankTaskController.php @@ -1,6 +1,6 @@ newQuery(); if ($request->has('name')) { - $tasks->where('name', 'like', $request->input('name').'%'); + $tasks->where('name', 'ilike', $request->input('name').'%'); } if ($request->has('subject_id')) { $tasks->where('subject_id', $request->input('subject_id')); @@ -37,7 +38,7 @@ class BankTaskController extends Controller } if ($request->has('author')) { - $tasks->where('author', 'like', $request->input('author').'%'); + $tasks->where('author', 'ilike', $request->input('author').'%'); } if ($request->has('count')) { diff --git a/app/Http/Controllers/BankTaskFileController.php b/app/Http/Controllers/BankTask/BankTaskFileController.php similarity index 97% rename from app/Http/Controllers/BankTaskFileController.php rename to app/Http/Controllers/BankTask/BankTaskFileController.php index c4f5df6..0324a7b 100644 --- a/app/Http/Controllers/BankTaskFileController.php +++ b/app/Http/Controllers/BankTask/BankTaskFileController.php @@ -1,12 +1,13 @@ exists('/public/banktask/' . $file->banktask_id . '/' . $file->type . '/' . $file->name )) { if (Storage::disk('local')->delete('/public/banktask/' . $file->banktask_id . '/' . $file->type . '/' . $file->name)) { return response()->json($file->delete()); diff --git a/app/Http/Controllers/SubjectController.php b/app/Http/Controllers/BankTask/SubjectController.php similarity index 91% rename from app/Http/Controllers/SubjectController.php rename to app/Http/Controllers/BankTask/SubjectController.php index e0e4ae0..dca1fa2 100644 --- a/app/Http/Controllers/SubjectController.php +++ b/app/Http/Controllers/BankTask/SubjectController.php @@ -1,12 +1,13 @@ json(Subject::all()->sortBy('name'), 200); + return response()->json(Subject::all(), 200); } /** diff --git a/app/Http/Controllers/ThemeController.php b/app/Http/Controllers/BankTask/ThemeController.php similarity index 92% rename from app/Http/Controllers/ThemeController.php rename to app/Http/Controllers/BankTask/ThemeController.php index fffdb06..518e87c 100644 --- a/app/Http/Controllers/ThemeController.php +++ b/app/Http/Controllers/BankTask/ThemeController.php @@ -1,6 +1,6 @@ json(Theme::all()->sortBy($request->input('sort_by')), 200); + return response()->json(Theme::all(), 200); } /** diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index a5299a1..698f44b 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -2,60 +2,115 @@ namespace App\Http\Controllers; +use App\Models\AnswerToTask; +use App\Models\BankTask; +use App\Models\SchoolClass; +use App\Models\Student; +use App\Models\User; use Illuminate\Http\Request; use App\Models\Task; +use App\Http\Requests\TaskRequest; +use App\Models\TaskHistory; +use Illuminate\Support\Facades\Auth; +use App\Models\TaskFile; +use App\Models\Teacher; class TaskController extends Controller + { - public function createTask(Request $request) - { + public function index(Request $request) { + $tasks = Task::where('class_id', '=', $request->class_id)->get()->sortBy('deadline'); + $temp = []; + foreach ($tasks as $task) { + + $task->banktask->subject; + array_push($temp, collect($task)->except( + 'banktask.id', + 'banktask.description', + 'banktask.short_description', + 'banktask.theme_id', + 'banktask.created_at', + 'banktask.updated_at', + 'banktask.author', + 'banktask.subject.created_at', + 'banktask.subject.updated_at', + 'banktask.subject_id' + )); + + + } + + return response()->json($temp , 200); + } + + public function store(TaskRequest $request) { + $teacherId = 1; // Auth()->id(); + $banktaskName = BankTask::find($request->banktask_id)->name; + $banktaskSubject = BankTask::find($request->banktask_id)->subject_id; + $newTask = Task::create($request->all() + ['teacher_id' => $teacherId + ]); + + + return response()->json($newTask, 201); + } + +// public function addbanktask(Task $task, Request $request) { +// $temp = new TaskHistory(); +// $temp->task_id = $task->id; +// $temp->banktask_id = $request->input('banktask_id'); // Баг - можно впихнуть 2 одинаковых задания из банка задач в один таск +// +// $temp->save(); +// +// return response()->json($temp, 201); +// } + + public function show(Task $task) { + $userId = Teacher::find($task->teacher_id)->user_id; + + $file = TaskFile::where('task_id', '=', $task->id)->get(['id', 'name', 'type', 'url', 'user_id']); + return response()->json([ + $task, + 'files' => $file, + + + + ], 200); + } + + public function delete(Task $task) { + $task->delete(); + + return response()->json(true, 200); + } + + public function update(Task $task, Request $request) { $request->validate([ - 'name' => 'required|min:5|max:100', - 'subject_id' => 'required' + 'banktask_id' => 'required|exists:bank_tasks,id', ]); + $task->update($request->all()); - $add_new = new Task; - $add_new->name = $request->input('name'); - $add_new->description = $request->input('description'); - $add_new->subject_id = $request->input('subject_id'); - $add_new->path_to_task = $request->input('path_to_task'); - $add_new->save(); - - return Task::findOrFail($add_new->id); - - } - - public function index() - { - return Task::all(); // Здесь наверное лучше выводить только задания по конкретному предмету - // Добавить сортировку - } - - public function showTask($taskId) - { - return Task::where('id', '=', $taskId)->get(); - } - - public function editTask(Task $task, Request $request) - { - $request->validate([ - 'name' => 'required|min:5:max:100', - 'subject_id' => 'required' - ]); - - $task->name = $request->input('name'); - $task->description = $request->input('description'); - $task->path_to_task = $request->input('path_to_task'); $task->save(); return Task::where('id', '=', $task->id)->get(); } - public function deleteTask(Task $task) - { - $task->delete(); + public function checkAnswer(AnswerToTask $answer, Request $request) { + $request->validate([ + 'mark' => 'required|numeric' + ]); - return 'Task №' . $task->id . ' has been deleted'; + $answer->comment_by_teacher = $request->input('comment_by_teacher'); + $answer->mark = $request->input('mark'); + $answer->checked = 1; + + $answer->save(); + + + + + return response()->json($answer, 200); } -} + + +} \ No newline at end of file diff --git a/app/Http/Controllers/TaskFileController.php b/app/Http/Controllers/TaskFileController.php new file mode 100644 index 0000000..642efe6 --- /dev/null +++ b/app/Http/Controllers/TaskFileController.php @@ -0,0 +1,127 @@ +id; + $studentId = 1; + $max_size = (int)ini_get('upload_max_filesize') * 1000; + $all_ext = implode(',', $this->allExtensions()); + $this->validate($request, [ + 'name' => 'required', + 'file' => 'required|file|mimes:' . $all_ext . '|max:' . $max_size + ]); + + $file = $request->file('file'); + $ext = $file->getClientOriginalExtension(); + $type = $this->getType($ext); + + if ($request->has('by_teacher') && $request->by_teacher == 1) { // auth()->user()->role_id == 2 + $pathToFile = 'public/task/' . $taskId . '/student/' . $studentId . '/review/' . $type . '/'; + $path = '/storage/task' . '/' . $taskId . '/student/'. $studentId . '/review/' . $type . '/' . $request->name; + $review = 1; + } elseif (true) { + $pathToFile = 'public/task/' . $taskId . '/student/' . $studentId . '/' . $type . '/'; + $path = '/storage/task' . '/' . $taskId . '/student/'. $studentId . '/' . $type . '/' . $request->name; + $review = 0; + } + + + if (Storage::putFileAs($pathToFile, $file, $request->name)) { + TaskFile::create( + [ + 'name' => $request->name, + 'type' => $type, + 'extension' => $ext, + 'task_id' => $taskId, + 'url' => $path, + 'user_id' => 2, + 'review' => $review, + $file, + $request->name . $ext + ] + ); + return response()->json($request->by_teacher, 201); + } + return response()->json(false, 422); + } + + public function showFiles(Task $task) + { + + $taskId = $task->id; + $files = TaskFile::where('task_id', '=', $taskId)->get(); + + return response()->json($files, 200); + + } + +// public function download(TaskFile $file) +// { +// return Storage::download('/public/task/' . $file->task_id . '/' . $file->type . '/' . $file->name); +// } + +// public function update(TaskFile $file, Request $request) Бесполезная функция +// { +// +// $request->validate([ +// 'name' => 'required' +// ]); +// $old_filename = '/public/task/' . $file->task_id . '/' . $file->type . '/' . $file->name; +// $new_filename = '/public/task/' . $file->task_id . '/' . $file->type . '/' . $request->name; +// +// if (Storage::disk('local')->exists($old_filename)) { +// if (Storage::disk('local')->move($old_filename, $new_filename)) { +// $file->name = $request->name; +// $file->url = '/storage/task/' . $file->task_id . '/' . $request->type . '/' . $file->name; +// return response()->json([$file->save(), $file]); +// } +// } +// +// return response()->json(false, 404); +// } + + public function delete(TaskFile $file) { + $studentId = Student::where('user_id', '=', $file->user_id)->get()->id; + if (Storage::disk('local')->exists('/public/task/' . $file->task_id . '/student/' . $studentId . $file->type . '/' . $file->name)) { + if (Storage::disk('local')->delete('/public/task/' . $file->task_id . '/student/' . $studentId . $file->type . '/' . $file->name)) { + return response()->json($file->delete()); + } + } + return response()->json(['Not found'], 404); + } + + + private function getType($ext) + { + if (in_array(strtolower($ext), $this->image_ext)) { + return 'image'; + } + + if (in_array(strtolower($ext), $this->file_ext)) { + return 'file'; + } + } + + private function allExtensions() + { + return array_merge($this->image_ext, $this->file_ext); + } + + + +} diff --git a/app/Http/Controllers/Users/TeacherController.php b/app/Http/Controllers/Users/TeacherController.php index 6fb9525..81a3205 100644 --- a/app/Http/Controllers/Users/TeacherController.php +++ b/app/Http/Controllers/Users/TeacherController.php @@ -3,6 +3,10 @@ namespace App\Http\Controllers\Users; use App\Http\Controllers\Controller; +use App\Models\AnswerToTask; +use App\Models\SchoolClass; +use App\Models\Student; +use App\Models\Task; use App\Models\Teacher; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -73,4 +77,15 @@ class TeacherController extends Controller } return response()->json(collect($classes)->unique(), 200); } + + public function getUncheckedTask(Teacher $teacher, SchoolClass $class) { + + $temp = []; + $tasks = $teacher->tasks->where('class_id', '=', $class->id); + foreach ($tasks as $task) { + $answers = Task::find($task->id)->answers->where('checked', '=', false); + array_push($temp, $answers); + } + return response()->json($temp, 200); + } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index 7d7d84d..1ba307f 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -15,12 +15,13 @@ class Kernel extends HttpKernel */ protected $middleware = [ // \App\Http\Middleware\TrustHosts::class, - \App\Http\Middleware\TrustProxies::class, \Fruitcake\Cors\HandleCors::class, + \App\Http\Middleware\TrustProxies::class, \App\Http\Middleware\PreventRequestsDuringMaintenance::class, \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class, \App\Http\Middleware\TrimStrings::class, \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class, + ]; /** diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index 0c13b85..b0ccbd4 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -12,6 +12,6 @@ class VerifyCsrfToken extends Middleware * @var array */ protected $except = [ - // + 'api/*' ]; } diff --git a/app/Http/Requests/TaskRequest.php b/app/Http/Requests/TaskRequest.php new file mode 100644 index 0000000..352bb6c --- /dev/null +++ b/app/Http/Requests/TaskRequest.php @@ -0,0 +1,27 @@ + 'required|exists:bank_tasks,id', + 'deadline' => 'required' + + ]; + } +} diff --git a/app/Models/AnswerToTask.php b/app/Models/AnswerToTask.php new file mode 100644 index 0000000..50c1f31 --- /dev/null +++ b/app/Models/AnswerToTask.php @@ -0,0 +1,15 @@ +belongsTo(Theme::class); } + public function tasks() { + return $this->hasMany(Task::class); + } + + } diff --git a/app/Models/BankTaskFile.php b/app/Models/BankTaskFile.php index 7e47209..af11856 100644 --- a/app/Models/BankTaskFile.php +++ b/app/Models/BankTaskFile.php @@ -8,6 +8,10 @@ use Illuminate\Database\Eloquent\Model; class BankTaskFile extends Model { use HasFactory; - protected $table = 'bank_tasks_files'; + protected $table = 'bank_task_files'; protected $fillable = ['name', 'type', 'extension', 'url', 'banktask_id']; + + public function task() { + $this->belongsTo(Task::class); + } } diff --git a/app/Models/SchoolClass.php b/app/Models/SchoolClass.php index 4944ec6..0b365f8 100644 --- a/app/Models/SchoolClass.php +++ b/app/Models/SchoolClass.php @@ -26,4 +26,8 @@ class SchoolClass extends Model ->withPivot('hours_per_week', 'hours_per_year'); } + public function tasks() { + return $this->hasMany(Task::class, 'class_id'); + } + } diff --git a/app/Models/Task.php b/app/Models/Task.php index 9252b54..2704c68 100644 --- a/app/Models/Task.php +++ b/app/Models/Task.php @@ -8,6 +8,26 @@ use Illuminate\Database\Eloquent\Model; class Task extends Model { use HasFactory; + protected $fillable = ['banktask_id', 'deadline', 'teacher_id', 'class_id']; + + public function banktask() { + return $this->belongsTo(BankTask::class); + } + + public function teacher(){ + return $this->belongsTo(Teacher::class); + } + + public function class() { + return $this->belongsTo(SchoolClass::class); + } + + public function tasks() { + return $this->hasMany(Task::class); + } + + public function answers() { + return $this->hasMany(AnswerToTask::class); + } - protected $table = 'tasks'; } diff --git a/app/Models/TaskFile.php b/app/Models/TaskFile.php new file mode 100644 index 0000000..a713247 --- /dev/null +++ b/app/Models/TaskFile.php @@ -0,0 +1,14 @@ +bigIncrements('id'); $table->string('name'); $table->string('type'); $table->string('extension'); $table->string('url', 400); + $table->timestamps(); $table->unsignedInteger('banktask_id'); $table->foreign('banktask_id') ->references('id')->on('bank_tasks') - ->onDelete('no action'); + ->onDelete('cascade')->onUpdate('no action'); }); } diff --git a/database/migrations/2020_12_03_172010_create_tasks_table.php b/database/migrations/2020_12_03_172010_create_tasks_table.php new file mode 100644 index 0000000..602ab57 --- /dev/null +++ b/database/migrations/2020_12_03_172010_create_tasks_table.php @@ -0,0 +1,43 @@ +id(); + $table->unsignedInteger('banktask_id'); + $table->timestamp('deadline')->nullable(); + $table->unsignedInteger('teacher_id')->nullable(); + $table->unsignedInteger('class_id')->nullable(); + $table->timestamps(); + + $table->foreign('banktask_id')->references('id')->on('bank_tasks') + ->onDelete('set null'); + +// $table->foreign('class_id')->references('id')->on('school_classes') +// ->onDelete('cascade'); +// $table->foreign('teacher_id')->references('id')->on('teachers') +// ->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('tasks'); + } +} diff --git a/database/migrations/2020_12_07_120455_create_answers_to_task_table.php b/database/migrations/2020_12_07_120455_create_answers_to_task_table.php new file mode 100644 index 0000000..fe0b6fb --- /dev/null +++ b/database/migrations/2020_12_07_120455_create_answers_to_task_table.php @@ -0,0 +1,42 @@ +id(); + $table->text('description')->nullable(); + $table->smallInteger('mark')->nullable(); + $table->text('comment_by_teacher')->nullable(); + $table->boolean('checked')->default('0'); + $table->unsignedInteger('task_id'); + $table->unsignedInteger('student_id'); + $table->boolean('review')->default('0'); + $table->timestamps(); + + $table->foreign('task_id')->references('id')->on('tasks') + ->onDelete('set null'); + $table->foreign('student_id')->references('id')->on('students'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('answers_to_task'); + } +} diff --git a/database/migrations/2020_12_08_122859_create_task_files_table.php b/database/migrations/2020_12_08_122859_create_task_files_table.php new file mode 100644 index 0000000..5ff4916 --- /dev/null +++ b/database/migrations/2020_12_08_122859_create_task_files_table.php @@ -0,0 +1,42 @@ +bigIncrements('id'); + $table->string('name'); + $table->string('type'); + $table->string('extension'); + $table->string('url', 400); + $table->timestamps(); + $table->unsignedInteger('task_id'); + $table->unsignedInteger('user_id'); + + $table->foreign('task_id')->references('id')->on('tasks') + ->onDelete('cascade'); + $table->foreign('user_id')->references('id')->on('users') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('task_files'); + } +}