NEO Storage API: Panduan Testing, Penggunaan, & Contoh Kode Lengkap
🧪 Testing & Usage Guide - NEO Storage API
📋 Table of Contents
🚀 Quick Start
1. Instalasi
# Clone dan install dependencies git clone <repo-url> cd neo-storage-api pip install -r requirements.txt # Setup environment cp .env.example .env # Edit .env dengan kredensial Anda # Run aplikasi python app.py
2. Access Web UI
http://localhost:7600
🌐 Testing Web UI
Login Flow
Step 1: Login Page
- Buka browser →
http://localhost:7600 - Masukkan nomor WhatsApp (contoh:
081234567890) - Klik "Kirim Kode OTP"
- Pastikan WhatsApp Gateway berjalan di
http://10.122.25.172:5000
Step 2: Verify OTP
- Cek WhatsApp untuk kode OTP 6 digit
- Masukkan kode OTP
- Otomatis login jika kode valid
Dashboard Features
User Dashboard
- Overview Stats: Total API keys, requests, storage status
- Quick Actions: Create API key, view logs
- API Documentation: Endpoint reference
Admin Dashboard (Only for role=admin)
- Semua fitur user +
- User Management
- Global monitoring semua user
- System statistics
API Key Management
Membuat API Key
- Login → Menu "API Keys"
- Isi form:
- Nama:
Foto Presensi - Deskripsi:
Upload foto untuk sistem presensi karyawan
- Klik "Generate API Key"
- Copy API key yang muncul
- Simpan API key dengan aman!
Contoh Use Cases API Key:
Foto Presensi- Upload foto karyawanGambar Website- Upload gambar untuk CMSDokumen PDF- Upload dokumenVideo Training- Upload video pembelajaran
Access Logs
User View
- Hanya melihat log aktivitas sendiri
- Filter by endpoint, method, status
Admin View
- Melihat semua log dari semua user
- Statistics: success rate, avg response time
- Filter by user, API key, date range
User Management (Admin Only)
Menambah User
- Login sebagai admin
- Menu "Users" → "Tambah Pengguna Baru"
- Isi data:
- Nomor WhatsApp:
081234567890 - Nama:
John Doe - Role:
useratauadmin
- User bisa langsung login dengan OTP
Manage Users
- Toggle Status: Aktifkan/nonaktifkan user
- Delete User: Hapus user (semua API key & log akan terhapus)
- View Stats: Lihat jumlah API keys & requests per user
🔌 Testing API Endpoints
Setup
# Set environment variables export BASE_URL="http://localhost:7600" export API_KEY="your-api-key-here"
1. API Info
curl -X GET $BASE_URL/api/info
Response:
{
"service": "NEO Storage API - IndoWeb ID",
"version": "1.0.0",
"endpoints": [...]
}
2. Upload File
curl -X POST $BASE_URL/api/upload \ -H "X-API-Key: $API_KEY" \ -F "file=@/path/to/image.jpg" \ -F "folder=uploads"
Response:
{
"success": true,
"url": "http://storage-url/uploads/20251005_123456_abc123_image.jpg",
"filename": "20251005_123456_abc123_image.jpg",
"object_key": "uploads/20251005_123456_abc123_image.jpg"
}
3. List Files
curl -X GET "$BASE_URL/api/files?folder=uploads" \ -H "X-API-Key: $API_KEY"
Response:
{
"success": true,
"files": [
{
"key": "uploads/file.jpg",
"filename": "file.jpg",
"size": 12345,
"modified": "2025-10-05 10:30:00",
"url": "http://storage-url/uploads/file.jpg"
}
]
}
4. Delete File
curl -X POST $BASE_URL/api/delete \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
-d '{"object_key": "uploads/file.jpg"}'
Response:
{
"success": true
}
🐍 Python Examples
Basic Upload
import requests
# Configuration
base_url = "http://localhost:7600"
api_key = "your-api-key-here"
headers = {"X-API-Key": api_key}
# Upload file
with open("image.jpg", "rb") as f:
files = {"file": f}
data = {"folder": "uploads"}
response = requests.post(
f"{base_url}/api/upload",
headers=headers,
files=files,
data=data
)
result = response.json()
print(f"Upload success: {result['success']}")
print(f"File URL: {result['url']}")
Upload Multiple Files
import requests
import os
base_url = "http://localhost:7600"
api_key = "your-api-key-here"
headers = {"X-API-Key": api_key}
# Upload semua file dalam folder
folder_path = "/path/to/images"
uploaded_urls = []
for filename in os.listdir(folder_path):
if filename.endswith(('.jpg', '.png', '.jpeg')):
file_path = os.path.join(folder_path, filename)
with open(file_path, "rb") as f:
files = {"file": f}
data = {"folder": "batch_upload"}
response = requests.post(
f"{base_url}/api/upload",
headers=headers,
files=files,
data=data
)
if response.status_code == 200:
result = response.json()
uploaded_urls.append(result['url'])
print(f"✅ Uploaded: {filename}")
else:
print(f"❌ Failed: {filename}")
print(f"\nTotal uploaded: {len(uploaded_urls)}")
Complete Example with Error Handling
import requests
from typing import Optional, Dict
class NEOStorageClient:
def __init__(self, base_url: str, api_key: str):
self.base_url = base_url
self.headers = {"X-API-Key": api_key}
def upload_file(self, file_path: str, folder: str = "uploads") -> Optional[Dict]:
"""Upload file ke NEO Storage"""
try:
with open(file_path, "rb") as f:
files = {"file": f}
data = {"folder": folder}
response = requests.post(
f"{self.base_url}/api/upload",
headers=self.headers,
files=files,
data=data,
timeout=30
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"Upload error: {e}")
return None
def list_files(self, folder: str = "uploads") -> Optional[Dict]:
"""List semua file"""
try:
response = requests.get(
f"{self.base_url}/api/files",
headers=self.headers,
params={"folder": folder},
timeout=10
)
response.raise_for_status()
return response.json()
except requests.exceptions.RequestException as e:
print(f"List error: {e}")
return None
def delete_file(self, object_key: str) -> bool:
"""Delete file"""
try:
response = requests.post(
f"{self.base_url}/api/delete",
headers=self.headers,
json={"object_key": object_key},
timeout=10
)
response.raise_for_status()
result = response.json()
return result.get("success", False)
except requests.exceptions.RequestException as e:
print(f"Delete error: {e}")
return False
# Usage
if __name__ == "__main__":
client = NEOStorageClient(
base_url="http://localhost:7600",
api_key="your-api-key-here"
)
# Upload
result = client.upload_file("photo.jpg", "presensi")
if result and result['success']:
print(f"Uploaded: {result['url']}")
# Delete
if client.delete_file(result['object_key']):
print("File deleted successfully")
📝 cURL Examples
Upload dengan Custom Folder
curl -X POST http://localhost:7600/api/upload \ -H "X-API-Key: your-api-key" \ -F "[email protected]" \ -F "folder=presensi/2025/januari"
Upload PDF Document
curl -X POST http://localhost:7600/api/upload \ -H "X-API-Key: your-api-key" \ -F "[email protected]" \ -F "folder=documents"
List Files dari Folder Spesifik
curl -X GET "http://localhost:7600/api/files?folder=presensi/2025/januari" \ -H "X-API-Key: your-api-key"
Pretty Print JSON Response
curl -X GET http://localhost:7600/api/files \ -H "X-API-Key: your-api-key" | python -m json.tool
🔧 Troubleshooting
Problem: OTP Tidak Terkirim
Solusi:
- Pastikan WhatsApp Gateway running:
curl http://10.122.25.172:5000/api/status
- Check .env file:
WA_API_URL=http://10.122.25.172:5000/api/send-messageWA_ADMIN_NUMBER=6281241314446
- Test manual send message:
curl -X POST http://10.122.25.172:5000/api/send-message \ -H "Content-Type: application/json" \ -d '{"phone":"081234567890","message":"Test"}'
Problem: Upload Failed - Invalid API Key
Solusi:
- Pastikan API key benar:
# Check di web UI: Menu API Keys
- Pastikan header format benar:
-H "X-API-Key: your-api-key"# atau-H "Authorization: Bearer your-api-key"
Problem: Storage Connection Failed
Solusi:
- Verify NEO credentials di .env:
NEO_ACCESS_KEY=your-keyNEO_SECRET_KEY=your-secretNEO_ENDPOINT=http://your-endpointNEO_BUCKET=your-bucketNEO_USE_SSL=false
- Test bucket access:
curl http://localhost:7600/test-connection
Problem: Permission Denied
Solusi:
- Check user status (harus active):
SELECT * FROM user WHERE phone='081234567890';
- Check API key status:
SELECT * FROM api_key WHERE user_id=1;
Problem: Database Locked
Solusi:
# Stop service sudo systemctl stop neo-storage-api # Remove lock rm -f neo_storage.db-journal # Restart sudo systemctl start neo-storage-api
📊 Monitoring & Logs
View Real-time Logs
# Systemd logs journalctl -u neo-storage-api -f # Application logs tail -f /var/log/neo-storage-api.log
Check Service Status
sudo systemctl status neo-storage-api
Database Queries
# Login to database sqlite3 neo_storage.db # Useful queries: SELECT COUNT(*) FROM user; SELECT COUNT(*) FROM api_key WHERE is_active=1; SELECT COUNT(*) FROM access_log; SELECT endpoint, COUNT(*) as hits FROM access_log GROUP BY endpoint;
🎯 Best Practices
- API Key Management
- Gunakan API key berbeda untuk setiap aplikasi
- Nama API key yang descriptive
- Rotate API key secara berkala
- File Organization
- Gunakan folder struktur yang jelas
- Contoh:
presensi/2025/januari/foto.jpg
- Error Handling
- Selalu check response status
- Implement retry logic untuk network errors
- Log semua errors
- Security
- Jangan hardcode API key di source code
- Gunakan environment variables
- Implement rate limiting di client side
Built with ❤️ by IndoWeb ID