diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 7e40d73..1023a26 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,10 +2,27 @@ namespace App\Exceptions; +use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; +use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; class Handler extends ExceptionHandler { + + public function render($request, \Throwable $exception) + { + if ($exception instanceof ModelNotFoundException) { + return response()->json(['message' => 'Not Found'], 404); + } + + if ($exception instanceof MethodNotAllowedHttpException) { + return response()->json(['message' => 'Not Found'], 404); + } + + //return response()->json(['message' => $exception->getMessage()], 404); + return parent::render($request, $exception); + } + /** * A list of the exception types that are not reported. * diff --git a/app/Http/Controllers/LoginController.php b/app/Http/Controllers/Auth/LoginController.php similarity index 88% rename from app/Http/Controllers/LoginController.php rename to app/Http/Controllers/Auth/LoginController.php index 29bd5ef..4567da3 100644 --- a/app/Http/Controllers/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -1,9 +1,9 @@ newQuery(); + + if ($request->has('name')) { + $tasks->where('name', 'like', $request->input('name').'%'); + } + if ($request->has('subject_id')) { + $tasks->where('subject_id', $request->input('subject_id')); + } + if ($request->has('theme_id')) { + $tasks->where('theme_id', $request->input('theme_id')); + } + + if ($request->has('author')) { + $tasks->where('author', 'like', $request->input('author').'%'); + } + + if ($request->has('count')) { + $temp = (int)$request->count; + if ($temp>0 && $temp<= 100) { + $count = $temp; + } + } + + return response()->json($tasks->orderByDesc('updated_at')->paginate($count), 200); + } + + /** + * Получение задания + * + * @param BankTask $banktask + * @return JsonResponse + */ + public function show(BankTask $banktask) + { + + return response()->json([ + 'task' => $banktask, + 'files' => BankTaskFile::where('banktask_id', '=', $banktask->id )->get(['id','name', 'type', 'url']) + ], 200); + + } + + /** + * Создание задания + * + * @param BankTaskRequest $request + * @return JsonResponse + */ + public function store(BankTaskRequest $request) + { + if (!Subject::find((int)$request->input('subject_id')) ) { + return response()->json('Not exist subject', 404); + } + $banktask = BankTask::create($request->all()); //добавить auth()->user() после добавления регистрации + return response()->json($banktask, 200); + } + + /** + * Обновление задания + * + * @param Request $request + * @param BankTask $banktask + * @return JsonResponse + */ + public function update(BankTask $banktask, Request $request) + { + $request->validate([ + 'theme_id' => 'nullable|integer|gt:0', + 'subject_id' => 'integer|gt:0', + ]); + if ($request->has('subject_id') && !Subject::find((int)$request->input('subject_id'))) { + return response()->json('Not exist subject', 404); + } + $banktask->update($request->all()); + return response()->json($banktask, 200); + } + + /** + * Удаление задания + * + * @param BankTask $banktask + * @return JsonResponse + * @throws \Exception + */ + public function delete(BankTask $banktask) + { + $banktask->delete(); + return response()->json('', 204); + } + +} diff --git a/app/Http/Controllers/BankTaskFileController.php b/app/Http/Controllers/BankTaskFileController.php new file mode 100644 index 0000000..c4f5df6 --- /dev/null +++ b/app/Http/Controllers/BankTaskFileController.php @@ -0,0 +1,109 @@ +id; + $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 (Storage::putFileAs('public/banktask/' . $banktaskId . '/' . $type . '/', $file, $request->name)) { + BankTaskFile::create([ + 'name' => $request->name, + 'type' => $type, + 'extension' => $ext, + 'banktask_id' => $banktaskId, + 'url' => '/storage/banktask' . '/' . $banktaskId . '/' . $type . '/' . $request->name, $file, $request->name . $ext + ]); + return true; + } + return false; + } + + public function showFiles(BankTask $banktask) + { + + $banktaskId = $banktask->id; + $files = BankTaskFile::where('task_id', '=', $banktaskId)->get(); + + return response()->json($files, 200); + + } + + public function download(BankTaskFile $file) + { + return Storage::download('/public/banktask/' . $file->banktask_id . '/' . $file->type . '/' . $file->name); + } + + public function update(BankTaskFile $file, Request $request) + { + + $request->validate([ + 'name' => 'required' + ]); + $old_filename = '/public/banktask/' . $file->banktask_id . '/' . $file->type . '/' . $file->name; + $new_filename = '/public/banktask/' . $file->banktask_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/banktask/' . $file->banktask_id . '/' . $request->type . '/' . $file->name; + return response()->json([$file->save(), $file]); + } + } + + return response()->json(false, 404); + } + + public function delete(BankTaskFile $file) { + echo $file; + if (Storage::disk('local')->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()); + } + } + return response()->json(['BankTaskFile 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/SchoolClassController.php b/app/Http/Controllers/SchoolClassController.php index 3370f0b..bf498fe 100644 --- a/app/Http/Controllers/SchoolClassController.php +++ b/app/Http/Controllers/SchoolClassController.php @@ -5,7 +5,7 @@ namespace App\Http\Controllers; use App\Http\Requests\SchoolClassRequest; use App\Models\SchoolClass; use App\Models\Teacher; -use Illuminate\Http\JsonResponse; +use Illuminate\Database\QueryException; use Illuminate\Http\Request; class SchoolClassController extends Controller @@ -13,63 +13,50 @@ class SchoolClassController extends Controller /** * Получение списка всех классов * - * @return JsonResponse */ public function index() { return response()->json(SchoolClass::all(), 200); } - /** - * Получение класса - * - * @param SchoolClass $class - * @return JsonResponse - */ - public function show(SchoolClass $class) + public function show(SchoolClass $schoolClass) { - return response()->json($class, 200); + return response()->json($schoolClass, 200); } - /** - * @param SchoolClassRequest $request - * @return JsonResponse - */ public function store(SchoolClassRequest $request) { - $teacher = Teacher::find($request->get('teacher_id')); - if ($teacher) { - $schoolClass = $teacher->schoolClass()->create($request->all()); - } else { - $schoolClass = SchoolClass::create($request->all()); + try { + $class = SchoolClass::create($request->all()); + } catch (QueryException $e) { + return response()->json(['message' => 'Уже существует'], 400); } - return response()->json(SchoolClass::find($schoolClass->id), 201); + return response()->json(SchoolClass::find($class->id), 201); } - /** - * Обновление класса - * - * @param SchoolClassRequest $request - * @param SchoolClass $class - * @return JsonResponse - */ - public function update(SchoolClassRequest $request, SchoolClass $class) + public function update(SchoolClass $class, SchoolClassRequest $request) { - $class->update($request->all()); + try { + $class->update($request->all()); + } catch (QueryException $e) { + return response()->json(['message' => 'Уже существует'], 400); + } return response()->json($class, 200); } - - /** - * Удаление класса - * - * @param SchoolClass $class - * @return JsonResponse - * @throws \Exception - */ - public function delete(SchoolClass $class) + public function destroy(SchoolClass $class) { $class->delete(); - return response()->json('ok', 200); + return response()->json('', 204); } + + //добавление, изменение классного руководителя + public function addClassroomTeacher(SchoolClass $class, Request $request) + { + $teacher = Teacher::findOrfail((int)$request->input('teacher_id')); + $class->classroom_teacher = $teacher->id; + $class->save(); + return response()->json(SchoolClass::find($class->id), 200); + } + } diff --git a/app/Http/Controllers/StudentController.php b/app/Http/Controllers/StudentController.php deleted file mode 100644 index ab874da..0000000 --- a/app/Http/Controllers/StudentController.php +++ /dev/null @@ -1,46 +0,0 @@ -json(Student::all(), 200); - } - - /** - * Получение одного учителя - * - * @param Student $student - * @param StudentRequest $request - * @return JsonResponse - */ - public function show(Student $student, StudentRequest $request) - { - return response()->json($student, 200); - } - - /** - * Обновление учителя - * - * @param StudentRequest $request - * @param Student $student - * @return JsonResponse - */ - public function update(StudentRequest $request, Student $student) - { - $student->update($request->all()); - return response()->json($student, 200); - } -} diff --git a/app/Http/Controllers/SubjectController.php b/app/Http/Controllers/SubjectController.php new file mode 100644 index 0000000..e0e4ae0 --- /dev/null +++ b/app/Http/Controllers/SubjectController.php @@ -0,0 +1,73 @@ +json(Subject::all()->sortBy('name'), 200); + } + + /** + * Получение предмета + * + * @param Subject $subject + * @return JsonResponse + */ + public function show(Subject $subject) + { + return response()->json($subject, 200); + } + + /** + * Создание предмета + * + * @param SubjectRequest $request + * @return JsonResponse + */ + public function store(SubjectRequest $request) + { + $subject = Subject::create($request->all()); + return response()->json($subject, 200); + } + + /** + * Обновление предмета + * + * @param SubjectRequest $request + * @param Subject $subject + * @return JsonResponse + */ + public function update(Subject $subject, SubjectRequest $request) + { + $subject->update($request->all()); + return response()->json($subject, 200); + } + + /** + * Удаление предмета + * + * @param Subject $subject + * @return JsonResponse + * @throws \Exception + */ + public function destroy(Subject $subject) + { + $subject->delete(); + return response()->json('', 204); + + } +} + diff --git a/app/Http/Controllers/ThemeController.php b/app/Http/Controllers/ThemeController.php new file mode 100644 index 0000000..fffdb06 --- /dev/null +++ b/app/Http/Controllers/ThemeController.php @@ -0,0 +1,79 @@ +json(Theme::all()->sortBy($request->input('sort_by')), 200); + } + + /** + * Получение темы + * + * @param Theme $theme + * @return JsonResponse + */ + public function show(Theme $theme) + { + return response()->json($theme, 200); + } + + /** + * Создание темы + * + * @param ThemeRequest $request + * @return JsonResponse + */ + public function store(ThemeRequest $request) + { + $theme = Theme::create($request->all()); + return response()->json($theme, 200); + } + + /** + * Обновление темы + * + * @param Request $request + * @param Theme $theme + * @return JsonResponse + */ + public function update(Theme $theme, Request $request) + { + try { + $theme->update($request->all()); + } catch (QueryException $e) { + return response()->json('Value can not null', 400); + } + return response()->json($theme, 200); + } + + /** + * Удаление темы + * + * @param Theme $theme + * @return JsonResponse + * @throws \Exception + */ + public function destroy(Theme $theme) + { + $theme->delete(); + return response()->json('', 204); + + } +} diff --git a/app/Http/Controllers/HeadTeacherController.php b/app/Http/Controllers/Users/HeadTeacherController.php similarity index 72% rename from app/Http/Controllers/HeadTeacherController.php rename to app/Http/Controllers/Users/HeadTeacherController.php index de2766b..2304b86 100644 --- a/app/Http/Controllers/HeadTeacherController.php +++ b/app/Http/Controllers/Users/HeadTeacherController.php @@ -1,19 +1,21 @@ json(HeadTeacher::all(), 200); } @@ -22,6 +24,7 @@ class HeadTeacherController extends Controller * Получение одного завуча * * @param HeadTeacher $headteacher + * @param Request $request * @return JsonResponse */ public function show(HeadTeacher $headteacher) @@ -32,11 +35,11 @@ class HeadTeacherController extends Controller /** * Обновление завуча * - * @param HeadTeacherRequest $request + * @param Request $request * @param HeadTeacher $headteacher * @return JsonResponse */ - public function update(HeadTeacherRequest $request, HeadTeacher $headteacher) + public function update(Request $request, HeadTeacher $headteacher) { $headteacher->update($request->all()); return response()->json($headteacher, 200); diff --git a/app/Http/Controllers/ParenttController.php b/app/Http/Controllers/Users/ParenttController.php similarity index 68% rename from app/Http/Controllers/ParenttController.php rename to app/Http/Controllers/Users/ParenttController.php index 37aa6f3..75c25af 100644 --- a/app/Http/Controllers/ParenttController.php +++ b/app/Http/Controllers/Users/ParenttController.php @@ -1,19 +1,21 @@ json(Parentt::all(), 200); } @@ -21,7 +23,8 @@ class ParenttController extends Controller /** * Получение одного учителя * - * @param Parentt $parent + * @param Parentt $student + * @param Request $request * @return JsonResponse */ public function show(Parentt $parent) @@ -32,11 +35,11 @@ class ParenttController extends Controller /** * Обновление учителя * - * @param ParentRequest $request + * @param Request $request * @param Parentt $parent * @return JsonResponse */ - public function update(ParentRequest $request, Parentt $parent) + public function update(Request $request, Parentt $parent) { $parent->update($request->all()); return response()->json($parent, 200); diff --git a/app/Http/Controllers/Users/StudentController.php b/app/Http/Controllers/Users/StudentController.php new file mode 100644 index 0000000..e53a767 --- /dev/null +++ b/app/Http/Controllers/Users/StudentController.php @@ -0,0 +1,68 @@ +json(Student::all(), 200); + } + + /** + * Получение одного ученика + * + * @param Student $student + * @return JsonResponse + */ + public function show(Student $student) + { + 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); + }*/ + + /** + * Обновление ученика + * + * @param StudentRequest $request + * @param Student $student + * @return JsonResponse + */ + public function update(StudentRequest $request, Student $student) + { + $prev_class = $student->schoolClass; + if ($prev_class) { + $prev_class->count_students -= 1; + $prev_class->save(); + } + + $new_class = SchoolClass::findOrfail((int)$request->input('class_id')); + $student->update($request->all()); + + $new_class->count_students++; + $new_class->save(); + return response()->json(collect($student)->except('school_class'), 200); + } +} diff --git a/app/Http/Controllers/TeacherController.php b/app/Http/Controllers/Users/TeacherController.php similarity index 68% rename from app/Http/Controllers/TeacherController.php rename to app/Http/Controllers/Users/TeacherController.php index 139ff3c..fdb8222 100644 --- a/app/Http/Controllers/TeacherController.php +++ b/app/Http/Controllers/Users/TeacherController.php @@ -1,9 +1,8 @@ json(Teacher::all(), 200); } @@ -25,10 +24,10 @@ class TeacherController extends Controller * Получение одного учителя * * @param Teacher $teacher - * @param TeacherRequest $request + * @param Request $request * @return JsonResponse */ - public function show(Teacher $teacher) + public function show(Teacher $teacher, Request $request) { return response()->json($teacher, 200); } @@ -36,11 +35,11 @@ class TeacherController extends Controller /** * Обновление учителя * - * @param TeacherRequest $request + * @param Request $request * @param Teacher $teacher * @return JsonResponse */ - public function update(TeacherRequest $request, Teacher $teacher) + public function update(Request $request, Teacher $teacher) { $teacher->update($request->all()); return response()->json($teacher, 200); diff --git a/app/Http/Requests/BankTaskRequest.php b/app/Http/Requests/BankTaskRequest.php new file mode 100644 index 0000000..3f007ee --- /dev/null +++ b/app/Http/Requests/BankTaskRequest.php @@ -0,0 +1,24 @@ + 'required', + 'author' => 'required|max:128', + 'short_description' => 'required', + 'theme_id' => 'nullable|integer|gt:0', + 'subject_id' => 'required|integer|gt:0' + ]; + } +} diff --git a/app/Http/Requests/SchoolClassRequest.php b/app/Http/Requests/SchoolClassRequest.php index 3f85ae0..14984fb 100644 --- a/app/Http/Requests/SchoolClassRequest.php +++ b/app/Http/Requests/SchoolClassRequest.php @@ -2,8 +2,6 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; - class SchoolClassRequest extends ApiFormRequest { /** @@ -13,11 +11,12 @@ class SchoolClassRequest extends ApiFormRequest */ public function rules() { + return [ 'number' => 'required|integer|between:1,11', - 'letter' => 'required|max:1', - 'count_students' => 'required|integer', + 'letter' => 'required|max:1|regex:/[а-я]/', 'profile' => 'required', ]; } + } diff --git a/app/Http/Requests/StudentRequest.php b/app/Http/Requests/StudentRequest.php index abdaf1c..4b3dc0c 100644 --- a/app/Http/Requests/StudentRequest.php +++ b/app/Http/Requests/StudentRequest.php @@ -2,9 +2,7 @@ namespace App\Http\Requests; -use Illuminate\Foundation\Http\FormRequest; - -class StudentRequest extends FormRequest +class StudentRequest extends ApiFormRequest { /** * Get the validation rules that apply to the request. @@ -14,9 +12,7 @@ class StudentRequest extends FormRequest public function rules() { return [ - 'date_of_birth' => 'date_format:Y/m/d|before:today|after:1900-01-01', - 'phone_number' => 'regex:/^\+?7\d{10}$/', - 'class_id' => 'integer|gt:0', + 'class_id' => 'required|integer|gt:0', ]; } } diff --git a/app/Http/Requests/HeadTeacherRequest.php b/app/Http/Requests/SubjectRequest.php similarity index 53% rename from app/Http/Requests/HeadTeacherRequest.php rename to app/Http/Requests/SubjectRequest.php index 2de39be..a01680b 100644 --- a/app/Http/Requests/HeadTeacherRequest.php +++ b/app/Http/Requests/SubjectRequest.php @@ -2,7 +2,8 @@ namespace App\Http\Requests; -class HeadTeacherRequest extends ApiFormRequest + +class SubjectRequest extends ApiFormRequest { /** * Get the validation rules that apply to the request. @@ -12,8 +13,7 @@ class HeadTeacherRequest extends ApiFormRequest public function rules() { return [ - 'date_of_birth' => 'date_format:Y/m/d|before:today|after:1900-01-01', - 'phone_number' => 'regex:/^\+?7\d{10}$/', + 'name' => 'required|unique:subjects', ]; } } diff --git a/app/Http/Requests/TeacherRequest.php b/app/Http/Requests/TeacherRequest.php deleted file mode 100644 index 9cd4b69..0000000 --- a/app/Http/Requests/TeacherRequest.php +++ /dev/null @@ -1,21 +0,0 @@ - 'date_format:Y/m/d|before:today|after:1900-01-01', - 'phone_number' => 'regex:/^\+?7\d{10}$/', - ]; - } -} diff --git a/app/Http/Requests/ParentRequest.php b/app/Http/Requests/ThemeRequest.php similarity index 59% rename from app/Http/Requests/ParentRequest.php rename to app/Http/Requests/ThemeRequest.php index 57de06b..ed88c4a 100644 --- a/app/Http/Requests/ParentRequest.php +++ b/app/Http/Requests/ThemeRequest.php @@ -4,8 +4,9 @@ namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; -class ParentRequest extends FormRequest +class ThemeRequest extends ApiFormRequest { + /** * Get the validation rules that apply to the request. * @@ -14,8 +15,8 @@ class ParentRequest extends FormRequest public function rules() { return [ - 'date_of_birth' => 'date_format:Y/m/d|before:today|after:1900-01-01', - 'phone_number' => 'regex:/^\+?7\d{10}$/', + 'name' => 'required', + 'variant' => 'required', ]; } } diff --git a/app/Models/BankTask.php b/app/Models/BankTask.php new file mode 100644 index 0000000..2e4edf8 --- /dev/null +++ b/app/Models/BankTask.php @@ -0,0 +1,31 @@ +belongsTo(User::class); + } + + public function subject() + { + return $this->belongsTo(Subject::class); + } + + public function theme() + { + return $this->belongsTo(Theme::class); + } + +} diff --git a/app/Models/BankTaskFile.php b/app/Models/BankTaskFile.php new file mode 100644 index 0000000..7e47209 --- /dev/null +++ b/app/Models/BankTaskFile.php @@ -0,0 +1,13 @@ +belongsTo(Teacher::class, 'classroom_teacher'); + return $this->hasMany(Student::class); } } diff --git a/app/Models/Student.php b/app/Models/Student.php index 9776e99..c17be35 100644 --- a/app/Models/Student.php +++ b/app/Models/Student.php @@ -10,7 +10,14 @@ class Student extends Model { use HasFactory; - protected $fillable = [ + protected $guarded = [ 'user_id', + 'updated_at', ]; + + public function schoolClass() + { + return $this->belongsTo(SchoolClass::class, 'class_id'); + } + } diff --git a/app/Models/Subject.php b/app/Models/Subject.php new file mode 100644 index 0000000..3adfcaf --- /dev/null +++ b/app/Models/Subject.php @@ -0,0 +1,20 @@ +hasMany(BankTask::class); + } +} diff --git a/app/Models/Teacher.php b/app/Models/Teacher.php index bb97f5c..f629890 100644 --- a/app/Models/Teacher.php +++ b/app/Models/Teacher.php @@ -10,7 +10,7 @@ class Teacher extends Model { use HasFactory; - protected $fillable = [ + protected $guarded = [ 'user_id', ]; @@ -18,4 +18,5 @@ class Teacher extends Model { return $this->hasOne(SchoolClass::class, 'classroom_teacher'); } + } diff --git a/app/Models/Theme.php b/app/Models/Theme.php new file mode 100644 index 0000000..b4c7a45 --- /dev/null +++ b/app/Models/Theme.php @@ -0,0 +1,21 @@ +hasMany(BankTask::class); + } +} diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index ee8ca5b..07f5be9 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -4,6 +4,7 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; + class AppServiceProvider extends ServiceProvider { /** @@ -23,6 +24,6 @@ class AppServiceProvider extends ServiceProvider */ public function boot() { - // + } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php index 3787ee3..4283423 100644 --- a/app/Providers/RouteServiceProvider.php +++ b/app/Providers/RouteServiceProvider.php @@ -38,7 +38,8 @@ class RouteServiceProvider extends ServiceProvider $this->configureRateLimiting(); $this->routes(function () { - Route::middleware('api') + Route::prefix('/api') + ->middleware('api') ->namespace($this->namespace) ->group(base_path('routes/api.php')); diff --git a/config/app.php b/config/app.php index 8409e00..cf85d7b 100644 --- a/config/app.php +++ b/config/app.php @@ -204,7 +204,7 @@ return [ 'DB' => Illuminate\Support\Facades\DB::class, 'Eloquent' => Illuminate\Database\Eloquent\Model::class, 'Event' => Illuminate\Support\Facades\Event::class, - 'File' => Illuminate\Support\Facades\File::class, + 'BankTaskFile' => Illuminate\Support\Facades\File::class, 'Gate' => Illuminate\Support\Facades\Gate::class, 'Hash' => Illuminate\Support\Facades\Hash::class, 'Http' => Illuminate\Support\Facades\Http::class, diff --git a/config/filesystems.php b/config/filesystems.php index 94c8112..764a98d 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -46,6 +46,16 @@ return [ 'local' => [ 'driver' => 'local', 'root' => storage_path('app'), + 'permissions' => [ + 'file' => [ + 'public' => 0664, + 'private' => 0600, + ], + 'dir' => [ + 'public' => 0775, + 'private' => 0600, + ] + ] ], 'public' => [ @@ -53,6 +63,16 @@ return [ 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', + 'permissions' => [ + 'file' => [ + 'public' => 0664, + 'private' => 0600, + ], + 'dir' => [ + 'public' => 0775, + 'private' => 0600, + ] + ] ], 's3' => [ diff --git a/config/session.php b/config/session.php index 4e0f66c..b728db8 100644 --- a/config/session.php +++ b/config/session.php @@ -50,7 +50,7 @@ return [ /* |-------------------------------------------------------------------------- - | Session File Location + | Session BankTaskFile Location |-------------------------------------------------------------------------- | | When using the native session driver, we need a location where session diff --git a/database/migrations/2020_11_17_152940_create_teachers_table.php b/database/migrations/2020_11_17_152940_create_teachers_table.php index 18dfa94..b5bf90e 100644 --- a/database/migrations/2020_11_17_152940_create_teachers_table.php +++ b/database/migrations/2020_11_17_152940_create_teachers_table.php @@ -17,15 +17,11 @@ class CreateTeachersTable extends Migration $table->id(); $table->unsignedBigInteger('user_id'); $table->string('photo')->nullable(); - $table->string('first_name')->nullable(); - $table->string('second_name')->nullable(); - $table->string('middle_name')->nullable(); - $table->date('date_of_birth')->nullable(); - $table->string('phone_number')->nullable(); - $table->string('address')->nullable(); - $table->string('passport')->nullable(); - $table->string('qualification')->nullable(); - $table->unsignedTinyInteger('experience')->nullable(); + $table->string('name')->nullable(); + $table->string('surname')->nullable(); + $table->string('patronymic')->nullable(); + $table->string('specialization')->nullable(); + $table->string('information_about_me')->nullable(); $table->timestamps(); $table->foreign('user_id') diff --git a/database/migrations/2020_11_17_153838_create_school_classes_table.php b/database/migrations/2020_11_17_153838_create_school_classes_table.php index fb1ba10..ebf126b 100644 --- a/database/migrations/2020_11_17_153838_create_school_classes_table.php +++ b/database/migrations/2020_11_17_153838_create_school_classes_table.php @@ -17,7 +17,7 @@ class CreateSchoolClassesTable extends Migration $table->id(); $table->unsignedTinyInteger('number'); $table->string('letter', 1); - $table->unsignedTinyInteger('count_students'); + $table->unsignedTinyInteger('count_students')->default(0); $table->string('profile'); $table->unsignedInteger('classroom_teacher')->nullable(); $table->timestamps(); @@ -25,6 +25,8 @@ class CreateSchoolClassesTable extends Migration $table->foreign('classroom_teacher') ->references('id')->on('teachers') ->onDelete('set null'); + + $table->unique(['number', 'letter']); }); } diff --git a/database/migrations/2020_11_17_162258_create_parents_table.php b/database/migrations/2020_11_17_162258_create_parents_table.php index dca3d97..00929a0 100644 --- a/database/migrations/2020_11_17_162258_create_parents_table.php +++ b/database/migrations/2020_11_17_162258_create_parents_table.php @@ -17,15 +17,10 @@ class CreateParentsTable extends Migration $table->id(); $table->unsignedBigInteger('user_id'); $table->string('photo')->nullable(); - $table->string('first_name')->nullable(); - $table->string('second_name')->nullable(); - $table->string('middle_name')->nullable(); - $table->date('date_of_birth')->nullable(); - $table->string('phone_number')->nullable(); - $table->string('address')->nullable(); - $table->string('passport')->nullable(); - $table->string('place_of_work')->nullable(); - $table->string('position_at_work')->nullable(); + $table->string('name')->nullable(); + $table->string('surname')->nullable(); + $table->string('patronymic')->nullable(); + $table->string('information_about_me')->nullable(); $table->timestamps(); $table->foreign('user_id') diff --git a/database/migrations/2020_11_17_164043_create_students_table.php b/database/migrations/2020_11_17_164043_create_students_table.php index 75b50b1..21ec48e 100644 --- a/database/migrations/2020_11_17_164043_create_students_table.php +++ b/database/migrations/2020_11_17_164043_create_students_table.php @@ -17,14 +17,11 @@ class CreateStudentsTable extends Migration $table->id(); $table->unsignedBigInteger('user_id'); $table->string('photo')->nullable(); - $table->string('first_name')->nullable(); - $table->string('second_name')->nullable(); - $table->string('middle_name')->nullable(); - $table->date('date_of_birth')->nullable(); - $table->string('phone_number')->nullable(); - $table->string('address')->nullable(); - $table->string('passport_or_certificate')->nullable(); - $table->unsignedBigInteger('class_id')->nullable(); + $table->string('name')->nullable(); + $table->string('surname')->nullable(); + $table->string('patronymic')->nullable(); + $table->unsignedInteger('class_id')->nullable(); + $table->string('information_about_me')->nullable(); $table->timestamps(); $table->foreign('user_id') diff --git a/database/migrations/2020_11_17_171010_create_head_teachers_table.php b/database/migrations/2020_11_17_171010_create_head_teachers_table.php index c74845a..f85304c 100644 --- a/database/migrations/2020_11_17_171010_create_head_teachers_table.php +++ b/database/migrations/2020_11_17_171010_create_head_teachers_table.php @@ -17,14 +17,10 @@ class CreateHeadTeachersTable extends Migration $table->id(); $table->unsignedBigInteger('user_id'); $table->string('photo')->nullable(); - $table->string('first_name')->nullable(); - $table->string('second_name')->nullable(); - $table->string('middle_name')->nullable(); - $table->date('date_of_birth')->nullable(); - $table->string('phone_number')->nullable(); - $table->string('address')->nullable(); - $table->string('passport')->nullable(); - $table->string('activity')->nullable(); + $table->string('name')->nullable(); + $table->string('surname')->nullable(); + $table->string('patronymic')->nullable(); + $table->string('information_about_me')->nullable(); $table->unsignedTinyInteger('experience')->nullable(); $table->timestamps(); diff --git a/database/migrations/2020_12_03_103635_create_themes_table.php b/database/migrations/2020_12_03_103635_create_themes_table.php new file mode 100644 index 0000000..1fe60fb --- /dev/null +++ b/database/migrations/2020_12_03_103635_create_themes_table.php @@ -0,0 +1,33 @@ +id(); + $table->string('name'); + $table->string('variant'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('themes'); + } +} diff --git a/database/migrations/2020_12_03_103729_create_subjects_table.php b/database/migrations/2020_12_03_103729_create_subjects_table.php new file mode 100644 index 0000000..79ef06e --- /dev/null +++ b/database/migrations/2020_12_03_103729_create_subjects_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('name')->unique(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('subjects'); + } +} diff --git a/database/migrations/2020_12_03_104018_create_bank_tasks_table.php b/database/migrations/2020_12_03_104018_create_bank_tasks_table.php new file mode 100644 index 0000000..f77d89c --- /dev/null +++ b/database/migrations/2020_12_03_104018_create_bank_tasks_table.php @@ -0,0 +1,47 @@ +id(); + $table->string('name'); + $table->string('short_description'); + $table->text('description')->nullable(); + $table->string('author', 128)->nullable(); + $table->unsignedInteger('theme_id')->nullable(); + $table->unsignedInteger('subject_id'); + $table->timestamps(); + + + + $table->foreign('theme_id') + ->references('id')->on('themes') + ->onDelete('cascade'); + + $table->foreign('subject_id') + ->references('id')->on('subjects') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('bank_tasks'); + } +} diff --git a/database/migrations/2020_12_03_104028_create_bank_task_files_table.php b/database/migrations/2020_12_03_104028_create_bank_task_files_table.php new file mode 100644 index 0000000..a87b324 --- /dev/null +++ b/database/migrations/2020_12_03_104028_create_bank_task_files_table.php @@ -0,0 +1,40 @@ +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'); + + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('bank_tasks_files'); + } +} diff --git a/routes/api.php b/routes/api.php index f6b62a2..55e6193 100644 --- a/routes/api.php +++ b/routes/api.php @@ -2,96 +2,38 @@ use Illuminate\Support\Facades\Route; -/* -|-------------------------------------------------------------------------- -| API Routes -|-------------------------------------------------------------------------- -| -| Here is where you can register API routes for your application. These -| routes are loaded by the RouteServiceProvider within a group which -| is assigned the "api" middleware group. Enjoy building your API! -| -*/ Route::group(['prefix' => 'auth'], function () { - Route::post('register', 'RegisterController'); - Route::post('login', 'LoginController'); - Route::post('logout', 'LogoutController'); + Route::post('register', 'Auth\RegisterController'); + Route::post('login', 'Auth\LoginController'); + Route::post('logout', 'Auth\LogoutController'); }); -Route::group(['prefix' => 'users'], function () { - Route::group(['prefix' => 'headteachers'], function () { - Route::get('', 'HeadTeacherController@index'); //получение списка всех завучей - Route::get('{headteacher}', 'HeadTeacherController@show'); //получение завуча - Route::put('{headteacher}', 'HeadTeacherController@update') - ->middleware('role:headteacher'); //обновление завуча - }); +Route::apiResource('headteachers', 'Users\HeadTeacherController'); - Route::group(['prefix' => 'teachers'], function () { - Route::get('', 'TeacherController@index'); //получение списка всех учителей - Route::get('{teacher}', 'TeacherController@show'); //получение учителя - Route::put('{teacher}', 'TeacherController@update') - ->middleware(['role:headteacher|teacher']); //обновление учителя - }); +Route::apiResource('teachers', 'Users\TeacherController'); - Route::group(['prefix' => 'students'], function () { - Route::get('', 'StudentController@index'); //получение списка всех учеников - Route::get('{student}', 'StudentController@show'); //получение ученика - Route::put('{student}', 'StudentController@update') - ->middleware(['role:headteacher|teacher|student']); //обновление ученика - }); +Route::apiResource('students', 'Users\StudentController'); - Route::group(['prefix' => 'parents'], function () { - Route::get('', 'ParenttController@index'); //получение списка всех родителей - Route::get('{parent}', 'ParenttController@show'); //получение родителя - Route::put('{parent}', 'ParenttController@update') - ->middleware(['role:headteacher|teacher|parent']); //обновление родителя - }); +Route::apiResource('parents', 'Users\ParenttController'); + +Route::apiResource('subjects', 'SubjectController'); + +Route::apiResource('classes', 'SchoolClassController'); +Route::post('classes/{class}/teacher', 'SchoolClassController@addClassroomTeacher'); + +Route::apiResource('themes', 'ThemeController'); + +Route::get('banktasks', '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::group(['prefix' => 'classes', 'middleware' => 'role:headteacher'], function () { - Route::get('', 'SchoolClassController@index'); //получение списка всех классов - Route::get('{schoolClass}', 'SchoolClassController@show'); //получение класса - Route::post('', 'SchoolClassController@store'); //создание класса - Route::put('{schoolClass}', 'SchoolClassController@update'); //обновление класса -}); - -Route::group(['prefix' => 'tasks', 'middleware' => 'role:headteacher|teacher'], function () { - Route::get('', 'TaskController@allTasks'); // Просмотреть все задания(неоптимизированно) - Route::get('{task}', 'TaskController@showTask'); // Посмотреть задание {id} - Route::post('', 'TaskController@createTask'); // Добавить новое задание - Route::put('task}', 'TaskController@editTask'); // Изменить задание {id} - Route::delete('{task}', 'TaskController@deleteTask'); // Удалить задание {id} -}); - - -//Route::get('headteachers', 'HeadTeacherController@index'); //получение списка всех завучей -//Route::group(['prefix' => 'profile/headteacher'], function () { -// Route::get('{headteacher}', 'HeadTeacherController@show'); //получение завуча -// Route::put('{headteacher}', 'HeadTeacherController@update'); //обновление завуча -//}); -// -//Route::get('teachers', 'TeacherController@index'); //получение списка всех учителей -//Route::group(['prefix' => 'profile/teacher'], function () { -// Route::get('{teacher}', 'TeacherController@show'); //получение учителя -// Route::put('{teacher}', 'TeacherController@update'); //обновление учителя -//}); -// -//Route::get('students', 'StudentController@index'); //получение списка всех завучей -//Route::group(['prefix' => 'profile/student'], function () { -// Route::get('{student}', 'StudentController@show'); //получение завуча -// Route::put('{student}', 'StudentController@update'); //обновление завуча -//}); -// -//Route::get('parents', 'ParenttController@index'); //получение списка всех родителей -//Route::group(['prefix' => 'profile/parent'], function () { -// Route::get('{parent}', 'ParenttController@show'); //получение родителя -// Route::put('{parent}', 'ParenttController@update'); //обновление родителя -//}); -// -//Route::get('classes', 'SchoolClassController@index'); //получение списка всех классов -//Route::group(['prefix' => 'class'], function () { -// Route::post('', 'SchoolClassController@store'); //создание класса -// Route::get('{schoolClass}', 'SchoolClassController@show'); //получение класса -// Route::put('{schoolClass}', 'SchoolClassController@update'); //обновление класса -//}); +Route::get('/file/{file}/download', 'BankTaskFileController@download'); +Route::delete('/file/{file}/delete', 'BankTaskFileController@delete'); +Route::put('/file/{file}/update', 'BankTaskFileController@update');