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 95% rename from app/Http/Controllers/SubjectController.php rename to app/Http/Controllers/BankTask/SubjectController.php index 51d6592..dca1fa2 100644 --- a/app/Http/Controllers/SubjectController.php +++ b/app/Http/Controllers/BankTask/SubjectController.php @@ -1,12 +1,13 @@ 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/StudentController.php b/app/Http/Controllers/Users/StudentController.php index 49c376b..ea70170 100644 --- a/app/Http/Controllers/Users/StudentController.php +++ b/app/Http/Controllers/Users/StudentController.php @@ -31,6 +31,18 @@ class StudentController extends Controller return response()->json($student, 200); } + /** + * Создание ученика + * + * @param StudentRequest $request + * @return JsonResponse + */ + /*public function store(StudentRequest $request) + { + $student = Student::creat($request->all()); + return response()->json($student, 200); + }*/ + /** * Обновление ученика * @@ -54,11 +66,7 @@ class StudentController extends Controller return response()->json(collect($student)->except('school_class'), 200); } - public function destroy(Student $student) - { - $user = $student->user; - $user->delete(); - return response()->json(null, 204); + public function getAnswers(Student $student) { + return AnswerToTask::where('student_id', '=', $student->id)->get(); } - } diff --git a/app/Http/Controllers/Users/TeacherController.php b/app/Http/Controllers/Users/TeacherController.php index 34c3cf7..5b61d62 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; @@ -89,4 +93,15 @@ class TeacherController extends Controller return response()->json($classes->unique()->values(), 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 78f5a3b..af11856 100644 --- a/app/Models/BankTaskFile.php +++ b/app/Models/BankTaskFile.php @@ -10,4 +10,8 @@ class BankTaskFile extends Model use HasFactory; 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 04c91bd..0b365f8 100644 --- a/app/Models/SchoolClass.php +++ b/app/Models/SchoolClass.php @@ -25,4 +25,9 @@ class SchoolClass extends Model return $this->belongsToMany(Subject::class, 'academic_plans', 'class_id') ->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 @@ +belongsTo(User::class); } + public function tasks(){ + return $this->hasMany(Task::class); + } } diff --git a/config/app.php b/config/app.php index cf85d7b..1c868c1 100644 --- a/config/app.php +++ b/config/app.php @@ -162,6 +162,7 @@ return [ Illuminate\Validation\ValidationServiceProvider::class, Illuminate\View\ViewServiceProvider::class, + /* * Package Service Providers... */ @@ -175,6 +176,7 @@ return [ App\Providers\EventServiceProvider::class, App\Providers\RouteServiceProvider::class, + ], /* 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'); + } +} diff --git a/routes/api.php b/routes/api.php index 3836536..8123299 100644 --- a/routes/api.php +++ b/routes/api.php @@ -13,12 +13,15 @@ Route::apiResource('headteachers', 'Users\HeadTeacherController'); Route::apiResource('teachers', 'Users\TeacherController'); Route::get('teacher/{teacher}/classes', 'Users\TeacherController@getClasses'); //получить классы у которых ведет учитель +Route::get('teacher/{teacher}/classes', 'Users\TeacherController@getClasses'); +Route::get('teacher/{teacher}/classes/{class}/uncheked-task', 'Users\TeacherController@getUncheckedTask'); Route::apiResource('students', 'Users\StudentController'); +Route::get('/student/{student}/answers', 'Users\StudentController@getAnswers'); Route::apiResource('parents', 'Users\ParenttController'); -Route::apiResource('subjects', 'SubjectController'); +Route::apiResource('subjects', 'BankTask\SubjectController'); Route::apiResource('classes', 'SchoolClassController'); Route::post('classes/{class}/teacher', 'SchoolClassController@addTeacher'); @@ -28,18 +31,21 @@ Route::get('classes/{class}/subjects', 'SchoolClassController@getSubjects'); // Route::apiResource('journal', 'JournalController'); -Route::apiResource('themes', 'ThemeController'); +Route::apiResource('themes', 'BankTask\ThemeController'); Route::apiResource('timetables', 'TimetableController'); -Route::get('banktasks', 'BankTaskController@index'); //получение списка всех заданий +Route::get('banktasks', 'BankTask\BankTaskController@index'); //получение списка всех заданий Route::group(['prefix' => 'banktask'], function () { - Route::post('', 'BankTaskController@store'); //создание задания - Route::get('{banktask}', 'BankTaskController@show'); //получение задания - Route::put('{banktask}', 'BankTaskController@update'); //обновление задания - Route::delete('{banktask}', 'BankTaskController@delete'); //удаление задания - Route::post('{banktask}/addfile', 'BankTaskFileController@store'); - Route::get('{banktask}/files', 'BankTaskFileController@showFiles'); + Route::post('', 'BankTask\BankTaskController@store'); //создание задания + Route::get('{banktask}', 'BankTask\BankTaskController@show'); //получение задания + Route::put('{banktask}', 'BankTask\BankTaskController@update'); //обновление задания + Route::delete('{banktask}', 'BankTask\BankTaskController@delete'); //удаление задания + Route::post('{banktask}/addfile', 'BankTask\BankTaskFileController@store'); + Route::get('{banktask}/files', 'BankTask\BankTaskFileController@showFiles'); + Route::get('/file/{file}/download', 'BankTask\BankTaskFileController@download'); + Route::delete('/file/{file}/delete', 'BankTask\BankTaskFileController@delete'); + Route::put('/file/{file}/update', 'BankTask\BankTaskFileController@update'); }); Route::get('/file/{file}/download', 'BankTaskFileController@download'); @@ -54,4 +60,22 @@ Route::group(['prefix' => 'news'], function () { Route::delete('/{news}', 'News\NewsController@delete'); Route::post('/{news}/addphoto', 'News\NewsFileController@store'); Route::delete('/photo/{file}', 'News\NewsFileController@delete'); -}); \ No newline at end of file +}); + +Route::group(['prefix' => 'task'], function () { + Route::post('', 'TaskController@store'); // Добавить таск + Route::get('', 'TaskController@index'); // Показать задания для класса (в запросе нужно указывать Id класса) + Route::get('/{task}', 'TaskController@show'); //Показать задание + Route::put('/{task}', 'TaskController@update'); // Обновить задание + Route::delete('/{task}', 'TaskController@delete'); // Удалить задание + Route::put('/answer/check/{answer}', 'TaskController@checkAnswer'); // Проверить ответ ученика + Route::post('/{task}/addanswer', 'AnswerToTaskController@store'); // Добавить ответ(для ученика) + Route::get('/{task}/student/{student}', 'AnswerToTaskController@show'); // Показать ответ ученика + Route::delete('/answer/{answer}', 'AnswerToTaskController@delete'); // Удалить ответ + Route::put('/answer/{answer}', 'AnswerToTaskController@update'); // Изменить ответ + Route::post('/{task}/addfile', 'TaskFileController@store'); // Добавить файл + Route::get('/{task}/files', 'TaskFileController@showFiles'); // Посмотреть файлы у таска(только файлы + // которые добавил учитель). + Route::get('/{task}/file/{file}', 'TaskFileController@download'); // Скачать файл + Route::delete('/file/{file}', 'TaskFileController@delete'); // Удалить файл +});