Aplikasi Personal Notes adalah aplikasi manajemen catatan pribadi yang aman dengan enkripsi end-to-end. Aplikasi ini memungkinkan pengguna untuk membuat, membaca, memperbarui, dan menghapus catatan pribadi serta mengorganisirnya dalam kategori.
- End-to-End Encryption: Semua data sensitif dienkripsi menggunakan AES-256 dan Base64 encoding.
- Key Management: Antarmuka untuk menghasilkan dan mengelola kunci enkripsi.
- Validasi Keamanan: Indikator status enkripsi dan pembatasan akses.
- Manajemen Catatan: Operasi CRUD lengkap untuk catatan dengan prioritas dan tag.
- Manajemen Kategori: Organisasi catatan berdasarkan kategori.
- Pencarian: Kemampuan mencari catatan berdasarkan subjek dan konten.
- Pembatasan Data: Opsi untuk membatasi jumlah catatan yang ditampilkan.
- Activity Logging: Pencatatan semua aktivitas sistem dengan timestamp dan informasi klien.
- UI Responsif: Antarmuka pengguna modern yang bekerja di berbagai perangkat.
- Notifikasi Toast: Umpan balik pengguna melalui notifikasi toast.
- Dialog Modal: Form dan konfirmasi menggunakan dialog modal.
- Penanganan Error: Pesan error yang informatif dan penanganan kesalahan yang baik.
- Backend: Go (Golang) dengan Gin framework
- Database: SQLite
- Frontend: HTML, CSS, JavaScript (Vanilla)
- Enkripsi: AES-256 dengan GCM mode
- Encoding: Base64
personal-notes-with-go/
├── database/
│ └── db.go # Inisialisasi database dan pembuatan tabel
├── frontend/ # Aplikasi frontend
│ ├── css/
│ │ └── styles.css # Semua style untuk aplikasi
│ ├── js/
│ │ ├── components/ # Komponen UI
│ │ │ ├── notes.js # Komponen catatan
│ │ │ ├── categories.js # Komponen kategori
│ │ │ ├── activity-logs.js # Komponen log aktivitas
│ │ │ └── key-generator.js # Komponen pembangkit kunci
│ │ ├── services/ # Layanan bersama
│ │ │ ├── api.js # Layanan komunikasi API
│ │ │ ├── toast.js # Layanan notifikasi toast
│ │ │ └── encryption-status.js # Layanan status enkripsi
│ │ └── app.js # Logika aplikasi utama
│ └── index.html # File HTML utama
├── handlers/
│ ├── activity_log_handler.go # Handler untuk log aktivitas
│ ├── category_handler.go # Handler untuk kategori
│ ├── encryption_handler.go # Handler untuk status enkripsi
│ ├── key_handler.go # Handler untuk generasi kunci
│ └── note_handler.go # Handler untuk catatan
├── models/
│ ├── activity_log.go # Model untuk log aktivitas
│ ├── category.go # Model untuk kategori
│ └── note.go # Model untuk catatan
├── repositories/
│ ├── activity_log_repository.go # Repository untuk log aktivitas
│ ├── category_repository.go # Repository untuk kategori
│ └── note_repository.go # Repository untuk catatan
├── settings/
│ └── settings.go # Pengaturan aplikasi
├── utils/
│ ├── encryption.go # Utilitas enkripsi
│ └── errors.go # Penanganan error
├── .gitignore # Pengecualian file untuk Git
├── main.go # Entry point aplikasi
├── go.mod # Dependensi Go
├── go.sum # Checksum dependensi
├── settings.template.json # Template untuk file konfigurasi
└── settings.json # File konfigurasi (tidak disertakan dalam Git)
Saat pertama kali mengkloning repositori ini, Anda perlu:
- Membuat file
settings.jsondengan kunci enkripsi yang valid - Menjalankan aplikasi untuk membuat database secara otomatis
# Setelah mengkloning repositori
cd personal-notes-with-go
# Buat file settings.json dari template
cp settings.template.json settings.json
# Edit file settings.json dan tambahkan kunci enkripsi Anda
# Atau gunakan endpoint /generate-key setelah menjalankan aplikasi
# Jalankan aplikasi untuk membuat database
go run main.go- GET /encryption/status: Mendapatkan status enkripsi saat ini
- Response:
{"encryption_valid": true|false, "message": "..."}
- Response:
-
GET /notes: Mendapatkan semua catatan
- Query Parameters:
category_id: Filter berdasarkan kategoriall: Jika "true", tampilkan semua catatan tanpa batasanlimit: Jumlah maksimum catatan yang dikembalikanq: Query pencarian untuk subjek dan konten
- Response: Array dari objek Note
- Query Parameters:
-
POST /notes: Membuat catatan baru
- Request Body:
{"subject": "...", "content": "...", "priority": "...", "tags": "...", "category_id": "..."} - Response: Objek Note yang dibuat
- Request Body:
-
PUT /notes/:id: Memperbarui catatan yang ada
- Request Body:
{"subject": "...", "content": "...", "priority": "...", "tags": "...", "category_id": "..."} - Response: Objek Note yang diperbarui
- Request Body:
-
DELETE /notes/:id: Menghapus catatan
- Response:
{"message": "Note deleted successfully"}
- Response:
-
GET /categories: Mendapatkan semua kategori
- Response: Array dari objek Category
-
POST /categories: Membuat kategori baru
- Request Body:
{"name": "..."} - Response: Objek Category yang dibuat
- Request Body:
-
PUT /categories/:id: Memperbarui kategori yang ada
- Request Body:
{"name": "..."} - Response: Objek Category yang diperbarui
- Request Body:
-
DELETE /categories/:id: Menghapus kategori
- Response:
{"message": "Category deleted successfully"}
- Response:
- POST /generate-key: Menghasilkan kunci enkripsi dari teks
- Request Body:
{"text": "..."} - Response:
{"key": "..."}
- Request Body:
-
GET /activity-logs: Mendapatkan semua log aktivitas dengan pagination
- Query Parameters:
limit: Jumlah maksimum log yang dikembalikan (default: 20)offset: Offset untuk pagination (default: 0)
- Response: Array dari objek ActivityLog
- Query Parameters:
-
GET /activity-logs/count: Mendapatkan jumlah total log aktivitas
- Response:
{"count": 123}
- Response:
-
GET /activity-logs/entity-type/:entityType: Mendapatkan log aktivitas berdasarkan tipe entitas
- Path Parameters:
entityType: Tipe entitas (misalnya "note", "category", "encryption", "key")
- Query Parameters:
limit: Jumlah maksimum log yang dikembalikan (default: 20)offset: Offset untuk pagination (default: 0)
- Response: Array dari objek ActivityLog
- Path Parameters:
-
GET /activity-logs/entity-type/:entityType/count: Mendapatkan jumlah log aktivitas berdasarkan tipe entitas
- Path Parameters:
entityType: Tipe entitas (misalnya "note", "category", "encryption", "key")
- Response:
{"count": 123}
- Path Parameters:
-
GET /activity-logs/action/:action: Mendapatkan log aktivitas berdasarkan aksi
- Path Parameters:
action: Tipe aksi (misalnya "create", "update", "delete", "read", "check", "generate")
- Query Parameters:
limit: Jumlah maksimum log yang dikembalikan (default: 20)offset: Offset untuk pagination (default: 0)
- Response: Array dari objek ActivityLog
- Path Parameters:
-
GET /activity-logs/action/:action/count: Mendapatkan jumlah log aktivitas berdasarkan aksi
- Path Parameters:
action: Tipe aksi (misalnya "create", "update", "delete", "read", "check", "generate")
- Response:
{"count": 123}
- Path Parameters:
-
DELETE /activity-logs/older-than/:days: Menghapus log aktivitas yang lebih lama dari jumlah hari tertentu
- Path Parameters:
days: Jumlah hari
- Response:
{"message": "Old activity logs deleted successfully", "rowsAffected": 123}
- Path Parameters:
Aplikasi menggunakan file settings.json untuk menyimpan konfigurasi:
{
"encryption_key": "Base64EncodedKey==",
"notes_limit": 10
}- encryption_key: Kunci enkripsi dalam format Base64
- notes_limit: Jumlah maksimum catatan yang ditampilkan secara default
Catatan Penting: File
settings.jsontidak disertakan dalam repositori Git karena berisi informasi sensitif. Gunakan filesettings.template.jsonsebagai template untuk membuat file konfigurasi Anda sendiri.
Aplikasi menggunakan enkripsi AES-256 untuk mengamankan data sensitif seperti subjek dan konten catatan. Kunci enkripsi disimpan dalam file konfigurasi dan dapat dihasilkan menggunakan endpoint /generate-key.
Sistem melakukan validasi kunci enkripsi saat startup. Jika kunci tidak valid atau tidak ada, modifikasi data akan dinonaktifkan untuk alasan keamanan.
Endpoint yang memodifikasi data (POST, PUT, DELETE) memerlukan kunci enkripsi yang valid. Jika kunci tidak valid, permintaan akan ditolak dengan kode status 403 Forbidden.
Aplikasi menyediakan endpoint untuk menghasilkan kunci enkripsi yang konsisten dari teks input. Kunci dihasilkan menggunakan SHA-256 dan dikodekan dengan Base64.
Semua aktivitas sistem dicatat dengan detail seperti jenis aksi, entitas yang terpengaruh, deskripsi, timestamp, alamat IP, dan user agent. Log aktivitas dapat diakses melalui endpoint API dan dapat difilter berdasarkan berbagai kriteria.
-
Clone repository:
git clone <repository-url> cd personal-notes-with-go
-
Buat file konfigurasi:
cp settings.template.json settings.json # Edit settings.json dan tambahkan kunci enkripsi Anda -
Jalankan aplikasi:
go run main.go
-
Akses aplikasi:
- Browser akan terbuka otomatis di
http://localhost:8080/frontend - Jika browser tidak terbuka otomatis, buka browser dan akses URL tersebut
- Browser akan terbuka otomatis di
-
Menonaktifkan pembukaan browser otomatis:
NO_BROWSER=1 go run main.go
curl http://localhost:8080/encryption/status# Membuat catatan baru
curl -X POST -H "Content-Type: application/json" -d '{"subject":"Catatan Baru","content":"Isi catatan","priority":"medium","tags":"tag1, tag2"}' http://localhost:8080/notes
# Mengambil semua catatan
curl http://localhost:8080/notes
# Mengambil catatan berdasarkan kategori
curl http://localhost:8080/notes?category_id=123
# Mengambil semua catatan tanpa batasan
curl http://localhost:8080/notes?all=true
# Memperbarui catatan
curl -X PUT -H "Content-Type: application/json" -d '{"subject":"Catatan Diperbarui","content":"Isi diperbarui","priority":"high","tags":"tag1, tag2, tag3"}' http://localhost:8080/notes/{id}
# Menghapus catatan
curl -X DELETE http://localhost:8080/notes/{id}# Membuat kategori baru
curl -X POST -H "Content-Type: application/json" -d '{"name":"Kategori Baru"}' http://localhost:8080/categories
# Mengambil semua kategori
curl http://localhost:8080/categories
# Memperbarui kategori
curl -X PUT -H "Content-Type: application/json" -d '{"name":"Kategori Diperbarui"}' http://localhost:8080/categories/{id}
# Menghapus kategori
curl -X DELETE http://localhost:8080/categories/{id}curl -X POST -H "Content-Type: application/json" -d '{"text":"Teks untuk membangkitkan kunci"}' http://localhost:8080/generate-key# Mendapatkan semua log aktivitas
curl http://localhost:8080/activity-logs
# Mendapatkan jumlah total log aktivitas
curl http://localhost:8080/activity-logs/count
# Mendapatkan log aktivitas berdasarkan tipe entitas
curl http://localhost:8080/activity-logs/entity-type/note
# Mendapatkan jumlah log aktivitas berdasarkan tipe entitas
curl http://localhost:8080/activity-logs/entity-type/note/count
# Mendapatkan log aktivitas berdasarkan aksi
curl http://localhost:8080/activity-logs/action/create
# Mendapatkan jumlah log aktivitas berdasarkan aksi
curl http://localhost:8080/activity-logs/action/create/count
# Menghapus log aktivitas yang lebih lama dari 30 hari
curl -X DELETE http://localhost:8080/activity-logs/older-than/30Beberapa file tidak disertakan dalam repositori Git untuk alasan keamanan dan praktis:
- settings.json: Berisi kunci enkripsi dan pengaturan aplikasi
- File database (*.db, *.sqlite, *.sqlite3): Berisi data pengguna yang mungkin sensitif
Lihat file .gitignore untuk daftar lengkap file yang dikecualikan.
- Navigasi SPA antara Notes, Categories, dan Activity Logs
- Indikator status enkripsi dengan pesan informatif
- Tombol floating untuk pembangkit kunci
- Daftar catatan dengan tampilan kartu yang informatif
- Form untuk menambah dan mengedit catatan
- Pencarian catatan berdasarkan subjek dan konten
- Filter catatan berdasarkan kategori
- Opsi untuk menampilkan semua catatan tanpa batasan
- Daftar kategori dengan opsi edit dan hapus
- Form untuk menambah dan mengedit kategori
- Daftar log aktivitas dengan informasi lengkap
- Filter berdasarkan tipe entitas dan aksi
- Paginasi untuk navigasi mudah
- Opsi untuk menghapus log lama
- Kontrol filter yang tetap terlihat saat scroll
- Form untuk menghasilkan kunci enkripsi dari teks input
- Opsi untuk menyalin kunci ke clipboard
- Notifikasi toast untuk umpan balik operasi
- Pesan error yang informatif
- Konfirmasi untuk operasi penghapusan
Proyek ini dilisensikan di bawah No Commercial Use License.
Ini berarti bahwa meskipun Anda bebas menggunakan, memodifikasi, dan mendistribusikan proyek ini untuk tujuan pribadi atau pendidikan, Anda dilarang keras menjualnya atau menggunakannya untuk keuntungan komersial apa pun.
- import export in CSV format