majuna/app/api/web.py

97 lines
3 KiB
Python
Raw Permalink Normal View History

2024-12-06 13:34:44 +00:00
from datetime import datetime, timedelta, timezone
from typing import List
from flask import Blueprint, abort, request
from flask.typing import ResponseReturnValue
2024-12-06 18:15:47 +00:00
from app.api.util import (
DOMAIN_NAME_REGEX,
MAX_ALLOWED_ITEMS,
MAX_DOMAIN_NAME_LENGTH,
ListFilter,
list_resources,
)
from app.models.base import Group
from app.models.mirrors import Origin, Proxy
2024-12-06 18:15:47 +00:00
api_web = Blueprint("web", __name__)
2024-12-06 18:15:47 +00:00
@api_web.route("/group", methods=["GET"])
def list_groups() -> ResponseReturnValue:
return list_resources(
Group,
lambda group: group.to_dict(),
2024-12-06 18:15:47 +00:00
resource_name="OriginGroupList",
max_allowed_items=MAX_ALLOWED_ITEMS,
2024-12-06 18:15:47 +00:00
protective_marking="amber",
)
2024-12-06 18:15:47 +00:00
@api_web.route("/origin", methods=["GET"])
def list_origins() -> ResponseReturnValue:
2024-12-06 18:15:47 +00:00
domain_name_filter = request.args.get("DomainName")
group_id_filter = request.args.get("GroupId")
filters: List[ListFilter] = []
if domain_name_filter:
if len(domain_name_filter) > MAX_DOMAIN_NAME_LENGTH:
2024-12-06 18:15:47 +00:00
abort(
400,
description=f"DomainName cannot exceed {MAX_DOMAIN_NAME_LENGTH} characters.",
)
if not DOMAIN_NAME_REGEX.match(domain_name_filter):
abort(400, description="DomainName contains invalid characters.")
filters.append(Origin.domain_name.ilike(f"%{domain_name_filter}%"))
if group_id_filter:
try:
filters.append(Origin.group_id == int(group_id_filter))
except ValueError:
abort(400, description="GroupId must be a valid integer.")
return list_resources(
Origin,
lambda origin: origin.to_dict(),
filters=filters,
2024-12-06 18:15:47 +00:00
resource_name="OriginsList",
max_allowed_items=MAX_ALLOWED_ITEMS,
2024-12-06 18:15:47 +00:00
protective_marking="amber",
)
2024-12-06 18:15:47 +00:00
@api_web.route("/mirror", methods=["GET"])
def list_mirrors() -> ResponseReturnValue:
filters = []
twenty_four_hours_ago = datetime.now(timezone.utc) - timedelta(hours=24)
2024-12-06 18:15:47 +00:00
status_filter = request.args.get("Status")
if status_filter:
if status_filter == "pending":
filters.append(Proxy.url.is_(None))
filters.append(Proxy.deprecated.is_(None))
filters.append(Proxy.destroyed.is_(None))
if status_filter == "active":
filters.append(Proxy.url.is_not(None))
filters.append(Proxy.deprecated.is_(None))
filters.append(Proxy.destroyed.is_(None))
if status_filter == "expiring":
filters.append(Proxy.deprecated.is_not(None))
filters.append(Proxy.destroyed.is_(None))
if status_filter == "destroyed":
filters.append(Proxy.destroyed > twenty_four_hours_ago)
else:
2024-12-06 18:15:47 +00:00
filters.append(
(Proxy.destroyed.is_(None)) | (Proxy.destroyed > twenty_four_hours_ago)
)
return list_resources(
Proxy,
lambda proxy: proxy.to_dict(),
filters=filters,
2024-12-06 18:15:47 +00:00
resource_name="MirrorsList",
max_allowed_items=MAX_ALLOWED_ITEMS,
2024-12-06 18:15:47 +00:00
protective_marking="amber",
)