eksa-framework 3.3.3 โ†’ 3.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ac242785773ed45e2a702cc824fe9407b322eba723af008c531e5e4b79b3a30c
4
- data.tar.gz: 28ad3240e9d0cd86d1501ba998512d7e201f5bde405db5be6050c53ff4b56b56
3
+ metadata.gz: 240df13f36c40ffdbe4ca9da5ee387d88e72dcc7c9477978c55782959720badf
4
+ data.tar.gz: 64bada9f45b072af04bb8a126266cc1804f00800cd7bda47313e2f3e047dfb3d
5
5
  SHA512:
6
- metadata.gz: 1fa366903b127fc04b610d065d1e8fb4d15047e7111e7fbf4ab2332c7a2bd82e2f064dd564088db38d9aa07b25bfadf918fa6f1b08cb2318d45d33a97c27d7ac
7
- data.tar.gz: b1bb528e37369f1df59f5d54d6209fcc7e1b50cf535e421eeeee41a601faddcc64166bc27f10623ac14ab007fd8ee2755383bddef5052c8753e020f1f6a633f6
6
+ metadata.gz: 25b6d53915adb207cf3329e4c6cd865ff5d26612a6a28aebd02e6b9d6484fb74846fbd07e570a16a80bb0307d24c4361c1363a87e56cca45db6f7c2511a8148b
7
+ data.tar.gz: df3e0ef70c040658e0be92110bff33a39ab55a1e30af989834dd1f19f9291b3d5bdbdc545b84718d9b4aeba27f2f2cb264e0678e78ed56dabbdea575e90afaed
data/.eksa.json ADDED
@@ -0,0 +1,4 @@
1
+ {
2
+ "cms": true,
3
+ "auth": true
4
+ }
data/Gemfile CHANGED
@@ -10,4 +10,6 @@ gem 'puma'
10
10
  gem "rackup"
11
11
  gem 'sqlite3'
12
12
  gem 'kramdown'
13
- gem 'kramdown-parser-gfm'
13
+ gem 'kramdown-parser-gfm'
14
+ gem 'bcrypt', '~> 3.1'
15
+ gem 'rack-session', '~> 2.0'
data/Gemfile.lock CHANGED
@@ -1,6 +1,8 @@
1
1
  GEM
2
2
  remote: https://rubygems.org/
3
3
  specs:
4
+ base64 (0.3.0)
5
+ bcrypt (3.1.21)
4
6
  diff-lcs (1.6.2)
5
7
  kramdown (2.5.2)
6
8
  rexml (>= 3.4.4)
@@ -10,6 +12,9 @@ GEM
10
12
  puma (7.2.0)
11
13
  nio4r (~> 2.0)
12
14
  rack (3.2.5)
15
+ rack-session (2.1.1)
16
+ base64 (>= 0.1.0)
17
+ rack (>= 3.0.0)
13
18
  rack-test (2.2.0)
14
19
  rack (>= 1.3)
15
20
  rackup (2.3.1)
@@ -34,22 +39,27 @@ PLATFORMS
34
39
  x86_64-linux-gnu
35
40
 
36
41
  DEPENDENCIES
42
+ bcrypt (~> 3.1)
37
43
  kramdown
38
44
  kramdown-parser-gfm
39
45
  puma
40
46
  rack
47
+ rack-session (~> 2.0)
41
48
  rack-test (~> 2.1)
42
49
  rackup
43
50
  rspec (~> 3.12)
44
51
  sqlite3
45
52
 
46
53
  CHECKSUMS
54
+ base64 (0.3.0) sha256=27337aeabad6ffae05c265c450490628ef3ebd4b67be58257393227588f5a97b
55
+ bcrypt (3.1.21) sha256=5964613d750a42c7ee5dc61f7b9336fb6caca429ba4ac9f2011609946e4a2dcf
47
56
  diff-lcs (1.6.2) sha256=9ae0d2cba7d4df3075fe8cd8602a8604993efc0dfa934cff568969efb1909962
48
57
  kramdown (2.5.2) sha256=1ba542204c66b6f9111ff00dcc26075b95b220b07f2905d8261740c82f7f02fa
49
58
  kramdown-parser-gfm (1.1.0) sha256=fb39745516427d2988543bf01fc4cf0ab1149476382393e0e9c48592f6581729
50
59
  nio4r (2.7.5) sha256=6c90168e48fb5f8e768419c93abb94ba2b892a1d0602cb06eef16d8b7df1dca1
51
60
  puma (7.2.0) sha256=bf8ef4ab514a4e6d4554cb4326b2004eba5036ae05cf765cfe51aba9706a72a8
52
61
  rack (3.2.5) sha256=4cbd0974c0b79f7a139b4812004a62e4c60b145cba76422e288ee670601ed6d3
62
+ rack-session (2.1.1) sha256=0b6dc07dea7e4b583f58a48e8b806d4c9f1c6c9214ebc202ec94562cbea2e4e9
53
63
  rack-test (2.2.0) sha256=005a36692c306ac0b4a9350355ee080fd09ddef1148a5f8b2ac636c720f5c463
54
64
  rackup (2.3.1) sha256=6c79c26753778e90983761d677a48937ee3192b3ffef6bc963c0950f94688868
55
65
  rexml (3.4.4) sha256=19e0a2c3425dfbf2d4fc1189747bdb2f849b6c5e74180401b15734bc97b5d142
data/README.md CHANGED
@@ -16,6 +16,8 @@
16
16
  * ๐Ÿ› ๏ธ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, dan **auto-routing** otomatis.
17
17
  * ๐Ÿ’พ **Dynamic Database Engine**: Database SQLite otomatis dengan schema yang ditentukan oleh model Anda sendiri.
18
18
  * ๐Ÿงช **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
19
+ * ๐Ÿ›ก๏ธ **Built-in Authentication**: Sistem keamanan BCrypt dengan proteksi sesi Rack untuk registrasi log-in area Admin.
20
+ * ๐Ÿ“ **Interactive CMS Dashboard**: Panel admin integratif untuk mengedit isi blog Markdown & transisi visibilitas via UI.
19
21
  * ๐ŸŽจ **Asset Helpers**: Library bawaan untuk pengelolaan CSS dan JS yang lebih rapi.
20
22
  * ๐Ÿ” **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt` dan `sitemap.xml`.
21
23
  * ๐Ÿ’Ž **JSON-LD Support**: Dukungan data terstruktur (Structured Data) otomatis untuk SEO yang lebih optimal.
@@ -70,9 +72,24 @@ eksa g model Post
70
72
 
71
73
  # Membuat postingan blog baru dengan meta tambahan
72
74
  eksa g post "Judul Artikel" --category "Kategori" --author "Nama Penulis" --image "url-gambar.jpg"
75
+
76
+ # Mengaktifkan/menonaktifkan fitur bawaan Eksa (auth / cms)
77
+ eksa feature enable auth
78
+ eksa feature enable cms
79
+
80
+ # Mengatur ulang sandi akun admin CMS langsung dari CLI
81
+ eksa reset-password admin PasswordBaru123
73
82
  ```
74
83
 
75
- ### 3. Markdown Blog Engine
84
+ ### 3. CMS Dashboard & Authentication
85
+ Eksa hadir dengan sistem manajemen konten internal bergaya Glassmorphism.
86
+
87
+ * **Aktivasi**: Pertama, jalankan `eksa feature enable auth` dan `eksa feature enable cms` dari terminal Anda lalu *restart* server.
88
+ * **Registrasi**: Akses `http://localhost:9292/auth/register` (Hanya akun pertama yang bisa mendaftar sebagai Administrator).
89
+ * **Akses Dasbor**: Masuk ke rute `/cms` untuk melihat postingan, mengubah status publikasi (*Draft* / *Aktif*), menghapus postingan, hingga melakukan edit data via editor terintegrasi.
90
+ * **Proteksi Taut**: Rute login dan CMS sepenuhnya difilter oleh perantara otentikasi sesi Rack. Admin yang berhasil masuk secara otomatis terlindungi dari paparan rute login berlebih.
91
+
92
+ ### 4. Markdown Blog Engine
76
93
  Eksa memiliki sistem blog bawaan yang cara kerjanya mirip Jekyll. Cukup buat file `.md` di folder `_posts/` dengan metadata YAML (Front Matter):
77
94
 
78
95
  ```markdown
@@ -1,129 +1,148 @@
1
1
  ---
2
- title: "Welcome To Eksa Framework"
3
- date: 2026-03-15 14:09:58
4
- author: "IshikawaUta"
5
- category: "Framework"
6
- image: "https://res.cloudinary.com/dzsqaauqn/image/upload/v1773645204/logo_ne3hy4.png"
2
+ published: true
3
+ title: Welcome To Eksa Framework
4
+ date: 2026-03-15 21:09:58.000000000 +07:00
5
+ author: IshikawaUta
6
+ category: Framework
7
+ image: https://res.cloudinary.com/dzsqaauqn/image/upload/v1773645204/logo_ne3hy4.png
7
8
  ---
8
9
 
9
- # โœจ Eksa Framework
10
-
11
- **Eksa Framework** adalah *micro-framework* MVC (Model-View-Controller) modern yang dibangun di atas Ruby dan Rack. Didesain untuk pengembang yang menginginkan kecepatan, kode yang bersih, dan tampilan antarmuka **Glassmorphism** yang elegan secara *out-of-the-box*.
12
-
13
- ---
14
-
15
- ## ๐Ÿš€ Fitur Unggulan
16
-
17
- * ๐Ÿ’Ž **Modern Glassmorphism UI**: Tampilan transparan yang indah dengan Tailwind CSS & Lucide Icons.
18
- * โšก **Rack 3 & Middleware Support**: Mendukung standar terbaru dan pembuatan pipeline middleware kustom.
19
- * ๐Ÿ› ๏ธ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, dan **auto-routing** otomatis.
20
- * ๐Ÿ’พ **Dynamic Database Engine**: Database SQLite otomatis dengan schema yang ditentukan oleh model Anda sendiri.
21
- * ๐Ÿงช **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
22
- * ๐ŸŽจ **Asset Helpers**: Library bawaan untuk pengelolaan CSS dan JS yang lebih rapi.
23
- * ๐Ÿ” **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt` dan `sitemap.xml`.
24
- * ๐Ÿ‘ป **Aesthetic Error Pages**: Halaman 404 dengan desain Glassmorphism yang elegan secara native.
25
-
26
- ---
27
-
28
- ## ๐Ÿ› ๏ธ Instalasi Cepat
29
-
30
- ### 1. Install via Gem
31
- ```bash
32
- gem install eksa-framework
33
- ```
34
-
35
- ### 2. Inisialisasi Project Baru
36
- ```bash
37
- mkdir my-app && cd my-app
38
- eksa init
39
- ```
40
-
41
- ### 3. Jalankan Server
42
- ```bash
43
- bundle install
44
- eksa run
45
- ```
46
-
47
- ---
48
-
49
- ## ๐Ÿ’ป Panduan Pengembangan
50
-
51
- ### 1. Konfigurasi Aplikasi (`config.ru`)
52
- Eksa kini menggunakan blok inisialisasi untuk konfigurasi yang lebih fleksibel:
53
-
54
- ```ruby
55
- app = Eksa::Application.new do |config|
56
- config.config[:db_path] = "./db/production.db"
57
-
58
- config.use Rack::Static, urls: ["/css", "/img"], root: "public"
59
- config.use Rack::ShowExceptions
60
- end
61
- ```
62
-
63
- ### 2. CLI Generator
64
- Hemat waktu dengan menggunakan generator bawaan:
65
-
66
- ```bash
67
- # Membuat controller dan view template
68
- eksa g controller Blog
69
-
70
- # Membuat model dan schema database
71
- eksa g model Post
72
-
73
- # Membuat postingan blog baru
74
- eksa g post "Judul Artikel"
75
- ```
76
-
77
- ### 3. Markdown Blog Engine
78
- Eksa memiliki sistem blog bawaan yang cara kerjanya mirip Jekyll. Cukup buat file `.md` di folder `_posts/` dengan metadata YAML (Front Matter):
79
-
80
- ```markdown
81
- ---
82
- title: "Halo Eksa"
83
- date: 2026-03-15 14:00:00
84
- ---
85
-
86
- Isi konten blog menggunakan **Markdown**.
87
- ```
88
-
89
- Fitur Blog:
90
- * **Dynamic Slug**: Otomatis mengenali rute `/posts/:slug`.
91
- * **Syntax Highlighting**: Kode di dalam blog otomatis berwarna & punya tombol copy.
92
- * **Aesthetic UI**: Template blog bawaan dengan desain Glassmorphism.
93
-
94
- ### 4. Database & Model
95
- Definisikan schema tabel Anda langsung di dalam model:
96
-
97
- ```ruby
98
- class Post < Eksa::Model
99
- def self.setup_schema
100
- db.execute <<~SQL
101
- CREATE TABLE IF NOT EXISTS posts (
102
- id INTEGER PRIMARY KEY AUTOINCREMENT,
103
- title TEXT,
104
- content TEXT
105
- )
106
- SQL
107
- end
108
- end
109
- ```
110
-
111
- ### 4. Asset Helpers
112
- Gunakan helper di dalam view untuk menyisipkan asset:
113
-
114
- ```erb
115
- <%= stylesheet_tag "style" %>
116
- <%= javascript_tag "app" %>
117
- ```
118
-
119
- ### 5. Menjalankan Test
120
- Pastikan aplikasi Anda berjalan dengan benar menggunakan RSpec:
121
-
122
- ```bash
123
- bundle exec rspec
124
- ```
125
-
126
- ---
127
-
128
- ## ๐Ÿ“œ Lisensi
129
- Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](https://github.com/IshikawaUta/eksa-framework/blob/8c8e9046cbce77bbeaeaf673b018eaf0c6db2bbc/LICENSE) untuk detail lebih lanjut.
10
+ # โœจ Eksa Framework
11
+
12
+ **Eksa Framework** adalah *micro-framework* MVC (Model-View-Controller) modern yang dibangun di atas Ruby dan Rack. Didesain untuk pengembang yang menginginkan kecepatan, kode yang bersih, dan tampilan antarmuka **Glassmorphism** yang elegan secara *out-of-the-box*.
13
+
14
+ ---
15
+
16
+ ## ๐Ÿš€ Fitur Unggulan
17
+
18
+ * ๐Ÿ’Ž **Modern Glassmorphism UI**: Tampilan transparan yang indah dengan Tailwind CSS & Lucide Icons.
19
+ * โšก **Rack 3 & Middleware Support**: Mendukung standar terbaru dan pembuatan pipeline middleware kustom.
20
+ * ๐Ÿ› ๏ธ **Powerful CLI**: Inisialisasi project (`eksa init`), jalankan server (`eksa run`), generate komponen, dan **auto-routing** otomatis.
21
+ * ๐Ÿ’พ **Dynamic Database Engine**: Database SQLite otomatis dengan schema yang ditentukan oleh model Anda sendiri.
22
+ * ๐Ÿงช **Built-in Testing**: Lingkungan pengujian otomatis siap pakai menggunakan RSpec dan `rack-test`.
23
+ * ๐Ÿ›ก๏ธ **Built-in Authentication**: Sistem keamanan BCrypt dengan proteksi sesi Rack untuk registrasi log-in area Admin.
24
+ * ๐Ÿ“ **Interactive CMS Dashboard**: Panel admin integratif untuk mengedit isi blog Markdown & transisi visibilitas via UI.
25
+ * ๐ŸŽจ **Asset Helpers**: Library bawaan untuk pengelolaan CSS dan JS yang lebih rapi.
26
+ * ๐Ÿ” **Dynamic SEO Engine**: Penanganan otomatis file `robots.txt` dan `sitemap.xml`.
27
+ * ๐Ÿ’Ž **JSON-LD Support**: Dukungan data terstruktur (Structured Data) otomatis untuk SEO yang lebih optimal.
28
+ * ๐Ÿ‘ป **Aesthetic Error Pages**: Halaman 404 dengan desain Glassmorphism yang elegan secara native.
29
+
30
+ ---
31
+
32
+ ## ๐Ÿ› ๏ธ Instalasi Cepat
33
+
34
+ ### 1. Install via Gem
35
+ ```bash
36
+ gem install eksa-framework
37
+ ```
38
+
39
+ ### 2. Inisialisasi Project Baru
40
+ ```bash
41
+ mkdir my-app && cd my-app
42
+ eksa init
43
+ ```
44
+
45
+ ### 3. Jalankan Server
46
+ ```bash
47
+ bundle install
48
+ eksa run
49
+ ```
50
+
51
+ ---
52
+
53
+ ## ๐Ÿ’ป Panduan Pengembangan
54
+
55
+ ### 1. Konfigurasi Aplikasi (`config.ru`)
56
+ Eksa kini menggunakan blok inisialisasi untuk konfigurasi yang lebih fleksibel:
57
+
58
+ ```ruby
59
+ app = Eksa::Application.new do |config|
60
+ config.config[:db_path] = "./db/production.db"
61
+
62
+ config.use Rack::Static, urls: ["/css", "/img"], root: "public"
63
+ config.use Rack::ShowExceptions
64
+ end
65
+ ```
66
+
67
+ ### 2. CLI Generator
68
+ Hemat waktu dengan menggunakan generator bawaan:
69
+
70
+ ```bash
71
+ # Membuat controller dan view template
72
+ eksa g controller Blog
73
+
74
+ # Membuat model dan schema database
75
+ eksa g model Post
76
+
77
+ # Membuat postingan blog baru dengan meta tambahan
78
+ eksa g post "Judul Artikel" --category "Kategori" --author "Nama Penulis" --image "url-gambar.jpg"
79
+
80
+ # Mengaktifkan/menonaktifkan fitur bawaan Eksa (auth / cms)
81
+ eksa feature enable auth
82
+ eksa feature enable cms
83
+
84
+ # Mengatur ulang sandi akun admin CMS langsung dari CLI
85
+ eksa reset-password admin PasswordBaru123
86
+ ```
87
+
88
+ ### 3. CMS Dashboard & Authentication
89
+ Eksa hadir dengan sistem manajemen konten internal bergaya Glassmorphism.
90
+
91
+ * **Aktivasi**: Pertama, jalankan `eksa feature enable auth` dan `eksa feature enable cms` dari terminal Anda lalu *restart* server.
92
+ * **Registrasi**: Akses `http://localhost:9292/auth/register` (Hanya akun pertama yang bisa mendaftar sebagai Administrator).
93
+ * **Akses Dasbor**: Masuk ke rute `/cms` untuk melihat postingan, mengubah status publikasi (*Draft* / *Aktif*), menghapus postingan, hingga melakukan edit data via editor terintegrasi.
94
+ * **Proteksi Taut**: Rute login dan CMS sepenuhnya difilter oleh perantara otentikasi sesi Rack. Admin yang berhasil masuk secara otomatis terlindungi dari paparan rute login berlebih.
95
+
96
+ ### 4. Markdown Blog Engine
97
+ Eksa memiliki sistem blog bawaan yang cara kerjanya mirip Jekyll. Cukup buat file `.md` di folder `_posts/` dengan metadata YAML (Front Matter):
98
+
99
+ ```markdown
100
+ ---
101
+ title: "Halo Eksa"
102
+ date: 2026-03-15 14:00:00
103
+ ---
104
+
105
+ Isi konten blog menggunakan **Markdown**.
106
+ ```
107
+
108
+ Fitur Blog:
109
+ * **Dynamic Slug**: Otomatis mengenali rute `/posts/:slug`.
110
+ * **Syntax Highlighting**: Kode di dalam blog otomatis berwarna & punya tombol copy.
111
+ * **Aesthetic UI**: Template blog bawaan dengan desain Glassmorphism.
112
+
113
+ ### 4. Database & Model
114
+ Definisikan schema tabel Anda langsung di dalam model:
115
+
116
+ ```ruby
117
+ class Post < Eksa::Model
118
+ def self.setup_schema
119
+ db.execute <<~SQL
120
+ CREATE TABLE IF NOT EXISTS posts (
121
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
122
+ title TEXT,
123
+ content TEXT
124
+ )
125
+ SQL
126
+ end
127
+ end
128
+ ```
129
+
130
+ ### 4. Asset Helpers
131
+ Gunakan helper di dalam view untuk menyisipkan asset:
132
+
133
+ ```erb
134
+ <%= stylesheet_tag "style" %>
135
+ <%= javascript_tag "app" %>
136
+ ```
137
+
138
+ ### 5. Menjalankan Test
139
+ Pastikan aplikasi Anda berjalan dengan benar menggunakan RSpec:
140
+
141
+ ```bash
142
+ bundle exec rspec
143
+ ```
144
+
145
+ ---
146
+
147
+ ## ๐Ÿ“œ Lisensi
148
+ Proyek ini dilisensikan di bawah **MIT License**. Lihat file [LICENSE](https://github.com/IshikawaUta/eksa-framework/blob/main/LICENSE) untuk detail lebih lanjut.
@@ -7,20 +7,40 @@
7
7
  </div>
8
8
 
9
9
  <div class="space-y-6 text-white/80 leading-relaxed">
10
- <p class="text-lg">
11
- <strong>Eksa Framework</strong> adalah sebuah <strong>micro-framework</strong> Ruby yang dibangun dari nol untuk mendemonstrasikan kekuatan arsitektur MVC dan kesederhanaan Ruby.
10
+ <p class="text-lg text-center mx-auto max-w-2xl mb-10">
11
+ <strong>Eksa Framework v3.4.3</strong> adalah <strong>micro-framework</strong> Ruby yang dibangun dari nol untuk mendemonstrasikan kekuatan arsitektur MVC, kesederhanaan Ruby, dengan keindahan antarmuka-antarmuka UI masa kini.
12
12
  </p>
13
13
 
14
- <div class="grid grid-cols-1 md:grid-cols-2 gap-4 mt-8">
15
- <div class="bg-white/5 p-6 rounded-2xl border border-white/10">
14
+ <div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6 mt-8">
15
+ <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
16
16
  <i data-lucide="cpu" class="w-6 h-6 text-indigo-300 mb-3"></i>
17
- <h3 class="font-bold text-white mb-2">Core Ruby</h3>
18
- <p class="text-sm">Dibangun di atas Rack tanpa menggunakan framework besar lainnya.</p>
17
+ <h3 class="font-bold text-white mb-2">Core Ruby & Rack 3</h3>
18
+ <p class="text-sm">Dibangun di atas standar industri Rack tanpa bloatware framework berlapis.</p>
19
19
  </div>
20
- <div class="bg-white/5 p-6 rounded-2xl border border-white/10">
21
- <i data-lucide="database" class="w-6 h-6 text-indigo-300 mb-3"></i>
22
- <h3 class="font-bold text-white mb-2">SQLite Engine</h3>
23
- <p class="text-sm">Penyimpanan data yang ringan, cepat, dan handal.</p>
20
+ <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
21
+ <i data-lucide="database" class="w-6 h-6 text-emerald-300 mb-3"></i>
22
+ <h3 class="font-bold text-white mb-2">Auto SQLite Engine</h3>
23
+ <p class="text-sm">Penyimpanan otomatis via model ringan dengan performa memori memukau.</p>
24
+ </div>
25
+ <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
26
+ <i data-lucide="layout-template" class="w-6 h-6 text-cyan-300 mb-3"></i>
27
+ <h3 class="font-bold text-white mb-2">Glassmorphism UI</h3>
28
+ <p class="text-sm">Komponen estetis bergaya efek kaca bawaan <strong>frosted-glass</strong>.</p>
29
+ </div>
30
+ <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
31
+ <i data-lucide="pen-tool" class="w-6 h-6 text-yellow-300 mb-3"></i>
32
+ <h3 class="font-bold text-white mb-2">Markdown Blog</h3>
33
+ <p class="text-sm">Sistem artikel statis lengkap Front Matter YAML & Auto-Routing layaknya Jekyll.</p>
34
+ </div>
35
+ <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
36
+ <i data-lucide="shield-check" class="w-6 h-6 text-rose-300 mb-3"></i>
37
+ <h3 class="font-bold text-white mb-2">Secure Auth</h3>
38
+ <p class="text-sm">Otentikasi basis sessi pintar BCrypt untuk proteksi admin panel berlapis.</p>
39
+ </div>
40
+ <div class="bg-white/5 p-6 rounded-2xl border border-white/10 hover:bg-white/10 transition">
41
+ <i data-lucide="layout-dashboard" class="w-6 h-6 text-fuchsia-300 mb-3"></i>
42
+ <h3 class="font-bold text-white mb-2">CMS Dashboard</h3>
43
+ <p class="text-sm">Pusat kendali admin internal untuk edit Markdown via <strong>web page</strong> langsung.</p>
24
44
  </div>
25
45
  </div>
26
46
  </div>
@@ -30,6 +30,7 @@
30
30
  <li><a href="#database" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="database" class="w-3 h-3"></i> Auto-Migration</a></li>
31
31
  <li><a href="#flash" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="bell" class="w-3 h-3"></i> Flash UI</a></li>
32
32
  <li><a href="#blog" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="pen-tool" class="w-3 h-3"></i> Markdown Blog</a></li>
33
+ <li><a href="#cms" class="hover:text-indigo-300 transition flex items-center gap-2"><i data-lucide="layout-dashboard" class="w-3 h-3"></i> CMS & Auth</a></li>
33
34
  </ul>
34
35
  </div>
35
36
  </div>
@@ -147,6 +148,24 @@
147
148
  </div>
148
149
  </section>
149
150
 
151
+ <section id="cms" class="mb-12 scroll-mt-24">
152
+ <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
153
+ <i data-lucide="layout-dashboard" class="w-6 h-6 text-indigo-400"></i> CMS Dashboard & Keamanan
154
+ </h2>
155
+ <p class="text-white/60 mb-4 text-sm">Eksa difasilitasi dengan area protektif yang dapat dilalui pendaftaran mandiri jika belum ada entitas pendaftar, kemudian dikunci menggunakan otentikasi Rack + enkripsi BCrypt.</p>
156
+ <div class="bg-black/40 rounded-2xl p-6 font-mono text-sm border border-white/10">
157
+ <p class="text-white/30"># Menghidupkan Engine Utama dari folder project</p>
158
+ <p class="text-indigo-300">eksa feature enable auth</p>
159
+ <p class="text-indigo-300">eksa feature enable cms</p>
160
+ <p class="text-white/30 mt-4"># Lupa sandi masuk halaman CMS?</p>
161
+ <p class="text-indigo-300">eksa reset-password usernameanda katasandibaru</p>
162
+ </div>
163
+ <div class="mt-4 p-4 bg-emerald-500/10 border border-emerald-500/20 rounded-xl flex items-center gap-3">
164
+ <i data-lucide="shield-check" class="w-5 h-5 text-emerald-400"></i>
165
+ <p class="text-xs text-emerald-200/80">Jika integrasi Auth diaktifkan, masuklah ke URL <code class="text-white">/auth/register</code> saat pertama kali start. Setelah mendaftar The Vault (Dashboard) dapat diakses lewat <code class="text-white">/cms</code></p>
166
+ </div>
167
+ </section>
168
+
150
169
  <section id="build" class="mb-12 scroll-mt-24">
151
170
  <h2 class="text-2xl font-bold mb-4 flex items-center gap-2">
152
171
  <i data-lucide="package-check" class="w-6 h-6 text-indigo-400"></i> Build & Publish
@@ -155,7 +174,7 @@
155
174
  <p class="text-white/30"># Build gem lokal</p>
156
175
  <p class="text-indigo-300">gem build eksa-framework.gemspec</p>
157
176
  <p class="text-white/30 mt-4"># Publish ke RubyGems / GitHub Packages</p>
158
- <p class="text-indigo-300">gem push eksa-framework-3.3.3.gem</p>
177
+ <p class="text-indigo-300">gem push eksa-framework-3.4.3.gem</p>
159
178
  </div>
160
179
  </section>
161
180
 
@@ -164,7 +183,7 @@
164
183
  <span class="bg-indigo-500/20 text-indigo-300 text-[10px] px-3 py-1 rounded-full border border-indigo-500/30 uppercase tracking-tighter">Rack 3.0 Compatible</span>
165
184
  <span class="bg-emerald-500/20 text-emerald-300 text-[10px] px-3 py-1 rounded-full border border-emerald-500/30 uppercase tracking-tighter">SQLite3 Auto-Ready</span>
166
185
  </div>
167
- <p class="text-white/40 text-sm italic">Eksa Framework v3.3.3 Alpha Documentation</p>
186
+ <p class="text-white/40 text-sm italic">Eksa Framework v3.4.3 Alpha Documentation</p>
168
187
  <a href="/" class="inline-block mt-6 text-indigo-300 hover:text-white transition font-bold flex items-center justify-center gap-2">
169
188
  <i data-lucide="arrow-left" class="w-4 h-4"></i> Kembali ke Beranda
170
189
  </a>
@@ -2,7 +2,7 @@
2
2
  <div class="flex flex-col md:flex-row justify-between items-start md:items-center mb-8 gap-4">
3
3
  <div>
4
4
  <span class="inline-block bg-indigo-500/20 text-indigo-200 text-xs font-bold px-3 py-1 rounded-full mb-3 border border-indigo-500/30">
5
- v3.3.3 Alpha
5
+ v3.4.3 Alpha
6
6
  </span>
7
7
  <h1 class="text-4xl font-extrabold tracking-tight">
8
8
  Halo, <span class="text-indigo-300"><%= @nama %></span>!
data/exe/eksa CHANGED
@@ -11,6 +11,8 @@ def usage
11
11
  puts " eksa g controller NAME - Generate controller baru"
12
12
  puts " eksa g model NAME - Generate model baru"
13
13
  puts " eksa g post TITLE - Post baru [args: --category, --author, --image]"
14
+ puts " eksa feature ACTION F - Toggle fitur: action=enable/disable, F=cms/auth"
15
+ puts " eksa reset-password USR PWD - Reset password akun admin"
14
16
  puts " eksa run - Jalankan server aplikasi"
15
17
  puts "-----------------------------\n"
16
18
  end
@@ -142,6 +144,67 @@ def generate_post(title, options = {})
142
144
  puts " [OK] Created #{filename}"
143
145
  end
144
146
 
147
+ def toggle_feature(action, feature)
148
+ valid_features = ['cms', 'auth']
149
+
150
+ unless valid_features.include?(feature)
151
+ puts "โŒ Error: Fitur tidak dikenali. Pilihan: #{valid_features.join(', ')}"
152
+ return
153
+ end
154
+
155
+ unless ['enable', 'disable'].include?(action)
156
+ puts "โŒ Error: Aksi tidak dikenali. Gunakan 'enable' atau 'disable'."
157
+ return
158
+ end
159
+
160
+ config_path = File.join(Dir.pwd, '.eksa.json')
161
+
162
+ begin
163
+ config = File.exist?(config_path) ? JSON.parse(File.read(config_path)) : { 'cms' => false, 'auth' => false }
164
+ rescue JSON::ParserError
165
+ config = { 'cms' => false, 'auth' => false }
166
+ end
167
+
168
+ config[feature] = (action == 'enable')
169
+
170
+ File.write(config_path, JSON.pretty_generate(config))
171
+
172
+ status_color = action == 'enable' ? "โœ… Aktif" : "๐Ÿšซ Nonaktif"
173
+ puts "โš™๏ธ Fitur '#{feature}' berhasil di #{status_color}."
174
+
175
+ if action == 'enable' && feature == 'cms'
176
+ puts " Tip: Pastikan Anda juga mengaktifkan 'auth' agar CMS Anda aman."
177
+ end
178
+ end
179
+
180
+ def reset_password(username, password)
181
+ require 'bcrypt'
182
+ require 'sqlite3'
183
+ db_path = File.join(Dir.pwd, 'db', 'eksa_app.db')
184
+
185
+ unless File.exist?(db_path)
186
+ puts "โŒ Error: Database tidak ditemukan. Pastikan project sudah diinisialisasi."
187
+ return
188
+ end
189
+
190
+ db = SQLite3::Database.new(db_path)
191
+
192
+ begin
193
+ user = db.execute("SELECT id FROM eksa_users WHERE username = ? LIMIT 1", [username]).first
194
+ rescue SQLite3::SQLException
195
+ puts "โŒ Error: Tabel user tidak ditemukan. Apakah Anda sudah mengaktifkan auth?"
196
+ return
197
+ end
198
+
199
+ if user
200
+ hash = BCrypt::Password.create(password)
201
+ db.execute("UPDATE eksa_users SET password_hash = ? WHERE username = ?", [hash, username])
202
+ puts "โœ… Akses dipulihkan! Password untuk admin '#{username}' berhasil diubah."
203
+ else
204
+ puts "โŒ Error: User '#{username}' tidak ditemukan dalam database."
205
+ end
206
+ end
207
+
145
208
  def start_server
146
209
  if File.exist?('config.ru')
147
210
  puts "๐Ÿš€ Memulai Eksa Framework Server..."
@@ -179,6 +242,23 @@ when 'g', 'generate'
179
242
  else
180
243
  usage
181
244
  end
245
+ when 'feature'
246
+ action = ARGV.shift
247
+ feature = ARGV.shift
248
+ if action && feature
249
+ require 'json'
250
+ toggle_feature(action, feature)
251
+ else
252
+ usage
253
+ end
254
+ when 'reset-password'
255
+ username = ARGV.shift
256
+ password = ARGV.shift
257
+ if username && password
258
+ reset_password(username, password)
259
+ else
260
+ puts "โŒ Error: Argumen tidak lengkap. Gunakan: eksa reset-password USERNAME NEW_PASSWORD"
261
+ end
182
262
  else
183
263
  usage
184
264
  end
@@ -0,0 +1,50 @@
1
+ module Eksa
2
+ class AuthController < Eksa::Controller
3
+ def login
4
+ return redirect_to "/cms" if current_user
5
+ render_internal 'auth/login'
6
+ end
7
+
8
+ def register
9
+ return redirect_to "/cms" if current_user
10
+ @admin_exists = Eksa::User.all.any?
11
+ render_internal 'auth/register'
12
+ end
13
+
14
+ def process_login
15
+ username = params['username']
16
+ password = params['password']
17
+
18
+ user = Eksa::User.authenticate(username, password)
19
+ if user
20
+ session['user_id'] = user[:id]
21
+ redirect_to "/cms", notice: "Selamat datang kembali, #{username}!"
22
+ else
23
+ redirect_to "/auth/login", notice: "Username atau password salah."
24
+ end
25
+ end
26
+
27
+ def process_register
28
+ if Eksa::User.all.any?
29
+ return redirect_to "/auth/login", notice: "Registrasi ditutup. Hanya satu admin yang diizinkan."
30
+ end
31
+
32
+ username = params['username']
33
+ password = params['password']
34
+
35
+ if username && !username.empty? && password && password.length >= 6
36
+ Eksa::User.create(username, password)
37
+ user = Eksa::User.authenticate(username, password)
38
+ session['user_id'] = user[:id]
39
+ redirect_to "/cms", notice: "Akun berhasil dibuat. Selamat datang!"
40
+ else
41
+ redirect_to "/auth/register", notice: "Data tidak valid. Password minimal 6 karakter."
42
+ end
43
+ end
44
+
45
+ def logout
46
+ session.delete('user_id')
47
+ redirect_to "/", notice: "Anda telah berhasil logout."
48
+ end
49
+ end
50
+ end