From ba4c2b7d0a753a63d5e4ce7dc80f79a20b4498eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laura=20Kl=C3=BCnder?= Date: Sun, 3 Dec 2023 21:55:08 +0100 Subject: [PATCH] rename newapi to api --- src/c3nav/api/{newapi.py => api.py} | 2 +- src/c3nav/api/{newauth.py => auth.py} | 10 +-- src/c3nav/api/ninja.py | 2 +- src/c3nav/api/urls.py | 16 ++-- src/c3nav/editor/{newapi => api}/__init__.py | 0 src/c3nav/editor/{newapi => api}/base.py | 6 +- src/c3nav/editor/{newapi => api}/endpoints.py | 22 ++--- .../editor/{newapi => api}/geometries.py | 0 src/c3nav/editor/{newapi => api}/schemas.py | 0 src/c3nav/mapdata/{newapi => api}/__init__.py | 0 src/c3nav/mapdata/{newapi => api}/base.py | 18 +--- src/c3nav/mapdata/{newapi => api}/map.py | 44 +++++----- src/c3nav/mapdata/{newapi => api}/mapdata.py | 84 +++++++++---------- src/c3nav/mapdata/{newapi => api}/updates.py | 4 +- src/c3nav/mesh/{newapi.py => api.py} | 2 +- src/c3nav/routing/{newapi => api}/__init__.py | 0 .../routing/{newapi => api}/positioning.py | 2 +- src/c3nav/routing/{newapi => api}/routing.py | 4 +- 18 files changed, 101 insertions(+), 115 deletions(-) rename src/c3nav/api/{newapi.py => api.py} (96%) rename src/c3nav/api/{newauth.py => auth.py} (95%) rename src/c3nav/editor/{newapi => api}/__init__.py (100%) rename src/c3nav/editor/{newapi => api}/base.py (77%) rename src/c3nav/editor/{newapi => api}/endpoints.py (90%) rename src/c3nav/editor/{newapi => api}/geometries.py (100%) rename src/c3nav/editor/{newapi => api}/schemas.py (100%) rename src/c3nav/mapdata/{newapi => api}/__init__.py (100%) rename src/c3nav/mapdata/{newapi => api}/base.py (86%) rename src/c3nav/mapdata/{newapi => api}/map.py (93%) rename src/c3nav/mapdata/{newapi => api}/mapdata.py (95%) rename src/c3nav/mapdata/{newapi => api}/updates.py (96%) rename src/c3nav/mesh/{newapi.py => api.py} (98%) rename src/c3nav/routing/{newapi => api}/__init__.py (100%) rename src/c3nav/routing/{newapi => api}/positioning.py (98%) rename src/c3nav/routing/{newapi => api}/routing.py (98%) diff --git a/src/c3nav/api/newapi.py b/src/c3nav/api/api.py similarity index 96% rename from src/c3nav/api/newapi.py rename to src/c3nav/api/api.py index 03b79f0e..d2857ea6 100644 --- a/src/c3nav/api/newapi.py +++ b/src/c3nav/api/api.py @@ -2,7 +2,7 @@ from django.conf import settings from ninja import Router as APIRouter from ninja import Schema -from c3nav.api.newauth import APIAuthMethod, auth_responses +from c3nav.api.auth import APIAuthMethod, auth_responses from c3nav.api.utils import NonEmptyStr from c3nav.control.models import UserPermissions diff --git a/src/c3nav/api/newauth.py b/src/c3nav/api/auth.py similarity index 95% rename from src/c3nav/api/newauth.py rename to src/c3nav/api/auth.py index 634c4182..92673ca9 100644 --- a/src/c3nav/api/newauth.py +++ b/src/c3nav/api/auth.py @@ -25,7 +25,7 @@ class APIAuthMethod(StrEnum): @dataclass -class NewAPIAuth: +class APIAuthDetails: method: APIAuthMethod readonly: bool @@ -52,13 +52,13 @@ class APITokenAuth(HttpBearer): engine = import_module(settings.SESSION_ENGINE) self.SessionStore = engine.SessionStore - def _authenticate(self, request, token) -> NewAPIAuth: + def _authenticate(self, request, token) -> APIAuthDetails: request.user = AnonymousUser() request.user_permissions = SimpleLazyObject(lambda: UserPermissionsMiddleware.get_user_permissions(request)) request.user_space_accesses = lazy(UserPermissionsMiddleware.get_user_space_accesses, dict)(request) if token == "anonymous": - return NewAPIAuth( + return APIAuthDetails( method=APIAuthMethod.ANONYMOUS, readonly=True, ) @@ -69,7 +69,7 @@ class APITokenAuth(HttpBearer): if not user.is_authenticated: raise APITokenInvalid request.user = user - return NewAPIAuth( + return APIAuthDetails( method=APIAuthMethod.SESSION, readonly=False, ) @@ -91,7 +91,7 @@ class APITokenAuth(HttpBearer): request.user = secret.user request.user_permissions = user_permissions - return NewAPIAuth( + return APIAuthDetails( method=APIAuthMethod.SESSION, readonly=secret.readonly ) diff --git a/src/c3nav/api/ninja.py b/src/c3nav/api/ninja.py index 5847a1d1..b545ae0e 100644 --- a/src/c3nav/api/ninja.py +++ b/src/c3nav/api/ninja.py @@ -3,8 +3,8 @@ from ninja.openapi.docs import DocsBase from ninja.operation import Operation from ninja.schema import NinjaGenerateJsonSchema +from c3nav.api.auth import APITokenAuth from c3nav.api.exceptions import CustomAPIException -from c3nav.api.newauth import APITokenAuth class c3navAPI(NinjaAPI): diff --git a/src/c3nav/api/urls.py b/src/c3nav/api/urls.py index b33bc9b4..bc91adc2 100644 --- a/src/c3nav/api/urls.py +++ b/src/c3nav/api/urls.py @@ -1,15 +1,15 @@ from django.urls import path from django.views.generic.base import RedirectView -from c3nav.api.newapi import auth_api_router +from c3nav.api.api import auth_api_router from c3nav.api.ninja import ninja_api -from c3nav.editor.newapi.endpoints import editor_api_router -from c3nav.mapdata.newapi.map import map_api_router -from c3nav.mapdata.newapi.mapdata import mapdata_api_router -from c3nav.mapdata.newapi.updates import updates_api_router -from c3nav.mesh.newapi import mesh_api_router -from c3nav.routing.newapi.positioning import positioning_api_router -from c3nav.routing.newapi.routing import routing_api_router +from c3nav.editor.api.endpoints import editor_api_router +from c3nav.mapdata.api.map import map_api_router +from c3nav.mapdata.api.mapdata import mapdata_api_router +from c3nav.mapdata.api.updates import updates_api_router +from c3nav.mesh.api import mesh_api_router +from c3nav.routing.api.positioning import positioning_api_router +from c3nav.routing.api.routing import routing_api_router """ new API (v2) diff --git a/src/c3nav/editor/newapi/__init__.py b/src/c3nav/editor/api/__init__.py similarity index 100% rename from src/c3nav/editor/newapi/__init__.py rename to src/c3nav/editor/api/__init__.py diff --git a/src/c3nav/editor/newapi/base.py b/src/c3nav/editor/api/base.py similarity index 77% rename from src/c3nav/editor/newapi/base.py rename to src/c3nav/editor/api/base.py index 8d6df4db..69c1c428 100644 --- a/src/c3nav/editor/newapi/base.py +++ b/src/c3nav/editor/api/base.py @@ -1,14 +1,14 @@ from functools import wraps from c3nav.editor.models import ChangeSet +from c3nav.mapdata.api.base import api_etag from c3nav.mapdata.models.access import AccessPermission -from c3nav.mapdata.newapi.base import newapi_etag -def newapi_etag_with_update_cache_key(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False): +def api_etag_with_update_cache_key(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False): def inner_wrapper(func): - func = newapi_etag(permissions=permissions, etag_func=etag_func, base_mapdata=base_mapdata)(func) + func = api_etag(permissions=permissions, etag_func=etag_func, base_mapdata=base_mapdata)(func) @wraps(func) def inner_wrapped_func(request, *args, **kwargs): try: diff --git a/src/c3nav/editor/newapi/endpoints.py b/src/c3nav/editor/api/endpoints.py similarity index 90% rename from src/c3nav/editor/newapi/endpoints.py rename to src/c3nav/editor/api/endpoints.py index 961b9392..1c838f67 100644 --- a/src/c3nav/editor/newapi/endpoints.py +++ b/src/c3nav/editor/api/endpoints.py @@ -2,14 +2,14 @@ from django.urls import Resolver404, resolve from django.utils.translation import gettext_lazy as _ from ninja import Router as APIRouter +from c3nav.api.auth import APITokenAuth, auth_permission_responses from c3nav.api.exceptions import API404 -from c3nav.api.newauth import APITokenAuth, auth_permission_responses -from c3nav.editor.newapi.base import newapi_etag_with_update_cache_key -from c3nav.editor.newapi.geometries import get_level_geometries_result, get_space_geometries_result -from c3nav.editor.newapi.schemas import EditorGeometriesElemSchema, EditorID, GeometryStylesSchema, UpdateCacheKey +from c3nav.editor.api.base import api_etag_with_update_cache_key +from c3nav.editor.api.geometries import get_level_geometries_result, get_space_geometries_result +from c3nav.editor.api.schemas import EditorGeometriesElemSchema, EditorID, GeometryStylesSchema, UpdateCacheKey from c3nav.editor.views.base import editor_etag_func +from c3nav.mapdata.api.base import api_etag from c3nav.mapdata.models import Source -from c3nav.mapdata.newapi.base import newapi_etag from c3nav.mapdata.schemas.responses import BoundsSchema editor_api_router = APIRouter(tags=["editor"], auth=APITokenAuth(permissions={"editor_access"})) @@ -19,7 +19,7 @@ editor_api_router = APIRouter(tags=["editor"], auth=APITokenAuth(permissions={"e description="get maximum boundaries of everything on the map", response={200: BoundsSchema, **auth_permission_responses}, openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) -@newapi_etag() +@api_etag() def bounds(request): return { "bounds": Source.max_bounds(), @@ -30,7 +30,7 @@ def bounds(request): description="get the default colors for each geometry type", response={200: GeometryStylesSchema, **auth_permission_responses}, openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) -@newapi_etag(permissions=False) +@api_etag(permissions=False) def geometrystyles(request): return { 'building': '#aaaaaa', @@ -58,7 +58,7 @@ def geometrystyles(request): response={200: list[EditorGeometriesElemSchema], **API404.dict(), **auth_permission_responses}, openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) -@newapi_etag_with_update_cache_key(etag_func=editor_etag_func) +@api_etag_with_update_cache_key(etag_func=editor_etag_func) def space_geometries(request, space_id: EditorID, update_cache_key: UpdateCacheKey = None, **kwargs): # newapi_etag_with_update_cache_key does the following, don't let it confuse you: # - update_cache_key becomes the actual update_cache_key, not the one supplied be the user @@ -78,7 +78,7 @@ def space_geometries(request, space_id: EditorID, update_cache_key: UpdateCacheK response={200: list[EditorGeometriesElemSchema], **API404.dict(), **auth_permission_responses}, openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) -@newapi_etag_with_update_cache_key(etag_func=editor_etag_func) +@api_etag_with_update_cache_key(etag_func=editor_etag_func) def level_geometries(request, level_id: EditorID, update_cache_key: UpdateCacheKey = None, **kwargs): # newapi_etag_with_update_cache_key does the following, don't let it confuse you: # - update_cache_key becomes the actual update_cache_key, not the one supplied be the user @@ -117,7 +117,7 @@ def resolve_editor_path_api(request, path): @editor_api_router.get('/as_api/{path:path}', summary="raw editor access", response={200: dict, **API404.dict(), **auth_permission_responses}, openapi_extra={"security": [{"APITokenAuth": ["editor_access"]}]}) -@newapi_etag() # todo: correct? +@api_etag() # todo: correct? def view_as_api(request, path: str): """ get editor views rendered as JSON instead of HTML. @@ -139,7 +139,7 @@ def view_as_api(request, path: str): @editor_api_router.post('/as_api/{path:path}', summary="raw editor access", response={200: dict, **API404.dict(), **auth_permission_responses}, openapi_extra={"security": [{"APITokenAuth": ["editor_access", "write"]}]}) -@newapi_etag() # todo: correct? +@api_etag() # todo: correct? def view_as_api(request, path: str): """ get editor views rendered as JSON instead of HTML. diff --git a/src/c3nav/editor/newapi/geometries.py b/src/c3nav/editor/api/geometries.py similarity index 100% rename from src/c3nav/editor/newapi/geometries.py rename to src/c3nav/editor/api/geometries.py diff --git a/src/c3nav/editor/newapi/schemas.py b/src/c3nav/editor/api/schemas.py similarity index 100% rename from src/c3nav/editor/newapi/schemas.py rename to src/c3nav/editor/api/schemas.py diff --git a/src/c3nav/mapdata/newapi/__init__.py b/src/c3nav/mapdata/api/__init__.py similarity index 100% rename from src/c3nav/mapdata/newapi/__init__.py rename to src/c3nav/mapdata/api/__init__.py diff --git a/src/c3nav/mapdata/newapi/base.py b/src/c3nav/mapdata/api/base.py similarity index 86% rename from src/c3nav/mapdata/newapi/base.py rename to src/c3nav/mapdata/api/base.py index 6674d7da..f3517da7 100644 --- a/src/c3nav/mapdata/newapi/base.py +++ b/src/c3nav/mapdata/api/base.py @@ -18,7 +18,7 @@ from c3nav.mapdata.utils.cache.stats import increment_cache_key request_cache = LocalCacheProxy(maxsize=64) -def newapi_etag(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False): +def api_etag(permissions=True, etag_func=AccessPermission.etag_func, base_mapdata=False): def outer_wrapper(func): @wraps(func) @@ -79,7 +79,7 @@ def newapi_etag(permissions=True, etag_func=AccessPermission.etag_func, base_map return inner_wrapper -def newapi_stats(stat_name): +def api_stats(stat_name): def wrapper(func): @wraps(func) def wrapped_func(request, *args, **kwargs): @@ -108,17 +108,3 @@ def api_stats_clean_location_value(value): value = 'c:%s:%d:%d' % (value[1], int(float(value[2]) / 3) * 3, int(float(value[3]) / 3) * 3) return (value, 'c:anywhere') return (value, ) - - -def api_stats(view_name): - def wrapper(func): - @wraps(func) - def wrapped_func(self, request, *args, **kwargs): - response = func(self, request, *args, **kwargs) - if response.status_code < 400 and kwargs: - name, value = next(iter(kwargs.items())) - for value in api_stats_clean_location_value(value): - increment_cache_key('apistats__%s__%s__%s' % (view_name, name, value)) - return response - return wrapped_func - return wrapper diff --git a/src/c3nav/mapdata/newapi/map.py b/src/c3nav/mapdata/api/map.py similarity index 93% rename from src/c3nav/mapdata/newapi/map.py rename to src/c3nav/mapdata/api/map.py index c8411610..44d95c2b 100644 --- a/src/c3nav/mapdata/newapi/map.py +++ b/src/c3nav/mapdata/api/map.py @@ -9,12 +9,12 @@ from ninja import Router as APIRouter from ninja import Schema from pydantic import Field as APIField +from c3nav.api.auth import auth_permission_responses, auth_responses, validate_responses from c3nav.api.exceptions import API404, APIPermissionDenied, APIRequestValidationFailed -from c3nav.api.newauth import auth_permission_responses, auth_responses, validate_responses from c3nav.api.utils import NonEmptyStr +from c3nav.mapdata.api.base import api_etag, api_stats from c3nav.mapdata.models import Source from c3nav.mapdata.models.locations import DynamicLocation, LocationRedirect, Position -from c3nav.mapdata.newapi.base import newapi_etag, newapi_stats from c3nav.mapdata.schemas.filters import BySearchableFilter, RemoveGeometryFilter from c3nav.mapdata.schemas.model_base import AnyLocationID, AnyPositionID, CustomLocationID from c3nav.mapdata.schemas.models import (AnyPositionStatusSchema, FullListableLocationSchema, FullLocationSchema, @@ -30,7 +30,7 @@ map_api_router = APIRouter(tags=["map"]) @map_api_router.get('/bounds/', summary="get boundaries", description="get maximum boundaries of everything on the map", response={200: BoundsSchema, **auth_responses}) -@newapi_etag(permissions=False) +@api_etag(permissions=False) def bounds(request): return { "bounds": Source.max_bounds(), @@ -70,7 +70,7 @@ def _location_list(request, detailed: bool, filters: LocationListFilters): @map_api_router.get('/locations/', summary="list locations (slim)", description="Get locations (with most important attributes set)", response={200: list[SlimListableLocationSchema], **validate_responses, **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def location_list(request, filters: Query[LocationListFilters]): return _location_list(request, detailed=False, filters=filters) @@ -78,7 +78,7 @@ def location_list(request, filters: Query[LocationListFilters]): @map_api_router.get('/locations/full/', summary="list locations (full)", description="Get locations (with all attributes set)", response={200: list[FullListableLocationSchema], **validate_responses, **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def location_list_full(request, filters: Query[LocationListFilters]): return _location_list(request, detailed=True, filters=filters) @@ -151,8 +151,8 @@ class ShowRedirects(Schema): @map_api_router.get('/locations/{location_id}/', summary="location by ID (slim)", description="Get locations by ID (with all attributes set)", response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) -@newapi_stats('location_get') -@newapi_etag(base_mapdata=True) +@api_stats('location_get') +@api_etag(base_mapdata=True) def location_by_id(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter], redirects: Query[ShowRedirects]): return _location_retrieve( @@ -165,8 +165,8 @@ def location_by_id(request, location_id: AnyLocationID, filters: Query[RemoveGeo @map_api_router.get('/locations/{location_id}/full/', summary="location by ID (full)", description="Get location by ID (with all attributes set)", response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) -@newapi_stats('location_get') -@newapi_etag(base_mapdata=True) +@api_stats('location_get') +@api_etag(base_mapdata=True) def location_by_id_full(request, location_id: AnyLocationID, filters: Query[RemoveGeometryFilter], redirects: Query[ShowRedirects]): return _location_retrieve( @@ -179,8 +179,8 @@ def location_by_id_full(request, location_id: AnyLocationID, filters: Query[Remo @map_api_router.get('/locations/{location_id}/display/', summary="location display by ID", description="Get location display information by ID", response={200: LocationDisplay, **API404.dict(), **auth_responses}) -@newapi_stats('location_display') -@newapi_etag(base_mapdata=True) +@api_stats('location_display') +@api_etag(base_mapdata=True) def location_by_id_display(request, location_id: AnyLocationID): return _location_display( request, @@ -191,8 +191,8 @@ def location_by_id_display(request, location_id: AnyLocationID): @map_api_router.get('/locations/{location_id}/geometry/', summary="location geometry by id", description="Get location geometry (if available) by ID", response={200: LocationGeometry, **API404.dict(), **auth_responses}) -@newapi_stats('location_geometery') -@newapi_etag(base_mapdata=True) +@api_stats('location_geometery') +@api_etag(base_mapdata=True) def location_by_id_geometry(request, location_id: AnyLocationID): return _location_geometry( request, @@ -203,8 +203,8 @@ def location_by_id_geometry(request, location_id: AnyLocationID): @map_api_router.get('/locations/by-slug/{location_slug}/', summary="location by slug (slim)", description="Get location by slug (with most important attributes set)", response={200: SlimLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) -@newapi_stats('location_get') -@newapi_etag(base_mapdata=True) +@api_stats('location_get') +@api_etag(base_mapdata=True) def location_by_slug(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter], redirects: Query[ShowRedirects]): return _location_retrieve( @@ -217,8 +217,8 @@ def location_by_slug(request, location_slug: NonEmptyStr, filters: Query[RemoveG @map_api_router.get('/locations/by-slug/{location_slug}/full/', summary="location by slug (full)", description="Get location by slug (with all attributes set)", response={200: FullLocationSchema, **API404.dict(), **validate_responses, **auth_responses}) -@newapi_stats('location_get') -@newapi_etag(base_mapdata=True) +@api_stats('location_get') +@api_etag(base_mapdata=True) def location_by_slug_full(request, location_slug: NonEmptyStr, filters: Query[RemoveGeometryFilter], redirects: Query[ShowRedirects]): return _location_retrieve( @@ -231,8 +231,8 @@ def location_by_slug_full(request, location_slug: NonEmptyStr, filters: Query[Re @map_api_router.get('/locations/by-slug/{location_slug}/display/', summary="location display by slug", description="Get location display information by slug", response={200: LocationDisplay, **API404.dict(), **auth_responses}) -@newapi_stats('location_display') -@newapi_etag(base_mapdata=True) +@api_stats('location_display') +@api_etag(base_mapdata=True) def location_by_slug_display(request, location_slug: NonEmptyStr): return _location_display( request, @@ -243,8 +243,8 @@ def location_by_slug_display(request, location_slug: NonEmptyStr): @map_api_router.get('/locations/by-slug/{location_slug}/geometry/', summary="location geometry by slug", description="Get location geometry (if available) by slug", response={200: LocationGeometry, **API404.dict(), **auth_responses}) -@newapi_stats('location_geometry') -@newapi_etag(base_mapdata=True) +@api_stats('location_geometry') +@api_etag(base_mapdata=True) def location_by_slug_geometry(request, location_slug: NonEmptyStr): return _location_geometry( request, @@ -255,7 +255,7 @@ def location_by_slug_geometry(request, location_slug: NonEmptyStr): @map_api_router.get('/positions/{position_id}/', summary="moving position coordinates", description="get current coordinates of a moving position / dynamic location", response={200: AnyPositionStatusSchema, **API404.dict(), **auth_responses}) -@newapi_stats('get_position') +@api_stats('get_position') def get_position_by_id(request, position_id: AnyPositionID): # no caching for obvious reasons! location = None diff --git a/src/c3nav/mapdata/newapi/mapdata.py b/src/c3nav/mapdata/api/mapdata.py similarity index 95% rename from src/c3nav/mapdata/newapi/mapdata.py rename to src/c3nav/mapdata/api/mapdata.py index 7ffe0afc..cd0fe2ef 100644 --- a/src/c3nav/mapdata/newapi/mapdata.py +++ b/src/c3nav/mapdata/api/mapdata.py @@ -4,15 +4,15 @@ from django.db.models import Model from ninja import Query from ninja import Router as APIRouter +from c3nav.api.auth import auth_responses, validate_responses from c3nav.api.exceptions import API404 -from c3nav.api.newauth import auth_responses, validate_responses +from c3nav.mapdata.api.base import api_etag, optimize_query from c3nav.mapdata.models import (Area, Building, Door, Hole, Level, LocationGroup, LocationGroupCategory, Source, Space, Stair) from c3nav.mapdata.models.access import AccessRestriction, AccessRestrictionGroup from c3nav.mapdata.models.geometry.space import (POI, Column, CrossDescription, LeaveDescription, LineObstacle, Obstacle, Ramp) from c3nav.mapdata.models.locations import DynamicLocation -from c3nav.mapdata.newapi.base import newapi_etag, optimize_query from c3nav.mapdata.schemas.filters import (ByCategoryFilter, ByGroupFilter, ByOnTopOfFilter, FilterSchema, LevelGeometryFilter, SpaceGeometryFilter) from c3nav.mapdata.schemas.models import (AccessRestrictionGroupSchema, AccessRestrictionSchema, AreaSchema, @@ -74,7 +74,7 @@ class LevelFilters(ByGroupFilter, ByOnTopOfFilter): @mapdata_api_router.get('/levels/', summary="level list", tags=["mapdata-root"], description=schema_description(LevelSchema), response={200: list[LevelSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def level_list(request, filters: Query[LevelFilters]): return mapdata_list_endpoint(request, model=Level, filters=filters) @@ -82,7 +82,7 @@ def level_list(request, filters: Query[LevelFilters]): @mapdata_api_router.get('/levels/{level_id}/', summary="level by ID", tags=["mapdata-root"], description=schema_description(LevelSchema), response={200: LevelSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def level_by_id(request, level_id: int): return mapdata_retrieve_endpoint(request, Level, pk=level_id) @@ -95,7 +95,7 @@ Buildings @mapdata_api_router.get('/buildings/', summary="building list", tags=["mapdata-level"], description=schema_description(BuildingSchema), response={200: list[BuildingSchema], **validate_responses, **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def building_list(request, filters: Query[LevelGeometryFilter]): return mapdata_list_endpoint(request, model=Building, filters=filters) @@ -103,7 +103,7 @@ def building_list(request, filters: Query[LevelGeometryFilter]): @mapdata_api_router.get('/buildings/{building_id}/', summary="building by ID", tags=["mapdata-level"], description=schema_description(BuildingSchema), response={200: BuildingSchema, **API404.dict(), **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def building_by_id(request, building_id: int): return mapdata_retrieve_endpoint(request, Building, pk=building_id) @@ -120,7 +120,7 @@ class SpaceFilters(ByGroupFilter, LevelGeometryFilter): @mapdata_api_router.get('/spaces/', summary="space list", tags=["mapdata-level"], description=schema_description(SpaceSchema), response={200: list[SpaceSchema], **validate_responses, **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def space_list(request, filters: Query[SpaceFilters]): return mapdata_list_endpoint(request, model=Space, filters=filters) @@ -128,7 +128,7 @@ def space_list(request, filters: Query[SpaceFilters]): @mapdata_api_router.get('/space/{space_id}/', summary="space by ID", tags=["mapdata-level"], description=schema_description(SpaceSchema), response={200: SpaceSchema, **API404.dict(), **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def space_by_id(request, space_id: int): return mapdata_retrieve_endpoint(request, Space, pk=space_id) @@ -141,7 +141,7 @@ Doors @mapdata_api_router.get('/doors/', summary="door list", tags=["mapdata-level"], description=schema_description(DoorSchema), response={200: list[DoorSchema], **validate_responses, **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def door_list(request, filters: Query[LevelGeometryFilter]): return mapdata_list_endpoint(request, model=Door, filters=filters) @@ -149,7 +149,7 @@ def door_list(request, filters: Query[LevelGeometryFilter]): @mapdata_api_router.get('/doors/{door_id}/', summary="door by ID", tags=["mapdata-level"], description=schema_description(DoorSchema), response={200: DoorSchema, **API404.dict(), **auth_responses}) -@newapi_etag(base_mapdata=True) +@api_etag(base_mapdata=True) def door_by_id(request, door_id: int): return mapdata_retrieve_endpoint(request, Door, pk=door_id) @@ -162,7 +162,7 @@ Holes @mapdata_api_router.get('/holes/', summary="hole list", tags=["mapdata-space"], description=schema_description(HoleSchema), response={200: list[HoleSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def hole_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=Hole, filters=filters) @@ -170,7 +170,7 @@ def hole_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/holes/{hole_id}/', summary="hole by ID", tags=["mapdata-space"], description=schema_description(HoleSchema), response={200: HoleSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def hole_by_id(request, hole_id: int): return mapdata_retrieve_endpoint(request, Hole, pk=hole_id) @@ -187,7 +187,7 @@ class AreaFilters(ByGroupFilter, SpaceGeometryFilter): @mapdata_api_router.get('/areas/', summary="area list", tags=["mapdata-space"], description=schema_description(AreaSchema), response={200: list[AreaSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def area_list(request, filters: Query[AreaFilters]): return mapdata_list_endpoint(request, model=Area, filters=filters) @@ -195,7 +195,7 @@ def area_list(request, filters: Query[AreaFilters]): @mapdata_api_router.get('/areas/{area_id}/', summary="area by ID", tags=["mapdata-space"], description=schema_description(AreaSchema), response={200: AreaSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def area_by_id(request, area_id: int): return mapdata_retrieve_endpoint(request, Area, pk=area_id) @@ -208,7 +208,7 @@ Stairs @mapdata_api_router.get('/stairs/', summary="stair list", tags=["mapdata-space"], description=schema_description(StairSchema), response={200: list[StairSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def stair_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=Stair, filters=filters) @@ -216,7 +216,7 @@ def stair_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/stairs/{stair_id}/', summary="stair by ID", tags=["mapdata-space"], description=schema_description(StairSchema), response={200: StairSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def stair_by_id(request, stair_id: int): return mapdata_retrieve_endpoint(request, Stair, pk=stair_id) @@ -229,7 +229,7 @@ Ramps @mapdata_api_router.get('/ramps/', summary="ramp list", tags=["mapdata-space"], description=schema_description(RampSchema), response={200: list[RampSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def ramp_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=Ramp, filters=filters) @@ -237,7 +237,7 @@ def ramp_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/ramps/{ramp_id}/', summary="ramp by ID", tags=["mapdata-space"], description=schema_description(RampSchema), response={200: RampSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def ramp_by_id(request, ramp_id: int): return mapdata_retrieve_endpoint(request, Ramp, pk=ramp_id) @@ -250,7 +250,7 @@ Obstacles @mapdata_api_router.get('/obstacles/', summary="obstacle list", tags=["mapdata-space"], description=schema_description(ObstacleSchema), response={200: list[ObstacleSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def obstacle_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=Obstacle, filters=filters) @@ -258,7 +258,7 @@ def obstacle_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/obstacles/{obstacle_id}/', summary="obstacle by ID", tags=["mapdata-space"], description=schema_description(ObstacleSchema), response={200: ObstacleSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def obstacle_by_id(request, obstacle_id: int): return mapdata_retrieve_endpoint(request, Obstacle, pk=obstacle_id) @@ -271,7 +271,7 @@ LineObstacles @mapdata_api_router.get('/lineobstacles/', summary="line obstacle list", tags=["mapdata-space"], description=schema_description(LineObstacleSchema), response={200: list[LineObstacleSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=LineObstacle, filters=filters) @@ -279,7 +279,7 @@ def lineobstacle_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/lineobstacles/{lineobstacle_id}/', summary="line obstacle by ID", tags=["mapdata-space"], description=schema_description(LineObstacleSchema), response={200: LineObstacleSchema, **API404.dict(), **auth_responses},) -@newapi_etag() +@api_etag() def lineobstacle_by_id(request, lineobstacle_id: int): return mapdata_retrieve_endpoint(request, LineObstacle, pk=lineobstacle_id) @@ -292,7 +292,7 @@ Columns @mapdata_api_router.get('/columns/', summary="column list", tags=["mapdata-space"], description=schema_description(ColumnSchema), response={200: list[ColumnSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def column_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=Column, filters=filters) @@ -300,7 +300,7 @@ def column_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/columns/{column_id}/', summary="column by ID", tags=["mapdata-space"], description=schema_description(ColumnSchema), response={200: ColumnSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def column_by_id(request, column_id: int): return mapdata_retrieve_endpoint(request, Column, pk=column_id) @@ -313,7 +313,7 @@ POIs @mapdata_api_router.get('/pois/', summary="POI list", tags=["mapdata-space"], description=schema_description(POISchema), response={200: list[POISchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def poi_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=POI, filters=filters) @@ -321,7 +321,7 @@ def poi_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/pois/{poi_id}/', summary="POI by ID", tags=["mapdata-space"], description=schema_description(POISchema), response={200: POISchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def poi_by_id(request, poi_id: int): return mapdata_retrieve_endpoint(request, POI, pk=poi_id) @@ -334,7 +334,7 @@ LeaveDescriptions @mapdata_api_router.get('/leavedescriptions/', summary="leave description list", tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema), response={200: list[LeaveDescriptionSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def leavedescription_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=LeaveDescription, filters=filters) @@ -342,7 +342,7 @@ def leavedescription_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/leavedescriptions/{leavedescription_id}/', summary="leave description by ID", tags=["mapdata-space"], description=schema_description(LeaveDescriptionSchema), response={200: LeaveDescriptionSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def leavedescription_by_id(request, leavedescription_id: int): return mapdata_retrieve_endpoint(request, LeaveDescription, pk=leavedescription_id) @@ -355,7 +355,7 @@ CrossDescriptions @mapdata_api_router.get('/crossdescriptions/', summary="cross description list", tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema), response={200: list[CrossDescriptionSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def crossdescription_list(request, filters: Query[SpaceGeometryFilter]): return mapdata_list_endpoint(request, model=CrossDescription, filters=filters) @@ -363,7 +363,7 @@ def crossdescription_list(request, filters: Query[SpaceGeometryFilter]): @mapdata_api_router.get('/crossdescriptions/{crossdescription_id}/', summary="cross description by ID", tags=["mapdata-space"], description=schema_description(CrossDescriptionSchema), response={200: CrossDescriptionSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def crossdescription_by_id(request, crossdescription_id: int): return mapdata_retrieve_endpoint(request, CrossDescription, pk=crossdescription_id) @@ -376,7 +376,7 @@ LocationGroup @mapdata_api_router.get('/locationgroups/', summary="location group list", tags=["mapdata-root"], description=schema_description(LocationGroupSchema), response={200: list[LocationGroupSchema], **validate_responses, **auth_responses}) -@newapi_etag() +@api_etag() def locationgroup_list(request, filters: Query[ByCategoryFilter]): return mapdata_list_endpoint(request, model=LocationGroup, filters=filters) @@ -384,7 +384,7 @@ def locationgroup_list(request, filters: Query[ByCategoryFilter]): @mapdata_api_router.get('/locationgroups/{locationgroup_id}/', summary="location group by ID", tags=["mapdata-root"], description=schema_description(LocationGroupSchema), response={200: LocationGroupSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def locationgroup_by_id(request, locationgroup_id: int): return mapdata_retrieve_endpoint(request, LocationGroup, pk=locationgroup_id) @@ -397,7 +397,7 @@ LocationGroupCategories @mapdata_api_router.get('/locationgroupcategories/', summary="location group category list", tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema), response={200: list[LocationGroupCategorySchema], **auth_responses}) -@newapi_etag() +@api_etag() def locationgroupcategory_list(request): return mapdata_list_endpoint(request, model=LocationGroupCategory) @@ -405,7 +405,7 @@ def locationgroupcategory_list(request): @mapdata_api_router.get('/locationgroupcategories/{category_id}/', summary="location group category by ID", tags=["mapdata-root"], description=schema_description(LocationGroupCategorySchema), response={200: LocationGroupCategorySchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def locationgroupcategory_by_id(request, category_id: int): return mapdata_retrieve_endpoint(request, LocationGroupCategory, pk=category_id) @@ -418,7 +418,7 @@ Sources @mapdata_api_router.get('/sources/', summary="source list", tags=["mapdata-root"], description=schema_description(SourceSchema), response={200: list[SourceSchema], **auth_responses}) -@newapi_etag() +@api_etag() def source_list(request): return mapdata_list_endpoint(request, model=Source) @@ -426,7 +426,7 @@ def source_list(request): @mapdata_api_router.get('/sources/{source_id}/', summary="source by ID", tags=["mapdata-root"], description=schema_description(SourceSchema), response={200: SourceSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def source_by_id(request, source_id: int): return mapdata_retrieve_endpoint(request, Source, pk=source_id) @@ -439,7 +439,7 @@ AccessRestrictions @mapdata_api_router.get('/accessrestrictions/', summary="access restriction list", tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema), response={200: list[AccessRestrictionSchema], **auth_responses}) -@newapi_etag() +@api_etag() def accessrestriction_list(request): return mapdata_list_endpoint(request, model=AccessRestriction) @@ -447,7 +447,7 @@ def accessrestriction_list(request): @mapdata_api_router.get('/accessrestrictions/{accessrestriction_id}/', summary="access restriction by ID", tags=["mapdata-root"], description=schema_description(AccessRestrictionSchema), response={200: AccessRestrictionSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def accessrestriction_by_id(request, accessrestriction_id: int): return mapdata_retrieve_endpoint(request, AccessRestriction, pk=accessrestriction_id) @@ -460,7 +460,7 @@ AccessRestrictionGroups @mapdata_api_router.get('/accessrestrictiongroups/', summary="access restriction group list", tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema), response={200: list[AccessRestrictionGroupSchema], **auth_responses}) -@newapi_etag() +@api_etag() def accessrestrictiongroup_list(request): return mapdata_list_endpoint(request, model=AccessRestrictionGroup) @@ -468,7 +468,7 @@ def accessrestrictiongroup_list(request): @mapdata_api_router.get('/accessrestrictiongroups/{group_id}/', summary="access restriction group by ID", tags=["mapdata-root"], description=schema_description(AccessRestrictionGroupSchema), response={200: AccessRestrictionGroupSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def accessrestrictiongroups_by_id(request, group_id: int): return mapdata_retrieve_endpoint(request, AccessRestrictionGroup, pk=group_id) @@ -481,7 +481,7 @@ DynamicLocations @mapdata_api_router.get('/dynamiclocations/', summary="dynamic location list", tags=["mapdata-root"], description=schema_description(DynamicLocationSchema), response={200: list[DynamicLocationSchema], **auth_responses}) -@newapi_etag() +@api_etag() def dynamiclocation_list(request): return mapdata_list_endpoint(request, model=DynamicLocation) @@ -489,6 +489,6 @@ def dynamiclocation_list(request): @mapdata_api_router.get('/dynamiclocations/{dynamiclocation_id}/', summary="dynamic location by ID", tags=["mapdata-root"], description=schema_description(DynamicLocationSchema), response={200: DynamicLocationSchema, **API404.dict(), **auth_responses}) -@newapi_etag() +@api_etag() def dynamiclocation_by_id(request, dynamiclocation_id: int): return mapdata_retrieve_endpoint(request, DynamicLocation, pk=dynamiclocation_id) diff --git a/src/c3nav/mapdata/newapi/updates.py b/src/c3nav/mapdata/api/updates.py similarity index 96% rename from src/c3nav/mapdata/newapi/updates.py rename to src/c3nav/mapdata/api/updates.py index a871d9ac..565cc355 100644 --- a/src/c3nav/mapdata/newapi/updates.py +++ b/src/c3nav/mapdata/api/updates.py @@ -6,10 +6,10 @@ from ninja import Router as APIRouter from ninja import Schema from pydantic import PositiveInt -from c3nav.api.newauth import auth_responses +from c3nav.api.auth import auth_responses from c3nav.api.utils import NonEmptyStr +from c3nav.mapdata.api.base import api_etag from c3nav.mapdata.models import MapUpdate -from c3nav.mapdata.newapi.base import newapi_etag from c3nav.mapdata.schemas.responses import BoundsSchema from c3nav.mapdata.utils.cache.stats import increment_cache_key from c3nav.mapdata.utils.user import get_user_data diff --git a/src/c3nav/mesh/newapi.py b/src/c3nav/mesh/api.py similarity index 98% rename from src/c3nav/mesh/newapi.py rename to src/c3nav/mesh/api.py index 79dc68fa..e3809bdb 100644 --- a/src/c3nav/mesh/newapi.py +++ b/src/c3nav/mesh/api.py @@ -9,8 +9,8 @@ from ninja import Schema, UploadedFile from ninja.pagination import paginate from pydantic import PositiveInt, field_validator +from c3nav.api.auth import APITokenAuth, auth_permission_responses, auth_responses, validate_responses from c3nav.api.exceptions import API404, APIConflict, APIRequestValidationFailed -from c3nav.api.newauth import APITokenAuth, auth_permission_responses, auth_responses, validate_responses from c3nav.mesh.dataformats import BoardType, ChipType, FirmwareImage from c3nav.mesh.messages import MeshMessageType from c3nav.mesh.models import FirmwareBuild, FirmwareVersion, NodeMessage diff --git a/src/c3nav/routing/newapi/__init__.py b/src/c3nav/routing/api/__init__.py similarity index 100% rename from src/c3nav/routing/newapi/__init__.py rename to src/c3nav/routing/api/__init__.py diff --git a/src/c3nav/routing/newapi/positioning.py b/src/c3nav/routing/api/positioning.py similarity index 98% rename from src/c3nav/routing/newapi/positioning.py rename to src/c3nav/routing/api/positioning.py index 6cde5988..a1ba10a0 100644 --- a/src/c3nav/routing/newapi/positioning.py +++ b/src/c3nav/routing/api/positioning.py @@ -6,7 +6,7 @@ from ninja import Router as APIRouter from ninja import Schema from pydantic import NegativeInt, PositiveInt -from c3nav.api.newauth import auth_responses +from c3nav.api.auth import auth_responses from c3nav.api.utils import NonEmptyStr from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.schemas.models import CustomLocationSchema diff --git a/src/c3nav/routing/newapi/routing.py b/src/c3nav/routing/api/routing.py similarity index 98% rename from src/c3nav/routing/newapi/routing.py rename to src/c3nav/routing/api/routing.py index 9d10f1ce..219fe094 100644 --- a/src/c3nav/routing/newapi/routing.py +++ b/src/c3nav/routing/api/routing.py @@ -9,12 +9,12 @@ from ninja import Router as APIRouter from ninja import Schema from pydantic import PositiveInt +from c3nav.api.auth import APITokenAuth, auth_responses, validate_responses from c3nav.api.exceptions import APIRequestValidationFailed -from c3nav.api.newauth import APITokenAuth, auth_responses, validate_responses from c3nav.api.utils import NonEmptyStr +from c3nav.mapdata.api.base import api_stats_clean_location_value from c3nav.mapdata.models.access import AccessPermission from c3nav.mapdata.models.locations import Position -from c3nav.mapdata.newapi.base import api_stats_clean_location_value from c3nav.mapdata.schemas.model_base import AnyLocationID, Coordinates3D from c3nav.mapdata.utils.cache.stats import increment_cache_key from c3nav.mapdata.utils.locations import visible_locations_for_request