From 84ab4777c2639840fec438dcd2339b4dcb889a56 Mon Sep 17 00:00:00 2001
From: "p.belezov"
Date: Thu, 31 Oct 2024 17:48:39 +0800
Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B0=D0=BB=D0=B0=D0=B4=D0=B8=D0=BB=20?=
=?UTF-8?q?=D0=B0=D0=B2=D1=82=D0=BE=D1=80=D0=B8=D0=B7=D0=B0=D1=86=D0=B8?=
=?UTF-8?q?=D1=8E,=20=D0=BD=D0=B0=D1=87=D0=B0=D0=BB=20=D0=BB=D0=BE=D0=B3?=
=?UTF-8?q?=D0=B8=D0=BA=D1=83?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app/Http/Controllers/API/AuthController.php | 108 +++++++++++++----
app/Http/Controllers/ComputerController.php | 69 +++++++++++
app/Http/Controllers/JobController.php | 65 ++++++++++
app/Models/Computer.php | 11 ++
app/Models/Job.php | 11 ++
...24_10_31_091008_create_computers_table.php | 34 ++++++
.../2024_10_31_091129_create_jobs_table.php | 31 +++++
public/images/favicon.svg | 4 +
resources/App.vue | 29 +++--
resources/store/auth.js | 114 ++++++++++++++----
resources/views/About.vue | 28 +++--
resources/views/Login.vue | 32 ++++-
resources/views/Register.vue | 37 ++++--
resources/views/welcome.blade.php | 1 +
routes/api.php | 20 ++-
15 files changed, 505 insertions(+), 89 deletions(-)
create mode 100644 app/Http/Controllers/ComputerController.php
create mode 100644 app/Http/Controllers/JobController.php
create mode 100644 app/Models/Computer.php
create mode 100644 app/Models/Job.php
create mode 100644 database/migrations/2024_10_31_091008_create_computers_table.php
create mode 100644 database/migrations/2024_10_31_091129_create_jobs_table.php
create mode 100644 public/images/favicon.svg
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 @@
- Welcome {{ user != null ? user.name : 'guest' }}!
+
+ Welcome {{ authenticated ? userStore.user['name'] : 'guest' }}!
+