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 +4 -4
- data/.eksa.json +4 -0
- data/Gemfile +3 -1
- data/Gemfile.lock +10 -0
- data/README.md +18 -1
- data/_posts/2026-03-15-welcome-to-eksa-framework.md +145 -126
- data/app/views/about.html.erb +30 -10
- data/app/views/docs.html.erb +21 -2
- data/app/views/index.html.erb +1 -1
- data/exe/eksa +80 -0
- data/lib/eksa/auth_controller.rb +50 -0
- data/lib/eksa/cms_controller.rb +110 -0
- data/lib/eksa/controller.rb +32 -6
- data/lib/eksa/markdown_post.rb +11 -4
- data/lib/eksa/user.rb +47 -0
- data/lib/eksa/version.rb +1 -1
- data/lib/eksa/views/auth/login.html.erb +44 -0
- data/lib/eksa/views/auth/register.html.erb +53 -0
- data/lib/eksa/views/cms/edit.html.erb +63 -0
- data/lib/eksa/views/cms/index.html.erb +83 -0
- data/lib/eksa.rb +48 -3
- metadata +37 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 240df13f36c40ffdbe4ca9da5ee387d88e72dcc7c9477978c55782959720badf
|
|
4
|
+
data.tar.gz: 64bada9f45b072af04bb8a126266cc1804f00800cd7bda47313e2f3e047dfb3d
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 25b6d53915adb207cf3329e4c6cd865ff5d26612a6a28aebd02e6b9d6484fb74846fbd07e570a16a80bb0307d24c4361c1363a87e56cca45db6f7c2511a8148b
|
|
7
|
+
data.tar.gz: df3e0ef70c040658e0be92110bff33a39ab55a1e30af989834dd1f19f9291b3d5bdbdc545b84718d9b4aeba27f2f2cb264e0678e78ed56dabbdea575e90afaed
|
data/.eksa.json
ADDED
data/Gemfile
CHANGED
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.
|
|
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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
config.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
# Membuat
|
|
71
|
-
eksa g
|
|
72
|
-
|
|
73
|
-
# Membuat
|
|
74
|
-
eksa g
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
* **
|
|
91
|
-
* **
|
|
92
|
-
* **
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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.
|
data/app/views/about.html.erb
CHANGED
|
@@ -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
|
|
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-
|
|
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
|
|
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-
|
|
22
|
-
<h3 class="font-bold text-white mb-2">SQLite Engine</h3>
|
|
23
|
-
<p class="text-sm">Penyimpanan
|
|
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>
|
data/app/views/docs.html.erb
CHANGED
|
@@ -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.
|
|
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.
|
|
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>
|
data/app/views/index.html.erb
CHANGED
|
@@ -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.
|
|
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
|