Skip to content

Commit f87c4cd

Browse files
committed
update documentation
1 parent a522015 commit f87c4cd

5 files changed

Lines changed: 109 additions & 25 deletions

File tree

README.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# 🕌 Kalender Hijriyah Digital API Berbasis Golang & NASA SPICE 🌙
22

33
[![Go Release](https://img.shields.io/badge/Go-1.25+-00ADD8?style=flat-square&logo=go)](https://go.dev/)
4-
[![Framework: Gin](https://img.shields.io/badge/Framework-Gin-009688?style=flat-square&logo=gin)](https://gin-gonic.com/)
4+
[![Framework: Gin](https://img.shields.io/badge/Framework-Gin-059669?style=flat-square&logo=gin)](https://gin-gonic.com/)
55
[![Engine: SPICE Toolkit](https://img.shields.io/badge/Engine-SPICE%20C--Kernel-10b981?style=flat-square)](https://naif.jpl.nasa.gov/naif/toolkit.html)
66
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)
77

@@ -11,21 +11,22 @@ Aplikasi ini berfokus murni pada penyediaan REST API untuk perhitungan **tanggal
1111

1212
## 🧠 Perencanaan
1313

14-
Proyek ini telah dire-write dari Python/FastAPI ke **Golang** untuk memaksimalkan performa dan konkurensi, menggunakan binding ke pustaka **NASA SPICE (CSPICE)**.
14+
Aplikasi ini dibangun menggunakan **Golang** untuk memaksimalkan performa dan konkurensi, dengan integrasi langsung ke pustaka **NASA SPICE (CSPICE)** melalui CGO. Hal ini memungkinkan perhitungan astronomi dilakukan dengan standar ketelitian tingkat wahana antariksa.
1515

1616
1. Data astronomi dikalkulasi dari ephemeris riil NASA JPL `de440s.bsp` untuk tingkat ketelitian luar angkasa.
1717
2. Menjembatani perbedaan metode penetapan Hijriyah (KHGT, Umm al-Qura, MABIMS, Wujudul Hilal) di dalam satu platform.
18-
3. Memastikan pergantian hari Hijriyah **tepat saat Matahari terbenam** (Maghrib lokal pengamat).
18+
3. Memastikan pergantian hari Hijriyah **tepat saat Matahari terbenam** (Maghrib lokal pengamat) dengan pencarian *bisection* presisi.
1919

2020
---
2121

2222
## ✨ Fitur Utama
2323

2424
- 📡 **Real-time Lunar Telemetry**: Sinkronisasi dan perhitungan lintasan matahari dan bulan dengan CSPICE.
25-
- 🌅 **Precise Sunset/Fajr Bisection**: Bisection search presisi tinggi 24 jam untuk mendeteksi maghrib dan subuh lintas batasan zona waktu.
25+
- 🌅 **Precise Solar Events**: Deteksi *Maghrib* (Sunset) dan *Subuh* (Fajr) menggunakan metode *bisection search* 24 jam untuk akurasi tinggi di berbagai lintang.
26+
- 🕋 **Prayer Times Engine**: Perhitungan jadwal shalat multi-metode (Kemenag, MWL, ISNA, Umm Al-Qura, dll) dengan dukungan koreksi lintang tinggi.
2627
- 🧪 **Multi-Method Engine**:
27-
- 🌍 **KHGT**: Kalender Hijriyah Global Tunggal (Turki 2016).
28-
- 🕋 **Umm al-Qura**: Standar otoritas Makkah.
28+
- 🌍 **KHGT**: Kalender Hijriyah Global Tunggal (Turki 2016) dengan pemindaian visibilitas global.
29+
- 🕋 **Umm al-Qura**: Standar kalender resmi Arab Saudi (Makkah).
2930
- 🔢 **Hisab**: Berdasarkan Wujudul Hilal.
3031
- 🔭 **Rukyatul Hilal**: Berdasarkan kriteria MABIMS (2022).
3132
- 🔮 **Global Scan Optimizations**: Scan visibilitas komprehensif dari barat (Benua Amerika) untuk hisab global dengan koreksi ekuinoks/midnight UTC.
@@ -38,7 +39,7 @@ Proyek ini telah dire-write dari Python/FastAPI ke **Golang** untuk memaksimalka
3839

3940
- **Golang**: Bahasa yang sangat cepat dengan concurrency yang handal.
4041
- **Gin**: HTTP Web framework yang simpel dan cepat.
41-
- **CGO & CSPICE**: Toolkit geometri navigasi antariksa standar NASA yang ditautkan via CGO.
42+
- **CGO & CSPICE**: Menggunakan `spice_bridge.go` untuk mengakses fungsi CSPICE secara aman dengan mekanisme `sync.Mutex` karena keterbatasan *thread-safety* pada pustaka C asli.
4243
- **Docker**: Siap deploy dimana saja secara konsisten dengan multi-stage build.
4344

4445
---
@@ -64,22 +65,24 @@ kalender-hijriyah/
6465
├── cmd/
6566
│ └── api/ # Entry point Gin API Server
6667
├── data/ # SPICE Kernels (de440s.bsp, naif0012.tls, dll)
67-
├── internal/
68+
├── core/
6869
│ ├── api/ # HTTP Handlers
6970
│ ├── astronomy/ # SPICE CGO Bindings & Kalkulator Orbit
7071
│ ├── calendar/ # Logika KHGT, Umm al-Qura, MABIMS
7172
│ ├── models/ # Skema logika Golang
73+
│ ├── prayer/ # Konfigurasi & Kalkulasi Jadwal Shalat
7274
│ └── services/ # Orkestrasi Kalender Utama
73-
├── docs/ # Dokumentasi Metode Hijriyah
75+
├── docs/ # Dokumentasi Detail & Teori Falak
7476
└── README.md
7577
```
7678

7779
🌐 API Endpoints Utama
7880

79-
| Endpoint | Method | Fungsi | Parameter Query |
80-
| -------------------------------------------- | ------ | ------------------------------------------- | ------------------------------------------------------------------------------- |
81-
| `/api/v4/hijri/date?lat={lat}&lon={lon}` | GET | Perhitungan prediksi bulan | lat, lon |
82-
| `/api/v4/moon/telemetry?lat={lat}&lon={lon}` | GET | Informasi bulan berdasarkan lokasi pengguna | lat, lon, altitude, elongation, azimuth, distance km, illumination, phase, time |
81+
| Endpoint | Method | Fungsi | Parameter Query |
82+
| ------------------------ | ------ | ------------------------------------------- | ---------------------------------- |
83+
| `/api/v4/hijri/date` | GET | Konversi tanggal ke Hijriyah (Multi-metode) | lat, lon, method, date |
84+
| `/api/v4/prayer/times` | GET | Jadwal Salat harian presisi | lat, lon, method, asr_method, date |
85+
| `/api/v4/moon/telemetry` | GET | Data astronomi Bulan real-time | lat, lon, date |
8386

8487
---
8588

docs/api-design.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ API dirancang agar:
1313
Mengembalikan tanggal Hijriyah hari ini beserta prediksi pergantian bulan dari berbagai metode penetapan.
1414

1515
Parameter Query Opsional:
16+
1617
- `date`: Tanggal ISO 8601 (Contoh: `2026-03-18T12:00:00Z`). Default: current time.
1718
- `lat`: Latitude observer (Contoh: `-7.98`). Default: Malang.
1819
- `lon`: Longitude observer (Contoh: `112.63`). Default: Malang.

docs/astronomical-model.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,84 @@ untuk menghitung posisi Matahari dan Bulan menggunakan binding ke pustaka NASA S
1818
- Analisis Elongasi Geosentrik (Sudut pisah pusat Bumi-Bulan-Matahari) dan Toposentrik.
1919
- Prediksi Konjungsi Presisi (Ijtima).
2020

21+
## 🌦 Refraksi Atmosfer
22+
23+
Untuk kriteria berbasis Toposentrik (seperti MABIMS), sistem menerapkan koreksi refraksi atmosfer pada fungsi `ApplyRefraction`.
24+
Kami menggunakan model aproksimasi Bennett/Sæmundsson yang menghitung deviasi cahaya berdasarkan ketinggian geometris hilal. Hal ini sangat krusial karena hilal yang secara geometris berada di bawah ufuk bisa jadi terlihat secara visual karena pembiasan atmosfer.
25+
26+
## 🛠 Arsitektur Teknis: SPICE, CGO, & Thread-Safety
27+
28+
Sistem ini mengintegrasikan pustaka **CSPICE** (versi C dari toolkit SPICE NASA) ke dalam ekosistem **Golang** untuk mendapatkan akurasi tingkat tinggi yang setara dengan navigasi wahana antariksa.
29+
30+
### 1. Integrasi CGO
31+
32+
Karena CSPICE adalah pustaka berbasis C, kami menggunakan **CGO** sebagai jembatan. File `spice_bridge.go` bertindak sebagai *wrapper* yang memetakan fungsi-fungsi C (seperti `spkpos_c`, `str2et_c`, `furnsh_c`) ke fungsi Go. Hal ini memungkinkan logika bisnis kalender tetap berada di level tinggi (Go) sementara perhitungan geometri astronomi yang kompleks dilakukan oleh mesin SPICE yang sudah teruji.
33+
34+
### 2. Keterbatasan Thread-Safety
35+
36+
Pustaka CSPICE asli **tidak bersifat thread-safe**. Pustaka ini menggunakan variabel statis dan global internal untuk manajemen state (seperti error handling dan pool kernel). Jika dua goroutine mencoba memanggil fungsi SPICE secara bersamaan, hal ini dapat menyebabkan *memory corruption*, hasil kalkulasi yang tidak konsisten, atau aplikasi berhenti mendadak (*crash*).
37+
38+
### 3. Mekanisme `sync.Mutex`
39+
40+
Untuk mengatasi masalah keamanan thread tersebut, aplikasi ini menerapkan kebijakan **Global Lock** menggunakan `sync.Mutex` (didefinisikan sebagai `spiceMu`).
41+
42+
Setiap kali fungsi jembatan astronomi dipanggil:
43+
44+
1. `spiceMu.Lock()` dijalankan untuk memastikan hanya satu goroutine yang memiliki akses ke engine SPICE pada satu waktu.
45+
2. Fungsi internal SPICE dieksekusi melalui CGO.
46+
3. `spiceMu.Unlock()` (biasanya melalui `defer`) dijalankan segera setelah operasi selesai untuk memberikan giliran kepada goroutine lain.
47+
48+
**Dampak Performa:**
49+
Meskipun akses ke SPICE dilakukan secara berurutan (*serialized*), performa sistem tetap sangat tinggi. Hal ini dikarenakan:
50+
51+
- Operasi matematika SPICE sangat efisien dan berbasis memori.
52+
- Bottleneck aplikasi biasanya berada pada I/O jaringan, bukan pada kecepatan CPU dalam menghitung orbit.
53+
- Mekanisme ini jauh lebih aman dan stabil untuk lingkungan server yang melayani banyak permintaan secara konkuren.
54+
55+
## 🏗 Setup Environment CGO & CSPICE
56+
57+
Untuk mengompilasi proyek ini, sistem Anda harus memiliki compiler C (GCC/Clang) dan library CSPICE yang sudah terpasang di struktur folder yang benar.
58+
59+
### 1. Persyaratan Sistem
60+
61+
- **Linux/macOS**: GCC atau Clang terpasang.
62+
- **Windows**: MSYS2 atau MinGW-w64.
63+
- **Go**: Versi 1.25+ dengan `CGO_ENABLED=1`.
64+
65+
### 2. Download CSPICE Toolkit
66+
67+
Unduh toolkit sesuai dengan arsitektur sistem Anda dari NASA NAIF Website. [Klik di sini](https://naif.jpl.nasa.gov/pub/naif/toolkit/C/).
68+
69+
### 3. Struktur Direktori Library
70+
71+
Berdasarkan arahan `#cgo` di `core/astronomy/spice_bridge.go`, library harus diletakkan sebagai berikut:
72+
73+
```plaintext
74+
core/astronomy/
75+
├── include/ <-- Salin semua file .h dari direktori 'include' CSPICE
76+
│ ├── SpiceUsr.h
77+
│ ├── SpiceZpl.h
78+
│ └── ...
79+
├── lib/ <-- Salin file library (.a atau .so) dari direktori 'lib'
80+
│ ├── cspice.a
81+
│ └── csupport.a
82+
└── spice_bridge.go
83+
```
84+
85+
### 4. Kompilasi
86+
87+
Pastikan variabel lingkungan `CGO_ENABLED` aktif saat melakukan build:
88+
89+
```bash
90+
# Linux / macOS
91+
CGO_ENABLED=1 go build -o hilal-engine ./cmd/api
92+
93+
# Windows (PowerShell)
94+
$env:CGO_ENABLED="1"; go build -o hilal-engine.exe ./cmd/api
95+
```
96+
97+
*Catatan: Jika Anda menggunakan Docker, proses ini sudah diotomatisasi di dalam Dockerfile menggunakan multi-stage build untuk memastikan library C ter-link secara statis atau tersedia di runtime.*
98+
2199
## Catatan
22100

23101
- Sistem ini **tidak menggantikan observasi lapangan** (Rukyatul Hilal aktual).

docs/calendar-logic.md

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,18 @@ yang dikomputasi oleh API Golang v4.
1313
## Alur Orkestrasi (Service Layer)
1414

1515
1. Tentukan target `Date` (UTC) dan lokasi `Lat/Lon`.
16-
2. Hitung waktu sunset (Maghrib) lokal via Bisection Search 24H.
17-
3. Tentukan Ijtima (konjungsi) menggunakan pencarian dinamis (FindPreviousIjtima), bukan berdasarkan data tabular statis.
18-
4. Tentukan apakah waktu request *sebelum* atau *sesudah* Maghrib.
19-
5. Jalankan Evaluasi Multi-Metode:
20-
- **KHGT (Global)**: Melakukan scan global (65° LU/LS) untuk mencari terpenuhinya kriteria Turki 2016 sebelum dan sesudah 24:00 UTC, termasuk *override* Ijtima Selandia Baru. Menggunakan parameter **Geosentris**.
21-
- **Hisab Lokal**:
22-
- **MABIMS**: Menggunakan proyeksi **Toposentrik** (termasuk refraksi atmosfer untuk ketinggian nyata).
23-
- **Wujudul Hilal**: Menggunakan proyeksi **Geosentris**.
24-
- **Umm al-Qura**: Mencocokkan dengan standar observatorium Makkah (Toposentris).
16+
2. Ambil tanggal Hijriyah **Tabular** sebagai pijakan awal untuk estimasi bulan dan tahun (`baseH`).
17+
3. Cari waktu **Ijtima (Konjungsi)** sebelumnya dalam rentang 30 hari menggunakan `FindPreviousIjtima`.
18+
4. Tentukan waktu evaluasi (Sunset/Maghrib) berdasarkan kriteria:
19+
- **UMM_AL_QURA**: Lokasi Makkah.
20+
- **MABIMS**: Lokasi Sabang (titik barat Indonesia).
21+
- **Lokal**: Lokasi observer (`lat/lon`).
22+
- **KHGT**: Pemindaian Global (tidak terikat satu lokasi).
23+
5. Tentukan apakah waktu request *sebelum* atau *sesudah* Maghrib.
24+
6. Tentukan `monthStartDate` (H+1 atau H+2 dari Ijtima) berdasarkan hasil evaluasi kriteria (`isNewMonth`).
25+
7. Hitung selisih hari (`daysElapsed`) antara target dengan awal bulan.
26+
8. Lakukan koreksi **Rollover** (jika `hDay < 1` atau `hDay > 30`) untuk menyesuaikan bulan dan tahun secara dinamis.
2527

2628
## Mengatasi Limitasi "Hari H+1"
2729

28-
Sistem menggunakan fungsi pembantu `PredictHijriDate` untuk mengeliminasi statik +1 hari. Ini memastikan bulan ber-rollover dengan dinamis (menjadi hari ke-1 bulan selanjutnya) jika Hisab menyatakan wujud/imkanur rukyat, dan mengunci ke hari ke-30 (Istikmal) apabila tidak terlihat.
30+
Sistem secara dinamis menghitung hari Hijriyah (`hDay`) berdasarkan selisih waktu antara tanggal yang diminta dengan `monthStartDate` yang sudah dievaluasi. Logika ini memastikan pergantian bulan (rollover) terjadi secara akurat: menjadi hari ke-1 bulan selanjutnya jika kriteria hisab/rukyat terpenuhi, atau mengunci ke hari ke-30 (Istikmal) apabila hilal tidak terlihat. Penyesuaian bulan dan tahun juga dilakukan secara otomatis jika `hDay` berada di luar rentang bulan saat ini.

docs/hisab-vs-rukyat.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ Kalender Hijriyah API v4 tidak menyatukan Hisab dan Rukyat, melainkan menampilka
2121
- Diadopsi dari **Kongres Turki 2016**.
2222
- Bertujuan menyatukan kalender Islam sedunia menggunakan Hisab Imkanur Rukyat *Global*.
2323
- Kriteria global (Turki 2016):
24-
- Hilal harus mencapai **Elongasi ≥ 8°** dan **Altitude Geosentrik ≥ 5°** di *mana pun* di bumi sebelum pukul **24:00 UTC**.
24+
- Hilal harus mencapai **Elongasi ≥ 8°** dan **Altitude Geosentrik ≥ 5°** di belahan bumi *mana pun* sebelum pukul **24:00 UTC**.
2525
- **Pengecualian Rollover**: Jika kriteria di atas hanya terpenuhi *setelah* 24:00 UTC, bulan baru tetap masuk jika:
2626
1. Kriteria terpenuhi di wilayah **daratan Benua Amerika**.
27-
2. **Ijtimak** (konjungsi) terjadi sebelum fajar di **Selandia Baru**.
27+
2. **Ijtimak** (konjungsi) terjadi sebelum subuh di **Selandia Baru**.
2828

2929
## Implikasi API v4
3030

0 commit comments

Comments
 (0)