33from pydantic import BaseModel
44from typing import Optional
55
6- # --- UPDATE IMPORT (Sesuai Struktur Baru) ---
7- from app .core .database import get_db # <-- Folder db
8- from app .models .device import SensorLog # <-- Sesuaikan nama class device kamu (Device/SensorLog?)
9- # Cek model kamu: Kalau nama classnya Device, ganti SensorLog jadi Device di baris atas
10- from app .mqtt .client import publish_message # <-- Kita pakai helper publish kalau ada, atau client langsung
6+ # --- IMPORT DATABASE ---
7+ from app .core .database import get_db
8+ from app .models .device import Device
119
12- # --- IMPORT RATE LIMITER REDIS ---
10+ # --- IMPORT RATE LIMITER ---
1311from fastapi_limiter .depends import RateLimiter
1412
13+ # --- PERBAIKAN IMPORT MQTT ---
14+ # Kita import object 'client' langsung, lalu kita alias-kan jadi 'mqtt_client'
15+ from app .mqtt .client import client as mqtt_client
16+
1517router = APIRouter ()
1618
1719# --- SCHEMA ---
@@ -24,25 +26,18 @@ class AutoRegisterSchema(BaseModel):
2426 pin_code : str
2527 factory_secret : str
2628
27- # Kita butuh model Device (Definisikan ulang kalau belum import)
28- # Asumsi kamu punya model Device di app/models/device.py
29- from app .models .device import Device # Pastikan ini ada
30-
3129# --- 1. ENDPOINT CLAIM (User) ---
32- # Rate Limit: 5x per 60 detik
3330@router .post ("/claim" , dependencies = [Depends (RateLimiter (times = 5 , seconds = 60 ))])
3431def claim_device (
3532 claim_data : UserClaimSchema ,
3633 db : Session = Depends (get_db )
37- # user_uid: str = Depends(get_current_user) # <-- Aktifkan ini nanti kalau AUTH firebase sudah dipasang
3834):
39- # Sementara kita hardcode user_uid dulu biar bisa tes tanpa login frontend
35+ # Hardcode user sementara
4036 user_uid = "TEST_USER_UID_001"
4137
4238 clean_id = claim_data .device_id .strip ().upper ()
4339 clean_pin = claim_data .pin_code .strip ()
4440
45- # Cari Alat
4641 device = db .query (Device ).filter (Device .device_id == clean_id ).first ()
4742
4843 if not device :
@@ -53,11 +48,9 @@ def claim_device(
5348 return {"message" : "Alat ini memang sudah punya kamu kok." }
5449 raise HTTPException (status_code = 400 , detail = "Alat ini sudah dimiliki orang lain!" )
5550
56- # Cek PIN
5751 if device .pin_code != clean_pin :
5852 raise HTTPException (status_code = 400 , detail = "PIN Salah!" )
5953
60- # Simpan Pemilik
6154 device .owner_uid = user_uid
6255 device .device_name = "Alat Baru Saya"
6356 db .commit ()
@@ -66,16 +59,12 @@ def claim_device(
6659
6760
6861# --- 2. ENDPOINT CONTROL RELAY ---
69- # Rate Limit: 10x per 60 detik
7062@router .post ("/control-relay" , dependencies = [Depends (RateLimiter (times = 10 , seconds = 60 ))])
7163def control_relay (
7264 device_id : str ,
7365 state : str ,
7466 db : Session = Depends (get_db )
7567):
76- # Hardcode user dulu
77- user_uid = "TEST_USER_UID_001"
78-
7968 clean_id = device_id .strip ().upper ()
8069
8170 if state not in ["ON" , "OFF" ]:
@@ -86,16 +75,11 @@ def control_relay(
8675 if not device :
8776 raise HTTPException (status_code = 404 , detail = "Alat tidak ditemukan." )
8877
89- # Proteksi Kepemilikan (Nyalakan nanti kalau Auth siap)
90- # if device.owner_uid != user_uid:
91- # raise HTTPException(status_code=403, detail="Bukan alat kamu!")
92-
9378 topic = f"alat/{ clean_id } /command"
9479 payload = f'{{"relay": "{ state } "}}'
9580
96- # Publish ke MQTT
97- # Pastikan kamu import client mqtt yg benar, atau pakai cara ini:
98- from app .mqtt .client import client as mqtt_client
81+ # --- PERBAIKAN CARA PUBLISH ---
82+ # Gunakan method .publish() milik object client
9983 mqtt_client .publish (topic , payload )
10084
10185 return {"message" : "Perintah dikirim" , "topic" : topic , "state" : state }
@@ -123,7 +107,7 @@ def auto_register_device(
123107 device_id = clean_id ,
124108 pin_code = clean_pin ,
125109 device_name = "New Device" ,
126- # is_active=True # Sesuaikan dengan model kamu
110+ # is_active=True
127111 )
128112 db .add (new_device )
129113 db .commit ()
0 commit comments