From 045a767774fa2e30310ac3ceb7961a6e6a917bb7 Mon Sep 17 00:00:00 2001 From: nikden13 Date: Wed, 16 Dec 2020 03:13:20 +0700 Subject: [PATCH 1/3] auth --- app/Exceptions/Handler.php | 6 ++ app/Http/Controllers/Auth/LoginController.php | 12 ++-- .../Controllers/Auth/LogoutController.php | 4 +- .../Controllers/Auth/RegisterController.php | 18 ++--- app/Http/Controllers/ChatLinkController.php | 65 +++++++++++++++++++ app/Http/Controllers/TimetableController.php | 5 +- app/Http/Middleware/Authenticate.php | 6 +- app/Http/Middleware/Role.php | 2 +- app/Http/Requests/Auth/RegisterRequest.php | 3 +- app/Http/Requests/Auth/UserRequest.php | 1 - app/Http/Requests/ChatLinkRequest.php | 22 +++++++ app/Models/ChatLink.php | 29 +++++++++ app/Models/HeadTeacher.php | 1 + app/Models/Parentt.php | 1 + app/Models/SchoolClass.php | 6 ++ app/Models/Teacher.php | 1 + app/Models/User.php | 28 ++++++-- app/Providers/AuthServiceProvider.php | 2 +- composer.json | 3 +- composer.lock | 22 ++----- ...0_12_15_185412_create_chat_links_table.php | 42 ++++++++++++ routes/api.php | 6 +- 22 files changed, 231 insertions(+), 54 deletions(-) create mode 100644 app/Http/Controllers/ChatLinkController.php create mode 100644 app/Http/Requests/ChatLinkRequest.php create mode 100644 app/Models/ChatLink.php create mode 100644 database/migrations/2020_12_15_185412_create_chat_links_table.php diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 1023a26..98d614e 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -2,6 +2,7 @@ namespace App\Exceptions; +use Illuminate\Auth\AuthenticationException; use Illuminate\Database\Eloquent\ModelNotFoundException; use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler; use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException; @@ -23,6 +24,11 @@ class Handler extends ExceptionHandler return parent::render($request, $exception); } + protected function unauthenticated($request, AuthenticationException $exception) + { + return response()->json(['message' => 'Unauthenticated'], 401); + } + /** * A list of the exception types that are not reported. * diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 4567da3..fce0ae8 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Http\Requests\Auth\LoginRequest; +use Carbon\Carbon; class LoginController extends Controller { @@ -11,14 +12,13 @@ class LoginController extends Controller { $credentials = $request->only('login', 'password'); - if (auth()->attempt($credentials)) + if (!auth()->attempt($credentials)) return response()->json('You cannot sign with those credentials!', 401); - $token = auth()->user()->makeToken($request->get('remember_me')); + $token = auth()->user()->createToken(config('app.name')); + $token->token->expires_at = (bool)$request->get('remember_me') ? Carbon::now()->addMonth() : Carbon::now()->addDay(); + $token->token->save(); - return response()->json([ - 'token_type' => 'Bearer', - 'token' => $token->accessToken, - ], 200); + return response()->json(['access_token' => $token->accessToken], 200); } } diff --git a/app/Http/Controllers/Auth/LogoutController.php b/app/Http/Controllers/Auth/LogoutController.php index 23184ad..6819a57 100644 --- a/app/Http/Controllers/Auth/LogoutController.php +++ b/app/Http/Controllers/Auth/LogoutController.php @@ -9,8 +9,8 @@ class LogoutController extends Controller { public function __invoke(Request $request) { - $request->user()->token()->revoke(); + auth()->user()->token()->revoke(); - return response()->json('ok', 200); + return response()->json(['message' => 'You are logged out'], 200); } } diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 732a46c..25b1da2 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -16,10 +16,10 @@ class RegisterController extends Controller { public function __invoke(RegisterRequest $request) { - $role = Role::where('name', $request->get('role')); + $role = Role::where('name', $request->get('role'))->get(); if ($role->isEmpty()) - return response()->json('Role not found', 404); + return response()->json(['message'=>'Role not found'], 404); $user = User::create(array_merge( $request->only('login', 'class_id'), @@ -29,29 +29,25 @@ class RegisterController extends Controller ] )); - $user_id = [ - 'user_id' => $user->id, - ]; - switch($request->get('role')) { case 'headteacher': - HeadTeacher::create($user_id); + $user->headteacher()->create(); break; case 'teacher': - Teacher::create($user_id); + $user->teacher()->create(); break; case 'student': - Student::create($user_id); + $user->student()->create(); break; case 'parent': - Parentt::create($user_id); + $user->parent()->create(); break; } - return response()->json('ok', 200); + return response()->json(null, 201); } } diff --git a/app/Http/Controllers/ChatLinkController.php b/app/Http/Controllers/ChatLinkController.php new file mode 100644 index 0000000..952c55f --- /dev/null +++ b/app/Http/Controllers/ChatLinkController.php @@ -0,0 +1,65 @@ +user()->role->name) + { + case 'student': + $links = ChatLink::all()->where('class_id', auth()->user()->class_id); + break; + + case 'teacher': + case 'headteacher': + $links = auth()->user()->chatLinks; + break; + + case 'parent': + $links = []; + break; + } + + return response()->json($links, 200); + } + + //Создание ссылки + public function store(ChatLinkRequest $request) + { + try { + $link = auth()->user()->create($request->all()); + } catch (QueryException $e) { + return response()->json(['message'=>'Class not found'], 404); + } + + return response()->json($link, 201); + } + + //Обновление ссылки + public function update(ChatLink $link, ChatLinkRequest $request) + { + try { + $link->update($request->all()); + } catch (QueryException $e) { + return response()->json(['message'=>'Class not found'], 404); + } + + return response()->json($link, 200); + } + + //Удаление ссылки + public function destroy(ChatLink $link) + { + $link->delete(); + return response()->json(null, 204); + + } + +} diff --git a/app/Http/Controllers/TimetableController.php b/app/Http/Controllers/TimetableController.php index 439af2c..73073bf 100644 --- a/app/Http/Controllers/TimetableController.php +++ b/app/Http/Controllers/TimetableController.php @@ -45,9 +45,8 @@ class TimetableController extends Controller 'class' => $class, ]); } - $dateTimetables = []; - if (!$filterTimetables->isEmpty()) { + //if (!$filterTimetables->isEmpty()) { for ($i = 0; $i < 6; $i++) { $date = Carbon::parse($request->input('date')) ->startOfWeek() @@ -55,7 +54,7 @@ class TimetableController extends Controller ->format('Y-m-d'); array_push($dateTimetables, [$date => $filterTimetables->where('date', $date)->values()]); } - } + //} return response()->json($dateTimetables, 200); } diff --git a/app/Http/Middleware/Authenticate.php b/app/Http/Middleware/Authenticate.php index 704089a..a66b72f 100644 --- a/app/Http/Middleware/Authenticate.php +++ b/app/Http/Middleware/Authenticate.php @@ -14,8 +14,8 @@ class Authenticate extends Middleware */ protected function redirectTo($request) { - if (! $request->expectsJson()) { - return route('login'); - } + //if (! $request->expectsJson()) { + // return route('login'); + //} } } diff --git a/app/Http/Middleware/Role.php b/app/Http/Middleware/Role.php index 655644e..ea1680b 100644 --- a/app/Http/Middleware/Role.php +++ b/app/Http/Middleware/Role.php @@ -22,7 +22,7 @@ class Role $roles = explode($this->delimetr, $roles); if (!auth()->user()->hasRole($roles)) { - return response()->json('',404); + return response()->json(null,404); } return $next($request); } diff --git a/app/Http/Requests/Auth/RegisterRequest.php b/app/Http/Requests/Auth/RegisterRequest.php index cd60fd9..f65d374 100644 --- a/app/Http/Requests/Auth/RegisterRequest.php +++ b/app/Http/Requests/Auth/RegisterRequest.php @@ -16,7 +16,8 @@ class RegisterRequest extends UserRequest { return [ 'role' => 'required|string', - 'class_id' => 'required|integer|gt:0', + 'class_id' => 'integer|gt:0', + 'login' => 'required|unique:users' ]; } } diff --git a/app/Http/Requests/Auth/UserRequest.php b/app/Http/Requests/Auth/UserRequest.php index c7692b7..4fe3cad 100644 --- a/app/Http/Requests/Auth/UserRequest.php +++ b/app/Http/Requests/Auth/UserRequest.php @@ -18,7 +18,6 @@ abstract class UserRequest extends ApiFormRequest public function rules() { return array_merge([ - 'login' => 'required|string', 'password' => 'required|string|min:6', ], $this->specific()); } diff --git a/app/Http/Requests/ChatLinkRequest.php b/app/Http/Requests/ChatLinkRequest.php new file mode 100644 index 0000000..6a1cc97 --- /dev/null +++ b/app/Http/Requests/ChatLinkRequest.php @@ -0,0 +1,22 @@ + 'required', + 'link' => 'required', + 'class_id' => 'required|integer|gt:0', + ]; + } +} diff --git a/app/Models/ChatLink.php b/app/Models/ChatLink.php new file mode 100644 index 0000000..fc3e6a9 --- /dev/null +++ b/app/Models/ChatLink.php @@ -0,0 +1,29 @@ +belongsTo(SchoolClass::class, 'class_id'); + } + + public function creator() + { + return $this->hasMany(User::class, 'creator'); + } + + +} diff --git a/app/Models/HeadTeacher.php b/app/Models/HeadTeacher.php index 013c51b..8f05d99 100644 --- a/app/Models/HeadTeacher.php +++ b/app/Models/HeadTeacher.php @@ -11,6 +11,7 @@ class HeadTeacher extends Model protected $guarded = [ 'user_id', + 'updated_at', ]; public function user() diff --git a/app/Models/Parentt.php b/app/Models/Parentt.php index 013aa8a..5645a09 100644 --- a/app/Models/Parentt.php +++ b/app/Models/Parentt.php @@ -12,6 +12,7 @@ class Parentt extends Model protected $guarded = [ 'user_id', + 'updated_at', ]; public function user() diff --git a/app/Models/SchoolClass.php b/app/Models/SchoolClass.php index 4944ec6..3bebf6a 100644 --- a/app/Models/SchoolClass.php +++ b/app/Models/SchoolClass.php @@ -26,4 +26,10 @@ class SchoolClass extends Model ->withPivot('hours_per_week', 'hours_per_year'); } + public function chatLinks() + { + return $this->hasMany(ChatLink::class, 'class_id'); + } + + } diff --git a/app/Models/Teacher.php b/app/Models/Teacher.php index d6bfe4d..3b3c445 100644 --- a/app/Models/Teacher.php +++ b/app/Models/Teacher.php @@ -12,6 +12,7 @@ class Teacher extends Model protected $guarded = [ 'user_id', + 'updated_at', ]; public function schoolClass() diff --git a/app/Models/User.php b/app/Models/User.php index cb3c6d9..2605b9e 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -6,10 +6,11 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; use Carbon\Carbon; +use Laravel\Passport\HasApiTokens; class User extends Authenticatable { - use HasFactory, Notifiable; + use HasFactory, Notifiable, HasApiTokens; /** * The attributes that are mass assignable. @@ -41,7 +42,7 @@ class User extends Authenticatable { foreach ($roles as $role) { - if ($this->role->contains('name', $role)) + if ($this->role->name == $role) return true; } @@ -58,11 +59,24 @@ class User extends Authenticatable return $this->hasOne(HeadTeacher::class); } - public function makeToken(bool $remember) + public function teacher() { - $token = $this->createToken(config('app.name')); - $token->token->expires_at = $remember ? Carbon::now()->addMonth() : Carbon::now()->addDay(); - $token->token->save(); - return $token; + return $this->hasOne(Teacher::class); } + + public function student() + { + return $this->hasOne(Student::class); + } + + public function parent() + { + return $this->hasOne(Parentt::class); + } + + public function chatLinks() + { + return $this->hasMany(ChatLink::class, 'creator'); + } + } diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index f31a7fb..f7ec0a6 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -14,7 +14,7 @@ class AuthServiceProvider extends ServiceProvider * @var array */ protected $policies = [ - // 'App\Models\Model' => 'App\Policies\ModelPolicy', + 'App\Models\Model' => 'App\Policies\ModelPolicy', ]; /** diff --git a/composer.json b/composer.json index 9e62841..a534a8a 100644 --- a/composer.json +++ b/composer.json @@ -14,7 +14,8 @@ "guzzlehttp/guzzle": "^7.0.1", "laravel/framework": "^8.12", "laravel/passport": "^10.0", - "laravel/tinker": "^2.5" + "laravel/tinker": "^2.5", + "lcobucci/jwt": "3.3.3" }, "require-dev": { "facade/ignition": "^2.5", diff --git a/composer.lock b/composer.lock index f88e116..39d9038 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "d29a824fe1ba5e1a371425931ce19f0b", + "content-hash": "3b9c799fff22949ca00970c9003aca42", "packages": [ { "name": "asm89/stack-cors", @@ -1251,16 +1251,16 @@ }, { "name": "lcobucci/jwt", - "version": "3.4.0", + "version": "3.3.3", "source": { "type": "git", "url": "https://github.com/lcobucci/jwt.git", - "reference": "320b9f05741b24acbbaf1106ed267ff3817fd74d" + "reference": "c1123697f6a2ec29162b82f170dd4a491f524773" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/lcobucci/jwt/zipball/320b9f05741b24acbbaf1106ed267ff3817fd74d", - "reference": "320b9f05741b24acbbaf1106ed267ff3817fd74d", + "url": "https://api.github.com/repos/lcobucci/jwt/zipball/c1123697f6a2ec29162b82f170dd4a491f524773", + "reference": "c1123697f6a2ec29162b82f170dd4a491f524773", "shasum": "" }, "require": { @@ -1275,9 +1275,6 @@ "phpunit/phpunit": "^5.7 || ^7.3", "squizlabs/php_codesniffer": "~2.3" }, - "suggest": { - "lcobucci/clock": "*" - }, "type": "library", "extra": { "branch-alias": { @@ -1287,12 +1284,7 @@ "autoload": { "psr-4": { "Lcobucci\\JWT\\": "src" - }, - "files": [ - "compat/class-aliases.php", - "compat/json-exception-polyfill.php", - "compat/lcobucci-clock-polyfill.php" - ] + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1320,7 +1312,7 @@ "type": "patreon" } ], - "time": "2020-11-25T01:46:26+00:00" + "time": "2020-08-20T13:22:28+00:00" }, { "name": "league/commonmark", diff --git a/database/migrations/2020_12_15_185412_create_chat_links_table.php b/database/migrations/2020_12_15_185412_create_chat_links_table.php new file mode 100644 index 0000000..ec4585f --- /dev/null +++ b/database/migrations/2020_12_15_185412_create_chat_links_table.php @@ -0,0 +1,42 @@ +id(); + $table->string('name'); + $table->string('link'); + $table->unsignedInteger('class_id'); + $table->unsignedInteger('creator'); + $table->timestamps(); + + $table->foreign('class_id') + ->references('id')->on('school_classes') + ->onDelete('cascade'); + $table->foreign('creator') + ->references('id')->on('users') + ->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('chat_links'); + } +} diff --git a/routes/api.php b/routes/api.php index 94e2235..0bf961c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -6,12 +6,14 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'auth'], function () { Route::post('register', 'Auth\RegisterController'); Route::post('login', 'Auth\LoginController'); - Route::post('logout', 'Auth\LogoutController'); + Route::post('logout', 'Auth\LogoutController')->middleware('auth:api'); }); +Route::apiResource('chat/links', 'ChatLinkController')->except(['show'])->middleware('auth:api'); // ссылки чата + Route::apiResource('headteachers', 'Users\HeadTeacherController'); -Route::apiResource('teachers', 'Users\TeacherController'); +Route::apiResource('teachers', 'Users\TeacherController');//->middleware(['auth:api','role:headteacher|teacher']); Route::get('teacher/{teacher}/classes', 'Users\TeacherController@getClasses'); //получить классы у которых ведет учитель Route::apiResource('students', 'Users\StudentController'); From e19ab81ddd601a076e4860f6399f7c7b8c41fd51 Mon Sep 17 00:00:00 2001 From: nikden13 Date: Wed, 16 Dec 2020 15:25:42 +0700 Subject: [PATCH 2/3] get user --- .../Controllers/Auth/RegisterController.php | 18 ++++++--- app/Http/Controllers/Users/UserController.php | 38 +++++++++++++++++++ app/Models/HeadTeacher.php | 4 ++ app/Models/Parentt.php | 4 ++ app/Models/Student.php | 4 ++ app/Models/Teacher.php | 4 ++ routes/api.php | 2 + 7 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 app/Http/Controllers/Users/UserController.php diff --git a/app/Http/Controllers/Auth/RegisterController.php b/app/Http/Controllers/Auth/RegisterController.php index 25b1da2..c5b40f8 100644 --- a/app/Http/Controllers/Auth/RegisterController.php +++ b/app/Http/Controllers/Auth/RegisterController.php @@ -5,12 +5,10 @@ namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Http\Requests\Auth\RegisterRequest; -use App\Models\HeadTeacher; -use App\Models\Parentt; use App\Models\Role; -use App\Models\Student; -use App\Models\Teacher; +use App\Models\SchoolClass; use App\Models\User; +use Illuminate\Database\QueryException; class RegisterController extends Controller { @@ -40,7 +38,17 @@ class RegisterController extends Controller break; case 'student': - $user->student()->create(); + try { + $user->student()->create(['class_id'=>$request->input('class_id')]); + $class = SchoolClass::find($request->input('class_id')); + if ($class) { + $class->count_students++;; + $class->save(); + } + } catch (QueryException $e) { + $user->delete(); + return response()->json(['message'=>'Class not found'],404); + } break; case 'parent': diff --git a/app/Http/Controllers/Users/UserController.php b/app/Http/Controllers/Users/UserController.php new file mode 100644 index 0000000..6cc23a9 --- /dev/null +++ b/app/Http/Controllers/Users/UserController.php @@ -0,0 +1,38 @@ +user()->role->name) + { + case 'student': + $user = auth()->user()->student; + break; + + case 'teacher': + $user = auth()->user()->teacher; + break; + + case 'headteacher': + $user = auth()->user()->headteacher; + break; + + case 'parent': + $user = auth()->user()->parent; + break; + } + return response()->json($user); + } + +} diff --git a/app/Models/HeadTeacher.php b/app/Models/HeadTeacher.php index 8f05d99..9c8ecde 100644 --- a/app/Models/HeadTeacher.php +++ b/app/Models/HeadTeacher.php @@ -14,6 +14,10 @@ class HeadTeacher extends Model 'updated_at', ]; + protected $hidden = [ + 'user_id', + ]; + public function user() { return $this->belongsTo(User::class); diff --git a/app/Models/Parentt.php b/app/Models/Parentt.php index 5645a09..db91b92 100644 --- a/app/Models/Parentt.php +++ b/app/Models/Parentt.php @@ -15,6 +15,10 @@ class Parentt extends Model 'updated_at', ]; + protected $hidden = [ + 'user_id', + ]; + public function user() { return $this->belongsTo(User::class); diff --git a/app/Models/Student.php b/app/Models/Student.php index 3eb0573..5105002 100644 --- a/app/Models/Student.php +++ b/app/Models/Student.php @@ -15,6 +15,10 @@ class Student extends Model 'updated_at', ]; + protected $hidden = [ + 'user_id', + ]; + public function schoolClass() { return $this->belongsTo(SchoolClass::class, 'class_id'); diff --git a/app/Models/Teacher.php b/app/Models/Teacher.php index 3b3c445..9b008e1 100644 --- a/app/Models/Teacher.php +++ b/app/Models/Teacher.php @@ -15,6 +15,10 @@ class Teacher extends Model 'updated_at', ]; + protected $hidden = [ + 'user_id', + ]; + public function schoolClass() { return $this->hasOne(SchoolClass::class, 'classroom_teacher'); diff --git a/routes/api.php b/routes/api.php index 0bf961c..c28dfbd 100644 --- a/routes/api.php +++ b/routes/api.php @@ -9,6 +9,8 @@ Route::group(['prefix' => 'auth'], function () { Route::post('logout', 'Auth\LogoutController')->middleware('auth:api'); }); +Route::get('users', 'Users\UserController@getUser')->middleware('auth:api'); + Route::apiResource('chat/links', 'ChatLinkController')->except(['show'])->middleware('auth:api'); // ссылки чата Route::apiResource('headteachers', 'Users\HeadTeacherController'); From 1726a499d12c6d61d698334e4378c910b8c29181 Mon Sep 17 00:00:00 2001 From: nikden13 Date: Wed, 16 Dec 2020 15:31:35 +0700 Subject: [PATCH 3/3] get user2 --- app/Http/Controllers/Users/UserController.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/app/Http/Controllers/Users/UserController.php b/app/Http/Controllers/Users/UserController.php index 6cc23a9..3b97933 100644 --- a/app/Http/Controllers/Users/UserController.php +++ b/app/Http/Controllers/Users/UserController.php @@ -4,12 +4,9 @@ namespace App\Http\Controllers\Users; use App\Http\Controllers\Controller; -use App\Models\HeadTeacher; -use Illuminate\Http\JsonResponse; -use Illuminate\Http\Request; -class UserController +class UserController extends Controller { public function getUser()