diff --git a/app/Http/Controllers/API/AuthController.php b/app/Http/Controllers/API/AuthController.php index a038d97..95e8116 100644 --- a/app/Http/Controllers/API/AuthController.php +++ b/app/Http/Controllers/API/AuthController.php @@ -4,58 +4,116 @@ namespace App\Http\Controllers\API; use App\Http\Controllers\Controller; use Illuminate\Http\Request; -use App\Models\User; use Illuminate\Support\Facades\Auth; -use Illuminate\Support\Facades\Validator; +use App\Models\User; class AuthController extends Controller { + /** + * Create user + * + * @param [string] name + * @param [string] email + * @param [string] password + * @param [string] password_confirmation + * @return [string] message + */ public function register(Request $request) { - $validator = Validator::make($request->all(), [ - 'name' => 'required', - 'email' => 'required|email|unique:users', - 'password' => 'required', + $request->validate([ + 'name' => 'required|string', + 'email'=>'required|string|unique:users', + 'password'=>'required|string', + 'c_password' => 'required|same:password' ]); - if ($validator->fails()) { - return response()->json($validator->errors(), 422); - } - - $user = User::create([ - 'name' => $request->name, + $user = new User([ + 'name' => $request->name, 'email' => $request->email, 'password' => bcrypt($request->password), ]); - $token = $user->createToken('auth_token')->plainTextToken; + if($user->save()){ + $tokenResult = $user->createToken('Personal Access Token'); + $token = $tokenResult->plainTextToken; - return response()->json([ - 'user' => $user, - 'token' => $token, - ]); + return response()->json([ + 'message' => 'Successfully created user!', + 'user' => $user, + 'accessToken'=> $token, + ],201); + } + else{ + return response()->json(['error'=>'Provide proper details']); + } } + /** + * Login user and create token + * + * @param [string] email + * @param [string] password + * @param [boolean] remember_me + */ public function login(Request $request) { - if (!Auth::attempt($request->only('email', 'password'))) { - return response()->json(['message' => 'Invalid login details'], 401); + $request->validate([ + 'email' => 'required|string|email', + 'password' => 'required|string', + 'remember_me' => 'boolean' + ]); + + $credentials = request(['email','password']); + if(!Auth::attempt($credentials)) + { + return response()->json([ + 'message' => 'Unauthorized' + ],401); } - $user = User::where('email', $request['email'])->firstOrFail(); - - $token = $user->createToken('auth_token')->plainTextToken; + $user = $request->user(); + $tokenResult = $user->createToken('Personal Access Token'); + $token = $tokenResult->plainTextToken; return response()->json([ + 'accessToken' =>$token, 'user' => $user, - 'token' => $token, + 'token_type' => 'Bearer', ]); } + /** + * Get the authenticated User + * + * @return [json] user object + */ + public function user(Request $request) + { + return response()->json($request->user()); + } + + /** + * Get the authenticated User + * + * @return [json] user object + */ + public function username(Request $request) + { + return response()->json($request->user()['name']); + } + + /** + * Logout user (Revoke the token) + * + * @return [string] message + */ public function logout(Request $request) { - $request->user()->currentAccessToken()->delete(); + $request->user()->tokens()->delete(); + + return response()->json([ + 'message' => 'Successfully logged out' + ]); - return response()->json(['message' => 'Logged out']); } } diff --git a/app/Http/Controllers/ComputerController.php b/app/Http/Controllers/ComputerController.php new file mode 100644 index 0000000..4beb41c --- /dev/null +++ b/app/Http/Controllers/ComputerController.php @@ -0,0 +1,69 @@ +get(); + } + + public function getById(Request $request){ + return Computer::find($request->get('id')); + } + + public function getByUserId(Request $request){ + return Computer::select()->where('user_id', '=', $request->get('user_id'))->get(); + } + + public function create(Request $request) + { + $request->validate([ + 'user_id' => 'required|exists:users,id', + 'name' => 'required|string|max:256', + 'cpu' => 'nullable|string|max:256', + 'motherboard' => 'nullable|string|max:256', + 'gpu' => 'nullable|string|max:256', + 'additional_info' => 'nullable|string|max:256', + ]); + + $computer = Computer::create($request->all()); + return response()->json($wish, 201); + } + + public function update(Request $request) + { + $request->validate([ + 'id' => 'required|exists:computers,id', + 'name' => 'required|string|max:256', + 'cpu' => 'nullable|string|max:256', + 'motherboard' => 'nullable|string|max:256', + 'gpu' => 'nullable|string|max:256', + 'additional_info' => 'nullable|string|max:256', + ]); + + $computer = Computer::find($request->get('id')); + $computer->name = $request->get('name'); + $computer->cpu = $request->get('cpu'); + $computer->motherboard = $request->get('motherboard'); + $computer->gpu = $request->get('gpu'); + $computer->additional_info = $request->get('additional_info'); + $computer->save(); + return response()->json($computer); + + } + + public function destroy(Request $request) + { + $request->validate([ + 'id' => 'required|exists:wishes,id', + ]); + $destroyed = Computer::destroy($request->get('id')); + return response()->json($destroyed, 204); + + } +} diff --git a/app/Http/Controllers/JobController.php b/app/Http/Controllers/JobController.php new file mode 100644 index 0000000..efa3c10 --- /dev/null +++ b/app/Http/Controllers/JobController.php @@ -0,0 +1,65 @@ +id(); + $table->unsignedBigInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); + $table->string('name', length: 256); + $table->string('cpu', length: 256)->nullable(); + $table->string('motherboard', length: 256)->nullable(); + $table->string('gpu', length: 256)->nullable(); + $table->string('additional_info', length: 256)->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('computers'); + } +}; diff --git a/database/migrations/2024_10_31_091129_create_jobs_table.php b/database/migrations/2024_10_31_091129_create_jobs_table.php new file mode 100644 index 0000000..4485e8f --- /dev/null +++ b/database/migrations/2024_10_31_091129_create_jobs_table.php @@ -0,0 +1,31 @@ +id(); + $table->unsignedBigInteger('computer_id'); + $table->foreign('computer_id')->references('id')->on('computers'); + $table->string('description', length: 256); + $table->boolean('status')->default(false); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('jobs'); + } +}; diff --git a/public/images/favicon.svg b/public/images/favicon.svg new file mode 100644 index 0000000..54e9180 --- /dev/null +++ b/public/images/favicon.svg @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/resources/App.vue b/resources/App.vue index d3ae563..5147bf8 100644 --- a/resources/App.vue +++ b/resources/App.vue @@ -31,9 +31,9 @@ :class="menuOpen ? 'mt-2 mb-2 pa-2' : 'mt-10 mb-3 pa-5'" >

Главная

-

Войти

-

Регистрация

-

Выйти

+

Войти

+

Регистрация

+

Выйти

@@ -48,28 +48,23 @@ diff --git a/resources/store/auth.js b/resources/store/auth.js index 625fea9..905e9f3 100644 --- a/resources/store/auth.js +++ b/resources/store/auth.js @@ -1,31 +1,103 @@ -import { defineStore } from 'pinia'; -import axios from 'axios'; +import {defineStore} from 'pinia' +import axios from "axios"; -export const useAuthStore = defineStore('auth', { +export const useUserStore = defineStore('user', { state: () => ({ user: null, - token: localStorage.getItem('token') || null, + token: localStorage.getItem('auth_token') || null, }), actions: { - async login(credentials) { - const response = await axios.post('/api/login', credentials); - this.user = response.data.user; - this.token = response.data.token; - localStorage.setItem('token', response.data.token); + setUser(user) { + this.user = user; }, - async register(credentials) { - const response = await axios.post('/api/register', credentials); - this.user = response.data.user; - this.token = response.data.token; - localStorage.setItem('token', response.data.token); + setToken(token) { + this.token = token; + localStorage.setItem('auth_token', token); + }, + async checkUser() { + await axios.get( + '/api/auth/user', + { + headers: + { + Authorization: `Bearer ${this.token}`, + token: this.token + } + } + ).then((res) => { + this.setUser(res.data); + return true; + }).catch((error) => { + this.nullifyUser(); + return false; + }) + }, + async login(email, password, rememberMe) { + await axios.post( + '/api/auth/login', + { + 'email': email, + 'password': password, + 'remember_me': rememberMe + }).then((res) => { + this.setUser(res.data.user); + this.setToken(res.data.accessToken); + return true; + }).catch((error) => { + if (!error.response) { + return false; + } + return error.response.data.message; + }) + }, + async registration(login, email, password, repeatPassword) { + await axios.post( + '/api/auth/register', + { + 'name': login, + 'email': email, + 'password': password, + 'c_password': repeatPassword + }).then((res) => { + this.setUser(res.data.user); + this.setToken(res.data.accessToken); + return true; + }).catch((error) => { + if (!error.response) { + return false; + } + return error.response.data.message; + }) }, logout() { - this.user = null; - this.token = null; - localStorage.removeItem('token'); + axios.get('/api/auth/logout', + { + headers: + { + Authorization: `Bearer ${this.token}`, + token: this.token + } + } + ); + this.nullifyUser(); }, + nullifyUser() { + this.setUser(null); + this.setToken(null); + }, + async getUsername(id){ + let result = null; + await axios.get('/api/wish/username', + { + params: + { + user_id: id + } + } + ).then((res) => { + result = res; + }); + return result; + } }, - getters: { - isAuthenticated: (state) => !!state.token, - }, -}); +}) diff --git a/resources/views/About.vue b/resources/views/About.vue index c95b694..e9b720e 100644 --- a/resources/views/About.vue +++ b/resources/views/About.vue @@ -1,31 +1,37 @@