from flask import Blueprint, Response, jsonify, request from sqlalchemy import select from l4d2web.auth import current_user, require_login from l4d2web.db import session_scope from l4d2web.models import Blueprint as BlueprintModel from l4d2web.models import Server bp = Blueprint("server", __name__) @bp.post("/servers") @require_login def create_server() -> Response: user = current_user() assert user is not None payload = request.get_json(silent=True) or {} with session_scope() as db: blueprint = db.scalar( select(BlueprintModel).where( BlueprintModel.id == int(payload["blueprint_id"]), BlueprintModel.user_id == user.id, ) ) if blueprint is None: return Response("blueprint not found", status=404) server = Server( user_id=user.id, blueprint_id=blueprint.id, name=str(payload["name"]), port=int(payload["port"]), desired_state="stopped", actual_state="unknown", last_error="", ) db.add(server) db.flush() server_id = server.id return jsonify({"id": server_id}), 201 @bp.patch("/servers/") @require_login def update_server(server_id: int) -> Response: user = current_user() assert user is not None payload = request.get_json(silent=True) or {} with session_scope() as db: server = db.scalar(select(Server).where(Server.id == server_id, Server.user_id == user.id)) if server is None: return Response(status=404) blueprint = db.scalar( select(BlueprintModel).where( BlueprintModel.id == int(payload["blueprint_id"]), BlueprintModel.user_id == user.id, ) ) if blueprint is None: return Response("blueprint not found", status=404) server.blueprint_id = blueprint.id return jsonify({"id": server_id}), 200