```python?code_reference&code_event_index=2 import pandas as pd # Read the CSV file try: df = pd.read_csv("akun rt teraskota_281125.xlsx - csv_rt.csv") except: # Fallback for different delimiters commonly used in regions df = pd.read_csv("akun rt teraskota_281125.xlsx - csv_rt.csv", sep=';') # Display the first few rows and info to understand the structure print("First 5 rows:") print(df.head().to_markdown(index=False, numalign="left", stralign="left")) print("\nInfo:") print(df.info()) ``` ```text?code_stdout&code_event_index=2 First 5 rows: | username | nama_lengkap | kecamatan | kelurahan | rw | rt | |:------------------|:--------------------|:-----------------|:-------------------|:-----|:-----| | irwan11 | Irwan | MAGELANG SELATAN | JURANGOMBO SELATAN | 1 | 1 | | amrihpriyono | AMRIH PRIYONO | MAGELANG SELATAN | JURANGOMBO SELATAN | 1 | 2 | | hudidanuwuryanto | HUDI DANU WURYANTO | MAGELANG SELATAN | JURANGOMBO SELATAN | 1 | 3 | | tuirwanto | TUIRWANTO | MAGELANG SELATAN | JURANGOMBO SELATAN | 1 | 4 | | emanindrasulaeman | EMAN INDRA SULAEMAN | MAGELANG SELATAN | JURANGOMBO SELATAN | 1 | 5 | Info: RangeIndex: 1029 entries, 0 to 1028 Data columns (total 6 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 username 1029 non-null object 1 nama_lengkap 1029 non-null object 2 kecamatan 1029 non-null object 3 kelurahan 1029 non-null object 4 rw 1029 non-null int64 5 rt 1029 non-null int64 dtypes: int64(2), object(4) memory usage: 48.4+ KB None ``` Berdasarkan analisis file `akun rt teraskota_281125.xlsx - csv_rt.csv`, file ini berisi data master akun untuk **1.029 Ketua RT** di Kota Magelang. Data ini krusial karena menjadi "kunci masuk" bagi user RT untuk mengakses fitur Renja RT di aplikasi ORARIBET. Berikut adalah rancangan spesifikasi API yang siap Anda berikan ke Copilot/Developer. ----- ### **Spesifikasi API Service: Modul Autentikasi & Akun RT** **Base URL:** `/api/v2/auth` #### **1. Analisis Struktur Data (Database)** Sebelum membuat API, data dari CSV harus dimasukkan (seeding) ke database dengan struktur berikut: * `username` (PK/Unique): *String* (Contoh: "irwan11") * `password`: *Hash* (Note: Karena di CSV tidak ada password, set **default password** saat migrasi, misal: `Magelang2025!` atau sama dengan username). * `nama_lengkap`: *String* * `wilayah`: * `kecamatan`: *String* * `kelurahan`: *String* * `rw`: *Integer* * `rt`: *Integer* ----- #### **2. Endpoint Login RT** Digunakan oleh Ketua RT untuk masuk ke aplikasi. Endpoint ini akan mencocokkan username dari CSV dan mengembalikan Token akses serta scope wilayahnya. * **Endpoint:** `POST /login-rt` * **Description:** Otentikasi user RT dan pengambilan token sesi. * **Request Body:** ```json { "username": "irwan11", "password": "password_rahasia" } ``` * **Response Body (Success 200):** ```json { "success": true, "message": "Login berhasil", "data": { "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", // JWT Token "user": { "username": "irwan11", "nama_lengkap": "Irwan", "role": "KETUA_RT", "scope_wilayah": { "kecamatan": "MAGELANG SELATAN", "kelurahan": "JURANGOMBO SELATAN", "rw": "001", // Diformat string 3 digit "rt": "001" // Diformat string 3 digit } } } } ``` ----- #### **3. Endpoint Cek Profil (Me)** Digunakan aplikasi untuk memastikan siapa yang sedang login dan membatasi data Renja hanya untuk RT yang bersangkutan. * **Endpoint:** `GET /me` * **Header:** `Authorization: Bearer ` * **Response Body:** ```json { "success": true, "data": { "akun": { "username": "amrihpriyono", "nama_lengkap": "AMRIH PRIYONO", "status_aktif": true }, "lokasi_tugas": { "kecamatan": "MAGELANG SELATAN", "kelurahan": "JURANGOMBO SELATAN", "rw": 1, "rt": 2, "kode_area": "33.71.01.1004.01.02" // Optional: Kode Kemendagri generated }, "hak_akses": [ "input_renja", "lihat_profil_rt", "cetak_berita_acara" ] } } ``` ----- #### **4. Endpoint List Master RT (Khusus Admin/Kelurahan)** Digunakan oleh Admin Kota atau Lurah untuk melihat daftar Ketua RT di wilayahnya (berdasarkan data CSV tadi). * **Endpoint:** `GET /master/rt-list` * **Query Params:** * `kelurahan` (Optional, filter by nama kelurahan) * `rw` (Optional, filter by RW) * **Response Body:** ```json { "success": true, "total_data": 5, // Pagination info "data": [ { "username": "hudidanuwuryanto", "nama": "HUDI DANU WURYANTO", "wilayah": "RT 003 / RW 001, JURANGOMBO SELATAN" }, { "username": "tuirwanto", "nama": "TUIRWANTO", "wilayah": "RT 004 / RW 001, JURANGOMBO SELATAN" } // ... dst sesuai data CSV ] } ``` ----- ### **Instruksi Khusus untuk Copilot/Developer** 1. **Data Seeding:** Instruksikan untuk membuat script `seeder` database yang membaca file `csv_rt.csv`. 2. **Default Password:** Karena file CSV tidak memiliki kolom password, buat logika di backend: * *Skenario A:* Set default password = `username`. * *Skenario B:* Set default password global, misal `MagelangMaju!`. * User **WAJIB** dipaksa ganti password saat login pertama (*Force Change Password*). 3. **Format Wilayah:** Perhatikan kolom `rw` dan `rt` di CSV bertipe Integer (contoh: `1`), namun di sistem API Teraskota sebelumnya sering menggunakan String 3 digit (contoh: `"001"`). Lakukan *padding* (penambahan nol di depan) di backend agar sinkron dengan API lain.