137 lines
4.5 KiB
Python
137 lines
4.5 KiB
Python
|
|
from typing import List
|
||
|
|
|
||
|
|
from fastapi import APIRouter, Body, Depends, status
|
||
|
|
|
||
|
|
from app.api.dependencies.auth import get_current_active_user, get_payload
|
||
|
|
from app.api.dependencies.factory import Factory
|
||
|
|
from app.core.data_types import UUID7Field
|
||
|
|
from app.core.params import CommonParams
|
||
|
|
from app.schemas.base import PaginatedResponse
|
||
|
|
from app.schemas.mapset_schema import (
|
||
|
|
MapsetByOrganizationSchema,
|
||
|
|
MapsetCreateSchema,
|
||
|
|
MapsetSchema,
|
||
|
|
MapsetUpdateSchema,
|
||
|
|
)
|
||
|
|
from app.schemas.user_schema import UserSchema
|
||
|
|
from app.services import MapsetService
|
||
|
|
|
||
|
|
router = APIRouter()
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/mapsets", response_model=PaginatedResponse[MapsetSchema])
|
||
|
|
async def get_mapsets(
|
||
|
|
params: CommonParams = Depends(),
|
||
|
|
user: UserSchema = Depends(get_payload),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
landing: bool = False,
|
||
|
|
):
|
||
|
|
filter = params.filter
|
||
|
|
sort = params.sort
|
||
|
|
search = params.search
|
||
|
|
group_by = params.group_by
|
||
|
|
limit = params.limit
|
||
|
|
offset = params.offset
|
||
|
|
mapsets, total = await service.find_all(user, filter, sort, search, group_by, limit, offset, landing)
|
||
|
|
|
||
|
|
return PaginatedResponse(
|
||
|
|
items=[MapsetSchema.model_validate(mapset) for mapset in mapsets],
|
||
|
|
total=total,
|
||
|
|
limit=limit,
|
||
|
|
offset=offset,
|
||
|
|
has_more=total > (offset + limit),
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/mapsets/organization", response_model=PaginatedResponse[MapsetByOrganizationSchema])
|
||
|
|
async def get_mapsets_organization(
|
||
|
|
params: CommonParams = Depends(),
|
||
|
|
user: UserSchema = Depends(get_payload),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
filter = params.filter
|
||
|
|
sort = params.sort
|
||
|
|
search = params.search
|
||
|
|
limit = params.limit
|
||
|
|
offset = params.offset
|
||
|
|
mapsets, total = await service.find_all_group_by_organization(user, filter, sort, search, limit, offset)
|
||
|
|
return PaginatedResponse(
|
||
|
|
items=[MapsetByOrganizationSchema.model_validate(mapset) for mapset in mapsets],
|
||
|
|
total=total,
|
||
|
|
limit=limit,
|
||
|
|
offset=offset,
|
||
|
|
has_more=total > (offset + limit),
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
@router.get("/mapsets/{id}", response_model=MapsetSchema)
|
||
|
|
async def get_mapset(
|
||
|
|
id: UUID7Field,
|
||
|
|
user: UserSchema = Depends(get_payload),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
mapset = await service.find_by_id(id, user=user)
|
||
|
|
return mapset
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/mapsets", response_model=MapsetSchema, status_code=status.HTTP_201_CREATED)
|
||
|
|
async def create_mapset(
|
||
|
|
data: MapsetCreateSchema,
|
||
|
|
user: UserSchema = Depends(get_current_active_user),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
mapset = await service.create(user, data.dict())
|
||
|
|
return mapset
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/mapsets/color_scale", status_code=status.HTTP_200_OK)
|
||
|
|
async def create_color_scale(
|
||
|
|
source_url: str = Body(..., embed=True),
|
||
|
|
color_range: list[str] = Body(None, embed=True),
|
||
|
|
boundary_file_id: UUID7Field = Body(None, embed=True),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
result, rangelist = await service.generate_colorscale(source_url, color_range, boundary_file_id)
|
||
|
|
return {"data": result, "rangelist": rangelist}
|
||
|
|
|
||
|
|
|
||
|
|
@router.patch(
|
||
|
|
"/mapsets/activation", status_code=status.HTTP_204_NO_CONTENT, dependencies=[Depends(get_current_active_user)]
|
||
|
|
)
|
||
|
|
async def update_mapset_activation(
|
||
|
|
ids: List[UUID7Field] = Body(...),
|
||
|
|
is_active: bool = Body(...),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
await service.bulk_update_activation(ids, is_active)
|
||
|
|
|
||
|
|
|
||
|
|
@router.patch("/mapsets/{id}", response_model=MapsetSchema, dependencies=[Depends(get_payload)])
|
||
|
|
async def update_mapset(
|
||
|
|
id: UUID7Field,
|
||
|
|
data: MapsetUpdateSchema,
|
||
|
|
user: UserSchema = Depends(get_current_active_user),
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
mapset = await service.update(id, user, data.dict(exclude_unset=True))
|
||
|
|
return mapset
|
||
|
|
|
||
|
|
|
||
|
|
@router.delete(
|
||
|
|
"/mapsets/{id}", status_code=status.HTTP_204_NO_CONTENT, dependencies=[Depends(get_current_active_user)]
|
||
|
|
)
|
||
|
|
async def delete_mapset(id: UUID7Field, service: MapsetService = Depends(Factory().get_mapset_service)):
|
||
|
|
await service.delete(id)
|
||
|
|
|
||
|
|
|
||
|
|
@router.post("/mapsets/{id}/download", status_code=status.HTTP_204_NO_CONTENT)
|
||
|
|
async def increment_download_mapset(
|
||
|
|
id: UUID7Field,
|
||
|
|
service: MapsetService = Depends(Factory().get_mapset_service),
|
||
|
|
):
|
||
|
|
"""
|
||
|
|
Increment download_count for the given mapset.
|
||
|
|
No file is downloaded; this only updates the counter.
|
||
|
|
"""
|
||
|
|
await service.increment_download_count(id)
|