diff --git a/app/Http/Controllers/Auth/ProfileController.php b/app/Http/Controllers/Auth/ProfileController.php new file mode 100644 index 0000000..5771fa1 --- /dev/null +++ b/app/Http/Controllers/Auth/ProfileController.php @@ -0,0 +1,117 @@ + 'Username wajib diisi', + 'username.max' => 'Username maksimal 12 karakter', + 'username.string' => 'Username harus berupa string', + 'username.unique' => 'Username sudah terdaftar', + + 'name.required' => 'Nama wajib diisi', + 'name.max' => 'Nama maksimal 255 karakter', + 'name.string' => 'Nama harus berupa string', + 'name.unique' => 'Nama sudah terdaftar', + + 'email.required' => 'Email wajib diisi', + 'email.email' => 'Email tidak valid', + 'email.unique' => 'Email sudah terdaftar', + 'email.max' => 'Email maksimal 255 karakter', + 'email.string' => 'Email harus berupa string', + + 'avatar.image' => 'Foto profile harus berupa gambar', + 'avatar.mimes' => 'Format foto profile tidak sesuai, harus jpeg, png, atau jpg', + 'avatar.max' => 'Ukuran foto profile maksimal 2MB', + ]; + + $validator = Validator::make($request->all(), [ + 'username' => 'required|string|max:12|unique:users,username,' . Auth::user()->id, + 'name' => 'required|string|max:255|unique:users,name,' . Auth::user()->id, + 'email' => 'required|string|email|max:255|unique:users,email,' . Auth::user()->id, + 'avatar' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', + ], $customMessage); + + if ($validator->fails()) { + toast($validator->messages()->all()[0], 'error')->position('top-right')->autoclose(3000); + return redirect()->back()->withInput(); + } + + try { + $user = User::findOrFail(Auth::id()); + $user->username = $request->username; + $user->name = $request->name; + $user->email = $request->email; + + if ($request->hasFile('avatar')) { + + $path = $request->file('avatar')->store('avatars', 'public'); + + if (!empty($user->avatar) && Storage::disk('public')->exists($user->avatar)) { + Storage::disk('public')->delete($user->avatar); + } + $user->avatar = $path; + } + + $user->save(); + toast('Data berhasil diubah', 'success')->position('top-right')->autoclose(3000); + return redirect()->back(); + } catch (\Throwable $th) { + toast('Terjadi kesalahan', 'error')->position('top-right')->autoclose(3000); + return redirect()->back(); + } + } + + public function updatePassword(request $request) + { + $customMessage = [ + 'new_password.required' => 'Password wajib diisi', + 'new_password.confirmed' => 'Konfirmasi password tidak cocok', + 'new_password.min' => 'Password minimal 8 karakter', + ]; + + $user = User::find(Auth::user()->id); + if (Hash::check($request->old_password, $user->password)) { + + $validator = Validator::make($request->all(), [ + 'new_password' => 'required|string|min:8|confirmed', + ], $customMessage); + + if ($validator->fails()) { + toast($validator->messages()->all()[0], 'error')->position('top-right')->autoclose(3000); + return redirect()->back()->withInput(); + } + + $user->password = Hash::make($request->new_password); + + try { + $user->save(); + toast('Password berhasil diubah', 'success')->position('top-right')->autoclose(3000); + return redirect()->back(); + } catch (\Throwable $th) { + toast('Terjadi kesalahan', 'error')->position('top-right')->autoclose(3000); + return redirect()->back(); + } + } else { + toast('Password lama tidak cocok', 'error')->position('top-right')->autoclose(3000); + return redirect()->back(); + } + } +} diff --git a/app/Models/User.php b/app/Models/User.php index 7472824..5da3a10 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -23,6 +23,7 @@ class User extends Authenticatable 'email', 'password', 'role', + 'avatar' ]; /** diff --git a/database/migrations/2014_10_12_000000_create_users_table.php b/database/migrations/2014_10_12_000000_create_users_table.php index 9442a05..4723008 100644 --- a/database/migrations/2014_10_12_000000_create_users_table.php +++ b/database/migrations/2014_10_12_000000_create_users_table.php @@ -22,6 +22,7 @@ public function up(): void $table->enum('role', ['admin', 'user'])->default('user'); $table->string('activation_code')->nullable(); $table->boolean('is_active')->default(false); + $table->string('avatar')->nullable(); $table->timestamps(); }); } diff --git a/public/assets/js/app.js b/public/assets/js/app.js index 4a5a7a2..51d824b 100644 --- a/public/assets/js/app.js +++ b/public/assets/js/app.js @@ -1 +1,1518 @@ -!function(){var a,t,o,n,s,e,d,l,i=document.querySelector(".navbar-menu").innerHTML,r=7,c="en",m=localStorage.getItem("language");function u(e){document.getElementById("header-lang-img")&&("en"==e?document.getElementById("header-lang-img").src="assets/images/flags/us.svg":"sp"==e?document.getElementById("header-lang-img").src="assets/images/flags/spain.svg":"gr"==e?document.getElementById("header-lang-img").src="assets/images/flags/germany.svg":"it"==e?document.getElementById("header-lang-img").src="assets/images/flags/italy.svg":"ru"==e?document.getElementById("header-lang-img").src="assets/images/flags/russia.svg":"ch"==e?document.getElementById("header-lang-img").src="assets/images/flags/china.svg":"fr"==e&&(document.getElementById("header-lang-img").src="assets/images/flags/french.svg"),localStorage.setItem("language",e),m=localStorage.getItem("language"),function(){null==m&&u(c);var e=new XMLHttpRequest;e.open("GET","assets/lang/"+m+".json"),e.onreadystatechange=function(){var a;4===this.readyState&&200===this.status&&(a=JSON.parse(this.responseText),Object.keys(a).forEach(function(t){document.querySelectorAll("[data-key='"+t+"']").forEach(function(e){e.textContent=a[t]})}))},e.send()}())}function g(){document.querySelectorAll(".navbar-nav .collapse")&&document.querySelectorAll(".navbar-nav .collapse").forEach(function(t){var a=new bootstrap.Collapse(t,{toggle:!1});t.addEventListener("show.bs.collapse",function(e){e.stopPropagation();e=t.parentElement.closest(".collapse");e?e.querySelectorAll(".collapse").forEach(function(e){e=bootstrap.Collapse.getInstance(e);e!==a&&e.hide()}):function(e){for(var t=[],a=e.parentNode.firstChild;a;)1===a.nodeType&&a!==e&&t.push(a),a=a.nextSibling;return t}(t.parentElement).forEach(function(e){2