You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

3.7 KiB

Progress

Catatan sementara untuk melanjutkan pekerjaan di komputer lain. Hapus file ini kalau halaman login sudah selesai.

Terakhir diperbarui: 2026-10-20.

Sudah selesai

  • Drizzle ORM + pg ke Postgres (db/, drizzle.config.ts, script db:*).
  • Better Auth 1.7: login pakai username, tabel auth sudah di-migrate, sign-up publik ditutup. Endpoint di app/api/auth/[...all]/route.ts.
  • shadcn/ui preset base-nova, komponen: button, input, label, card, field, separator.
  • old-source/ di-commit tanpa db_login.inc.php (kredensial).
  • Halaman login, langkah 1 sampai 3 dari 7:
    1. zod terpasang.
    2. data/auth.ts: getCurrentUser() cek session, redirect ke /login kalau belum login.
    3. app/(auth)/login/actions.ts: server action login (validasi zod, lalu auth.api.signInUsername, lalu redirect("/")).

Berikutnya: halaman login, langkah 4 sampai 7

  1. Form login (client component) app/(auth)/login/_components/login-form.tsx, diawali "use client". Pakai useActionState(login, {}). Isinya Card berisi FieldGroup dengan dua Field (username dan password, name="username" / name="password"), FieldError untuk state.error, dan Button type="submit" yang disabled saat pending. Input username diberi defaultValue={state.username} supaya tidak kosong setelah gagal login.

  2. Halaman login app/(auth)/login/page.tsx: Server Component yang menampilkan <LoginForm /> di tengah layar.

  3. Pindahkan halaman utama ke grup dashboard Hapus app/page.tsx (bawaan create-next-app), lalu buat app/(dashboard)/page.tsx. Komponen yang memanggil getCurrentUser() harus dibungkus <Suspense> karena cacheComponents aktif (tanpa itu build gagal). Tampilkan nama user yang login.

  4. Logout app/(dashboard)/actions.ts dengan "use server": action logout memanggil auth.api.signOut({ headers: await headers() }) lalu redirect("/login"). Pasang lewat <form action={logout}><Button type="submit">Keluar</Button></form> di halaman dashboard.

Cek akhir: buka / saat belum login, harus diarahkan ke /login. Login sebagai admin, nama tampil di /. Klik Keluar, kembali ke /login. Lalu pnpm exec tsc --noEmit dan pnpm lint.

Setelah itu: commit, lalu rencana berikutnya (belum dimulai):

  • User read-only (hanya SELECT) di MariaDB untuk AMIGO_DATABASE_URL, menggantikan root.
  • Koneksi Drizzle ke MariaDB di db/amigo/ dengan drizzle-kit pull (jangan pernah migrate/push).
  • proxy.ts untuk redirect cepat ke /login kalau tidak ada cookie session.

Menyiapkan komputer lain

Yang tidak ada di git dan harus disiapkan ulang:

  1. .env: isi DATABASE_URL, BETTER_AUTH_SECRET, BETTER_AUTH_URL, AMIGO_DATABASE_URL. Buat BETTER_AUTH_SECRET baru: node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"

  2. Postgres lokal: docker run -d --name cleo-postgres -e POSTGRES_PASSWORD=<password> -e POSTGRES_DB=cleo_auth -p 5432:5432 -v cleo-pgdata:/var/lib/postgresql/data postgres:17

  3. pnpm install, lalu pnpm db:migrate untuk membuat tabel auth.

  4. Akun admin dibuat ulang. Sign-up sedang ditutup, jadi sementara hapus disableSignUp: true di lib/auth.ts, jalankan pnpm dev, kirim request sign-up:

    $body = @{ name = "Administrator"; email = "admin@cleo.local"; username = "admin"; password = "<password>" } | ConvertTo-Json
    Invoke-RestMethod -Method Post -Uri "http://localhost:3000/api/auth/sign-up/email" -ContentType "application/json" -Headers @{ Origin = "http://localhost:3000" } -Body $body
    

    lalu kembalikan disableSignUp: true.

  5. MariaDB cleo di 192.168.3.3 hanya bisa diakses dari jaringan kantor. Halaman login tidak membutuhkannya.