# 🔐 Auth Verification Flow – GIS Crime App

Dokumentasi ini merinci alur autentikasi aplikasi termasuk biometric login, verifikasi identitas (NIK/KTP untuk user & NRP/KTA untuk officer), serta sistem anti-spam panic button dan auto-ban.

---

## 1. Biometric Login (Fingerprint / Face ID)

### 📍 Tujuan:

Mempercepat login pengguna dengan otentikasi biometrik.

### 🔄 Alur:

1. App diluncurkan.
2. Cek token atau NIK/NRP di `secure_storage`.
3. Jika tersedia → munculkan biometric prompt.
4. Jika autentikasi sukses → login otomatis ke homepage.
5. Jika gagal → redirect ke halaman login manual.

### 🔧 Teknologi:

- `local_auth` (Flutter)
- `flutter_secure_storage`

---

## 2. Registrasi dengan Verifikasi NIK (User) atau NRP (Officer)

### 📍 Tujuan:

Mencegah spam akun dan memastikan pengguna adalah individu sah.

### 🔄 Alur:

1. User mengisi form registrasi:
   - Email, password
   - NIK (user) atau NRP (officer)
   - Upload foto KTP/KTA (opsional)
   - Validasi format NIK/NRP
   - Cek apakah NIK/NRP sudah ada di database.
   - Jika `is_banned = true` → tolak registrasi.
   - Jika valid → simpan user baru.

### 🔧 Teknologi:

- Supabase/PostgreSQL (unique index + ban flag)
- Flutter form + validasi lokal

---

## 3. Verifikasi KTP/KTA (Opsional)

### 📍 Tujuan:

Validasi lanjutan jika diperlukan (manual atau otomatis).

### 🅱️ Otomatis (OCR):

- Gunakan `google_mlkit_text_recognition` dan sejenisnya
- Ekstrak teks dari foto KTP atau KTA
- Cocokkan dengan data yang dimasukkan

---

## 4. Anti-Spam Panic Button + Auto Ban

### 📍 Tujuan:

Menghindari penyalahgunaan fitur panic alert.

### 🔄 Alur:

1. User menekan panic button.
2. Backend:

   - Hitung jumlah panic alert dari user dalam 5 menit terakhir.
   - Jika > 3 → tambahkan `panic_strike`.
   - Jika `panic_strike >= 3` → set `is_banned = true`.

3. Saat user login atau mendaftar:
   - Cek `is_banned` berdasarkan NIK/NRP.
   - Jika ya → tolak akses.

# 📍 Location & Anti-Fake GPS Flow – GIS Crime App

Dokumentasi ini merinci bagaimana sistem memverifikasi lokasi pengguna dan melindungi fitur penting seperti registrasi dan panic button dari penyalahgunaan melalui fake GPS (location spoofing).

---

## teknologi 
geolocator
geocoding

## 🚦 1. REGISTRASI FLOW (NEW USER)

### 🔄 Alur:
1. 📲 User membuka halaman registrasi
2. 📍 Aplikasi meminta akses lokasi
3. ✅ Jika lokasi berhasil didapat:
   - Periksa apakah `position.isMocked == false`
   - Konversi koordinat → nama kota
   - Jika kota **"Jember"**:
     - Lanjutkan proses registrasi
   - Jika **bukan Jember**:
     - Tampilkan alert: *"Registrasi hanya tersedia di wilayah Jember."*
     - Blokir pendaftaran
4. ❌ Jika `position.isMocked == true`:
   - Blokir pendaftaran
   - Tambahkan flag `spoofing_attempt = true` (opsional)

---

## 🚨 2. PANIC BUTTON FLOW

### 🔄 Alur:
1. 📲 User membuka halaman Panic Button
2. 📍 Aplikasi:
   - Ambil posisi GPS terkini
   - Periksa:
     - `isMocked == false`
     - Lokasi berada di wilayah Jember
3. ✅ Jika valid:
   - Panic button aktif
4. ❌ Jika:
   - Lokasi palsu (`isMocked == true`)
   - Atau lokasi di luar Jember
   - → Panic button **dinonaktifkan**
   - Tampilkan alert: *"Fitur Panic tidak dapat digunakan di luar Jember."*
5. ⚠️ Jika user mencoba spam dari lokasi palsu:
   - Tambahkan `spoofing_strike += 1`
   - Jika `spoofing_strike >= 2` → `is_banned = true`

---
### 🔧 Database Fields (liat schema.prisma untul lebih detail):

```sql
users:
    .....
  - is_banned BOOLEAN
  - ban_reason TEXT
  - panic_strike INT
  - profile
    ......
    - nik

officer:
  - nrp TEXT UNIQUE
  - is_banned BOOLEAN
  - ban_reason TEXT
  - panic_strike INT

panic_logs:
  - user_id UUID
  - timestamp TIMESTAMP
  - location POINT
```

Splash Screen
       ↓
Token Valid?
 ┌─────────────┐
 │ Ya          │ → Biometric Prompt
 │ Tidak       │
 └─────┬───────┘
       ↓
Onboarding Completed?
 ┌─────────────┐
 │ Ya          │ → geolocator verification
 │ Tidak       │ → Tampilkan Onboarding
 └─────┬───────┘
       ↓
Location Valid?
 ┌─────────────┐
 │ Ya          │ → Role Selection
 │ Tidak       │ → Tampilkan Sreen warning geolocator
 └─────┬───────┘
       ↓
Role Selection
      ↓
Registrasi Step Form (NIK/NRP + Upload KTP/KTA + OCR AI untuk validasi KTP/KTA)
      ↓
Submit & Buat Akun
      ↓
Login Manual
      ↓
Login Success?
 ┌─────────────┐
 │ Ya          │ → Home sesuai Role
 │ Tidak       │ → Tampilkan Error
 └─────────────┘