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.
74 lines
3.7 KiB
Markdown
74 lines
3.7 KiB
Markdown
# 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
|
|
|
|
4. **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.
|
|
|
|
5. **Halaman login**
|
|
`app/(auth)/login/page.tsx`: Server Component yang menampilkan `<LoginForm />` di tengah layar.
|
|
|
|
6. **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.
|
|
|
|
7. **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:
|
|
|
|
```powershell
|
|
$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.
|