add tenant api
This commit is contained in:
@@ -2,7 +2,7 @@ from flask import Flask
|
||||
|
||||
from .config import Config
|
||||
from .ext import db
|
||||
from .v1_api import bp as v1_bp
|
||||
from .v1_api import v1_bp
|
||||
|
||||
|
||||
def create_app():
|
||||
|
32
teufa/dao.py
32
teufa/dao.py
@@ -7,6 +7,38 @@ class Error(BaseModel):
|
||||
message: str
|
||||
|
||||
|
||||
class Tenant(BaseModel):
|
||||
id: int | None = None
|
||||
name: str
|
||||
hostname: str
|
||||
|
||||
|
||||
class PartialTenant(BaseModel):
|
||||
id: int | object = empty
|
||||
name: str | object = empty
|
||||
hostname: str | object = empty
|
||||
|
||||
|
||||
class CreateTenantRequest(BaseModel):
|
||||
tenant: Tenant
|
||||
|
||||
|
||||
class CreateTenantResponse(BaseModel):
|
||||
tenant: Tenant
|
||||
|
||||
|
||||
class UpdateTenantRequest(BaseModel):
|
||||
tenant: PartialTenant
|
||||
|
||||
|
||||
class UpdateTenantResponse(BaseModel):
|
||||
tenant: Tenant
|
||||
|
||||
|
||||
class GetTenantResponse(BaseModel):
|
||||
tenant: Tenant
|
||||
|
||||
|
||||
class Flight(BaseModel):
|
||||
id: int | None = None
|
||||
departure_icao: str
|
||||
|
@@ -1,15 +1,22 @@
|
||||
from flask import Blueprint, Flask, g, request
|
||||
from flask_restful import Api
|
||||
from flask import Blueprint, g, request
|
||||
from sqlalchemy import select
|
||||
|
||||
from .. import db as dbm
|
||||
from ..ext import db
|
||||
from .flights import FlightCollectionResource, FlightResource
|
||||
from .flights import flights_bp
|
||||
from .tenants import tenants_bp
|
||||
|
||||
bp = Blueprint("api", __name__, url_prefix="/api")
|
||||
v1_bp = Blueprint("v1", __name__, url_prefix="/api/v1")
|
||||
|
||||
admin_bp = Blueprint("admin", __name__, url_prefix="/admin")
|
||||
|
||||
admin_bp.register_blueprint(tenants_bp)
|
||||
v1_bp.register_blueprint(admin_bp)
|
||||
|
||||
api_bp = Blueprint("api", __name__, url_prefix="/")
|
||||
|
||||
|
||||
@bp.before_request
|
||||
@api_bp.before_request
|
||||
def before_request():
|
||||
if not hasattr(g, "tenant"):
|
||||
hostname = request.host.split(":")[0]
|
||||
@@ -18,7 +25,5 @@ def before_request():
|
||||
).first()
|
||||
|
||||
|
||||
api = Api(bp)
|
||||
|
||||
api.add_resource(FlightCollectionResource, "/v1/flights")
|
||||
api.add_resource(FlightResource, "/v1/flights/<int:flight_id>")
|
||||
api_bp.register_blueprint(flights_bp)
|
||||
v1_bp.register_blueprint(api_bp)
|
||||
|
@@ -1,102 +1,103 @@
|
||||
from flask import g, request
|
||||
from flask_restful import Resource
|
||||
from flask import Blueprint, g, jsonify, request
|
||||
|
||||
from .. import dao
|
||||
from .. import db as dbm
|
||||
from ..ext import db
|
||||
|
||||
flights_bp = Blueprint("flights", __name__)
|
||||
|
||||
class FlightCollectionResource(Resource):
|
||||
def post(self):
|
||||
data = request.get_json()
|
||||
|
||||
req = dao.CreateFlightRequest(**data)
|
||||
@flights_bp.route("/flights", methods=["POST"])
|
||||
def create_flight():
|
||||
data = request.get_json()
|
||||
req = dao.CreateFlightRequest(**data)
|
||||
|
||||
flight = dbm.Flight(
|
||||
tenant_id=g.tenant.id,
|
||||
departure_icao=req.flight.departure_icao,
|
||||
arrival_icao=req.flight.arrival_icao,
|
||||
aircraft_id=req.flight.aircraft_id,
|
||||
)
|
||||
flight = dbm.Flight(
|
||||
tenant_id=g.tenant.id,
|
||||
departure_icao=req.flight.departure_icao,
|
||||
arrival_icao=req.flight.arrival_icao,
|
||||
aircraft_id=req.flight.aircraft_id,
|
||||
)
|
||||
|
||||
db.session.add(flight)
|
||||
db.session.commit()
|
||||
db.session.add(flight)
|
||||
db.session.commit()
|
||||
|
||||
res = dao.CreateFlightResponse(
|
||||
**{
|
||||
"flight": {
|
||||
"id": flight.id,
|
||||
"departure_icao": flight.departure_icao,
|
||||
"arrival_icao": flight.arrival_icao,
|
||||
"aircraft_id": flight.aircraft_id,
|
||||
}
|
||||
res = dao.CreateFlightResponse(
|
||||
**{
|
||||
"flight": {
|
||||
"id": flight.id,
|
||||
"departure_icao": flight.departure_icao,
|
||||
"arrival_icao": flight.arrival_icao,
|
||||
"aircraft_id": flight.aircraft_id,
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
return res.model_dump(), 201
|
||||
return jsonify(res.model_dump()), 201
|
||||
|
||||
|
||||
class FlightResource(Resource):
|
||||
def get(self, flight_id):
|
||||
flight = db.session.get(dbm.Flight, flight_id)
|
||||
@flights_bp.route("/flights/<int:flight_id>", methods=["GET"])
|
||||
def get_flight(flight_id):
|
||||
flight = db.session.get(dbm.Flight, flight_id)
|
||||
|
||||
if not flight:
|
||||
return dao.Error(message="Flight not found").model_dump(), 404
|
||||
if not flight:
|
||||
return jsonify(dao.Error(message="Flight not found").model_dump()), 404
|
||||
|
||||
res = dao.GetFlightResponse(
|
||||
**{
|
||||
"flight": {
|
||||
"id": flight.id,
|
||||
"departure_icao": flight.departure_icao,
|
||||
"arrival_icao": flight.arrival_icao,
|
||||
"aircraft_id": flight.aircraft_id,
|
||||
}
|
||||
res = dao.GetFlightResponse(
|
||||
**{
|
||||
"flight": {
|
||||
"id": flight.id,
|
||||
"departure_icao": flight.departure_icao,
|
||||
"arrival_icao": flight.arrival_icao,
|
||||
"aircraft_id": flight.aircraft_id,
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
return res.model_dump()
|
||||
return jsonify(res.model_dump())
|
||||
|
||||
def put(self, flight_id):
|
||||
flight = db.session.get(dbm.Flight, flight_id)
|
||||
|
||||
if not flight:
|
||||
return dao.Error(message="Flight not found").model_dump(), 404
|
||||
@flights_bp.route("/flights/<int:flight_id>", methods=["PUT"])
|
||||
def update_flight(flight_id):
|
||||
flight = db.session.get(dbm.Flight, flight_id)
|
||||
|
||||
data = request.get_json()
|
||||
if not flight:
|
||||
return jsonify(dao.Error(message="Flight not found").model_dump()), 404
|
||||
|
||||
req = dao.UpdateFlightRequest(**data)
|
||||
data = request.get_json()
|
||||
req = dao.UpdateFlightRequest(**data)
|
||||
|
||||
if req.flight.id is not dao.empty:
|
||||
flight.id = req.flight.id
|
||||
if req.flight.departure_icao is not dao.empty:
|
||||
flight.departure_icao = req.flight.departure_icao
|
||||
if req.flight.arrival_icao is not dao.empty:
|
||||
flight.arrival_icao = req.flight.arrival_icao
|
||||
if req.flight.aircraft_id is not dao.empty:
|
||||
flight.aircraft_id = req.flight.aircraft_id
|
||||
if req.flight.departure_icao is not dao.empty:
|
||||
flight.departure_icao = req.flight.departure_icao
|
||||
if req.flight.arrival_icao is not dao.empty:
|
||||
flight.arrival_icao = req.flight.arrival_icao
|
||||
if req.flight.aircraft_id is not dao.empty:
|
||||
flight.aircraft_id = req.flight.aircraft_id
|
||||
|
||||
db.session.commit()
|
||||
db.session.commit()
|
||||
|
||||
res = dao.UpdateFlightResponse(
|
||||
**{
|
||||
"flight": {
|
||||
"id": flight.id,
|
||||
"departure_icao": flight.departure_icao,
|
||||
"arrival_icao": flight.arrival_icao,
|
||||
"aircraft_id": flight.aircraft_id,
|
||||
}
|
||||
res = dao.UpdateFlightResponse(
|
||||
**{
|
||||
"flight": {
|
||||
"id": flight.id,
|
||||
"departure_icao": flight.departure_icao,
|
||||
"arrival_icao": flight.arrival_icao,
|
||||
"aircraft_id": flight.aircraft_id,
|
||||
}
|
||||
)
|
||||
}
|
||||
)
|
||||
|
||||
return res.model_dump()
|
||||
return jsonify(res.model_dump())
|
||||
|
||||
def delete(self, flight_id):
|
||||
flight = db.session.get(dbm.Flight, flight_id)
|
||||
|
||||
if not flight:
|
||||
return dao.Error(message="Flight not found").model_dump(), 404
|
||||
@flights_bp.route("/flights/<int:flight_id>", methods=["DELETE"])
|
||||
def delete_flight(flight_id):
|
||||
flight = db.session.get(dbm.Flight, flight_id)
|
||||
|
||||
db.session.delete(flight)
|
||||
db.session.commit()
|
||||
if not flight:
|
||||
return jsonify(dao.Error(message="Flight not found").model_dump()), 404
|
||||
|
||||
return "", 204
|
||||
db.session.delete(flight)
|
||||
db.session.commit()
|
||||
|
||||
return "", 204
|
||||
|
99
teufa/v1_api/tenants.py
Normal file
99
teufa/v1_api/tenants.py
Normal file
@@ -0,0 +1,99 @@
|
||||
from flask import Blueprint, g, jsonify, request
|
||||
|
||||
from .. import dao
|
||||
from .. import db as dbm
|
||||
from ..ext import db
|
||||
|
||||
tenants_bp = Blueprint("tenants", __name__)
|
||||
|
||||
|
||||
@tenants_bp.route("/tenants", methods=["POST"])
|
||||
def create_tenant():
|
||||
data = request.get_json()
|
||||
req = dao.CreateTenantRequest(**data)
|
||||
|
||||
tenant = dbm.Tenant(
|
||||
name=req.tenant.name,
|
||||
hostname=req.tenant.hostname,
|
||||
)
|
||||
|
||||
db.session.add(tenant)
|
||||
db.session.commit()
|
||||
|
||||
res = dao.CreateTenantResponse(
|
||||
**{
|
||||
"tenant": {
|
||||
"id": tenant.id,
|
||||
"name": tenant.name,
|
||||
"hostname": tenant.hostname,
|
||||
"created_at": tenant.created_at,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
return jsonify(res.model_dump()), 201
|
||||
|
||||
|
||||
@tenants_bp.route("/tenants/<int:tenant_id>", methods=["GET"])
|
||||
def get_tenant(tenant_id):
|
||||
tenant = db.session.get(dbm.Tenant, tenant_id)
|
||||
|
||||
if not tenant:
|
||||
return jsonify(dao.Error(message="Tenant not found").model_dump()), 404
|
||||
|
||||
res = dao.GetTenantResponse(
|
||||
**{
|
||||
"tenant": {
|
||||
"id": tenant.id,
|
||||
"name": tenant.name,
|
||||
"hostname": tenant.hostname,
|
||||
"created_at": tenant.created_at,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
return jsonify(res.model_dump())
|
||||
|
||||
|
||||
@tenants_bp.route("/tenants/<int:tenant_id>", methods=["PUT"])
|
||||
def update_tenant(tenant_id):
|
||||
tenant = db.session.get(dbm.Tenant, tenant_id)
|
||||
|
||||
if not tenant:
|
||||
return jsonify(dao.Error(message="Tenant not found").model_dump()), 404
|
||||
|
||||
data = request.get_json()
|
||||
req = dao.UpdateTenantRequest(**data)
|
||||
|
||||
if req.tenant.name is not dao.empty:
|
||||
tenant.name = req.tenant.name
|
||||
if req.tenant.hostname is not dao.empty:
|
||||
tenant.hostname = req.tenant.hostname
|
||||
|
||||
db.session.commit()
|
||||
|
||||
res = dao.UpdateTenantResponse(
|
||||
**{
|
||||
"tenant": {
|
||||
"id": tenant.id,
|
||||
"name": tenant.name,
|
||||
"hostname": tenant.hostname,
|
||||
"created_at": tenant.created_at,
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
return jsonify(res.model_dump())
|
||||
|
||||
|
||||
@tenants_bp.route("/tenants/<int:tenant_id>", methods=["DELETE"])
|
||||
def delete_tenant(tenant_id):
|
||||
tenant = db.session.get(dbm.Tenant, tenant_id)
|
||||
|
||||
if not tenant:
|
||||
return jsonify(dao.Error(message="Tenant not found").model_dump()), 404
|
||||
|
||||
db.session.delete(tenant)
|
||||
db.session.commit()
|
||||
|
||||
return "", 204
|
Reference in New Issue
Block a user