satupeta-main/app/api/v1/routes/mapset_route.py
2026-02-23 12:20:42 +07:00

147 lines
4.9 KiB
Python
Executable File

from typing import List
from fastapi import APIRouter, Body, Depends, status
from app.api.dependencies.auth import get_current_active_user, get_payload, verify_internal_service
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("/internal/mapsets", response_model=MapsetSchema)
async def create_mapset_internal(
data: MapsetCreateSchema,
_: None = Depends(verify_internal_service),
mapset_service: MapsetService = Depends(Factory().get_mapset_service),
):
return await mapset_service.create_system(None, data.dict())
@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)