﻿

========================================
PROFILE SHOW
========================================
@extends('layouts.app')
@section('title','Profil')
@section('content')
<div class="mx-auto min-h-screen max-w-3xl px-5 pb-28 pt-7"><h1 class="text-2xl font-bold">Profil</h1>
<div class="mt-6 flex flex-col items-center rounded-2xl bg-white p-7 soft-shadow"><div class="flex h-20 w-20 items-center justify-center rounded-full bg-ajara-100 text-3xl font-bold text-ajara-800">{{ strtoupper(substr(auth()->user()->name,0,1)) }}</div><h2 class="mt-3 text-lg font-bold">{{ auth()->user()->name }}</h2><p class="text-sm text-slate-500">Mahasiswa · {{ auth()->user()->nim }}</p></div>
<div class="mt-5 overflow-hidden rounded-2xl bg-white soft-shadow">@foreach([['profile.edit','person-vcard','Data Akun'],['#','clipboard-check','Riwayat Pendaftaran'],['#','heart','Favorit'],['#','gear','Pengaturan'],['#','question-circle','Bantuan']] as [$url,$icon,$label])<a href="{{ $url==='#'?'javascript:void(0)':route($url) }}" class="flex items-center justify-between border-b border-slate-100 px-4 py-4 last:border-0"><span class="flex items-center gap-3 text-sm font-medium"><i class="bi bi-{{ $icon }} text-lg text-[#335c67]"></i>{{ $label }}</span><i class="bi bi-chevron-right text-xs text-slate-400"></i></a>@endforeach</div>
<form method="POST" action="{{ route('logout') }}" class="mt-6">@csrf<button class="w-full rounded-xl bg-ajara-800 py-3.5 text-sm font-semibold text-white hover:bg-ajara-900"><i class="bi bi-box-arrow-right mr-2"></i>Logout</button></form></div>
@include('partials.bottom-nav')
@endsection

========================================
PROFILE EDIT
========================================
@extends('layouts.app')
@section('title','Data Akun')
@section('content')
<div class="mx-auto min-h-screen max-w-xl px-5 pb-28 pt-7"><a href="{{ route('profile.show') }}" class="text-sm text-ajara-700">← Kembali ke profil</a><h1 class="mt-5 text-2xl font-bold">Data Akun</h1>
<form method="POST" action="{{ route('profile.update') }}" class="mt-6 space-y-4 rounded-2xl bg-white p-5 soft-shadow">@csrf @method('PUT')
@foreach(['name'=>'Nama Lengkap','nim'=>'NIM','email'=>'Email'] as $field=>$label)<label class="block text-sm font-medium">{{ $label }}<input name="{{ $field }}" value="{{ old($field,auth()->user()->$field) }}" required class="mt-2 w-full rounded-xl border border-slate-200 px-4 py-3 text-sm">@error($field)<span class="text-xs text-red-600">{{ $message }}</span>@enderror</label>@endforeach
<button class="w-full rounded-xl bg-ajara-700 py-3 font-semibold text-white">Simpan Perubahan</button></form></div>
@include('partials.bottom-nav')
@endsection

========================================
PROFILE CONTROLLER
========================================
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class ProfileController extends Controller
{
    public function show() { return view('profile.show'); }
    public function edit() { return view('profile.edit'); }

    public function update(Request $request)
    {
        $data = $request->validate([
            'name' => ['required', 'string', 'max:120'],
            'nim' => ['required', 'string', 'max:30', 'unique:users,nim,'.auth()->id()],
            'email' => ['required', 'email', 'max:150', 'unique:users,email,'.auth()->id()],
        ]);
        auth()->user()->update($data);
        return redirect()->route('profile.show')->with('success', 'Data akun berhasil diperbarui.');
    }
}

========================================
USER MODEL
========================================
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Illuminate\Database\Eloquent\Relations\HasMany;
use App\Models\PublicationOrder;

class User extends Authenticatable
{
    use HasFactory, Notifiable;
    protected $fillable = ['name', 'nim', 'email', 'password', 'role', 'avatar'];
    protected $hidden = ['password', 'remember_token'];
    protected $casts = ['email_verified_at' => 'datetime', 'password' => 'hashed'];

    public function registrations(): HasMany { return $this->hasMany(Registration::class); }
    public function notifications(): HasMany { return $this->hasMany(\App\Models\Notification::class); }
    public function publicationOrders(): HasMany { return $this->hasMany(PublicationOrder::class); }
    public function chatMessages(): HasMany { return $this->hasMany(ChatMessage::class); }
    public function reviewedContentOrders(): HasMany
{
    return $this->hasMany(
        PublicationOrder::class,
        'content_reviewed_by'
    );
}
}

===== ROUTE PROFIL =====
        ->name('chat.index');
    Route::post('/chat', [ChatController::class, 'store'])
        ->name('chat.store');

    Route::middleware('role:mahasiswa')->group(function () {
        Route::get('/dashboard', [DashboardController::class, 'index'])
            ->name('dashboard');
        Route::get('/lomba/{competition}/daftar', [RegistrationController::class, 'create'])
            ->name('registrations.create');
        Route::post('/lomba/{competition}/daftar', [RegistrationController::class, 'store'])
            ->name('registrations.store');
        Route::get('/notifikasi', [NotificationController::class, 'index'])
            ->name('notifications.index');
        Route::post('/notifikasi/{notification}/read', [NotificationController::class, 'markRead'])
            ->name('notifications.read');
        Route::get('/profil', [ProfileController::class, 'show'])
            ->name('profile.show');
        Route::get('/profil/data-akun', [ProfileController::class, 'edit'])
            ->name('profile.edit');
        Route::put('/profil/data-akun', [ProfileController::class, 'update'])
            ->name('profile.update');
    });

    Route::middleware('role:penyelenggara')
        ->prefix('penyelenggara')
        ->name('organizer.')
        ->group(function () {

            Route::get('/', [OrganizerController::class, 'index'])
                ->name('dashboard');

            Route::get('/lomba/baru', [OrganizerController::class, 'create'])
                ->name('create');

            Route::post('/lomba', [OrganizerController::class, 'store'])

===== MIGRASI USER DAN FOTO =====
D:\ajara\ajara-work-main\database\migrations\0001_01_01_000000_create_users_table.php:14         Schema::create('users', function (Blueprint $table) {
D:\ajara\ajara-work-main\database\migrations\0001_01_01_000000_create_users_table.php:45         Schema::dropIfExists('users');
D:\ajara\ajara-work-main\database\migrations\2026_11_09_000001_add_nim_role_avatar_to_users_table.php:9         Schema::table('users', function (Blueprint $table) {
D:\ajara\ajara-work-main\database\migrations\2026_11_09_000001_add_nim_role_avatar_to_users_table.php:12             $table->string('avatar')->nullable()->after('role');
D:\ajara\ajara-work-main\database\migrations\2026_11_09_000001_add_nim_role_avatar_to_users_table.php:16         Schema::table('users', function (Blueprint $table) {
D:\ajara\ajara-work-main\database\migrations\2026_11_09_000001_add_nim_role_avatar_to_users_table.php:18             $table->dropColumn(['nim', 'role', 'avatar']);
D:\ajara\ajara-work-main\database\migrations\2026_11_13_160935_add_content_review_fields_to_publication_orders_table.php:30                 ->constrained('users')
D:\ajara\ajara-work-main\database\migrations\2026_11_13_182355_add_closure_fields_to_competitions_table.php:24                 ->constrained('users')
D:\ajara\ajara-work-main\database\migrations\2026_11_14_143723_add_poster_moderation_fields.php:21                     ->constrained('users')
D:\ajara\ajara-work-main\database\migrations\2026_11_14_151447_add_admin_moderation_and_audit.php:11             if (!Schema::hasColumn('competitions','admin_hidden_by')) $table->foreignId('admin_hidden_by')->nullable()->constrained('users')->nullOnDelete();
D:\ajara\ajara-work-main\database\migrations\2026_11_14_151447_add_admin_moderation_and_audit.php:17                 $table->foreignId('admin_id')->nullable()->constrained('users')->nullOnDelete();
D:\ajara\ajara-work-main\database\migrations\2026_11_14_151447_add_admin_moderation_and_audit.php:18                 $table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete();
D:\ajara\ajara-work-main\database\migrations\2026_11_15_000003_make_user_nim_nullable_for_organizers.php:11         Schema::table('users', function (Blueprint $table) {
