69 lines
2 KiB
Python
69 lines
2 KiB
Python
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/<int:server_id>")
|
|
@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
|