import os from django.shortcuts import render from django.http import JsonResponse from django.views.decorators.csrf import ensure_csrf_cookie, csrf_protect import json from backend.utils.influx import InfluxDBHelper from dotenv import load_dotenv from django.views.decorators.http import require_http_methods from django.views.decorators.csrf import csrf_exempt from django.contrib.auth import authenticate, login, logout from .forms import CreateUserForm @ensure_csrf_cookie @require_http_methods(["GET"]) def set_csrf_token(request): """ We set the CSRF cookie on the frontend. """ return JsonResponse({"message": "CSRF cookie set"}) @require_http_methods(["POST"]) def login_view(request): try: data = json.loads(request.body.decode("utf-8")) email = data["email"] password = data["password"] except json.JSONDecodeError: return JsonResponse( {"success": False, "message": "Invalid JSON"}, status=400 ) user = authenticate(request, username=email, password=password) if user: login(request, user) # also creates a session in the browser return JsonResponse({"success": True}) return JsonResponse( {"success": False, "message": "Invalid credentials"}, status=401 ) def logout_view(request): logout(request) return JsonResponse({"message": "Logged out"}) @require_http_methods(["GET"]) def user(request): if request.user.is_authenticated: return JsonResponse( {"username": request.user.username, "email": request.user.email} ) return JsonResponse({"message": "Not logged in"}, status=401) @require_http_methods(["POST"]) def register(request): data = json.loads(request.body.decode("utf-8")) form = CreateUserForm(data) if form.is_valid(): form.save() return JsonResponse( {"success": "User registered successfully"}, status=201 ) else: errors = form.errors.as_json() return JsonResponse({"error": errors}, status=400) @require_http_methods(["GET"]) def room_data_range(request): try: data = json.loads(request.body.decode("utf-8")) room = data["room"] start = data["start"] stop = data["stop"] if not room: return JsonResponse({"error": "Missing 'room' parameter"}, status=400) load_dotenv() client = InfluxDBHelper( url=os.getenv("INFLUXDB_URL"), token=os.getenv("INFLUXDB_TOKEN"), org=os.getenv("INFLUXDB_ORG"), bucket=os.getenv("INFLUXDB_BUCKET"), ) tables = client.get_room_data_in_range(room, start, stop) results = [] for table in tables: for record in table.records: results.append({ "time": str(record.get_time()), "field": record.get_field(), "value": record.get_value(), }) return JsonResponse({"room": room, "data": results}, status = 200) except json.JSONDecodeError: return JsonResponse( {"success": False, "message": "Invalid JSON"}, status=400 ) @require_http_methods(["GET"]) def get_rooms(request): client = InfluxDBHelper( url=os.getenv("INFLUXDB_URL"), token=os.getenv("INFLUXDB_TOKEN"), org=os.getenv("INFLUXDB_ORG"), bucket=os.getenv("INFLUXDB_BUCKET"), ) tables = client.list_rooms() rooms = set() for table in tables: for record in table.records: rooms.add(record.get_value()) return JsonResponse({"rooms": sorted(rooms)})