43 lines
1.2 KiB
Python
43 lines
1.2 KiB
Python
# scopes.api.tracking
|
|
|
|
"""basic (generic) routes and views for tracks (records)"""
|
|
|
|
from datetime import datetime
|
|
from fastapi import APIRouter, Body, Depends
|
|
from fastapi.responses import HTMLResponse
|
|
from pydantic import BaseModel, Field
|
|
import transaction
|
|
from typing import Annotated, Any, Self
|
|
|
|
from scopes.api import deps
|
|
from scopes.storage import tracking
|
|
from scopes.storage.common import Storage
|
|
|
|
class Track(BaseModel):
|
|
uid: str = None
|
|
head: dict[str, str]
|
|
data: dict[str, Any]
|
|
timeStamp: datetime = None
|
|
|
|
# routes
|
|
|
|
router = APIRouter()
|
|
|
|
type Storage = Annotated[Storage, Depends(deps.storage)]
|
|
|
|
@router.get('/tracks', response_model=list[Track])
|
|
async def get_tracks(storage: Storage):
|
|
tracks = storage.create(tracking.Container)
|
|
result = [tr.asDict() for tr in tracks.query()]
|
|
transaction.commit()
|
|
return result
|
|
|
|
@router.post('/tracks', response_model=Track)
|
|
async def post_track(track: Annotated[Track, Body()], storage: Storage):
|
|
tracks = storage.create(tracking.Container)
|
|
hd = track.head
|
|
tr = tracking.Track(hd['taskId'], hd['userName'], data=track.data)
|
|
tracks.save(tr)
|
|
transaction.commit()
|
|
return tr.asDict()
|
|
|