Stuff
This commit is contained in:
0
src/resources/__init__.py
Normal file
0
src/resources/__init__.py
Normal file
21
src/resources/models.py
Normal file
21
src/resources/models.py
Normal file
@@ -0,0 +1,21 @@
|
||||
from sqlmodel import SQLModel, Field, Relationship
|
||||
from datetime import datetime
|
||||
from typing import Optional, List
|
||||
|
||||
class ResourceType(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str
|
||||
changes: List["ResourceChange"] = Relationship(back_populates="type")
|
||||
|
||||
@property
|
||||
def balance(self) -> float:
|
||||
return sum(change.change for change in self.changes)
|
||||
|
||||
|
||||
class ResourceChange(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
change: float
|
||||
timestamp: datetime = Field(default_factory=datetime.now)
|
||||
|
||||
type_id: Optional[int] = Field(default=None, foreign_key="resourcetype.id")
|
||||
type: Optional[ResourceType] = Relationship(back_populates="changes")
|
||||
76
src/resources/routes.py
Normal file
76
src/resources/routes.py
Normal file
@@ -0,0 +1,76 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException, status
|
||||
from sqlalchemy import func
|
||||
from sqlalchemy.orm import Session
|
||||
from typing import List
|
||||
from sqlmodel import select
|
||||
|
||||
from src.db import get_db
|
||||
from src.utils.decorators import auth_required
|
||||
from src.resources.models import ResourceType, ResourceChange
|
||||
from src.resources.schemas import (
|
||||
ResourceTypeCreate, ResourceTypeResponse,
|
||||
ResourceChangeCreate, ResourceChangeResponse
|
||||
)
|
||||
|
||||
resources_router = APIRouter()
|
||||
|
||||
@auth_required()
|
||||
@resources_router.post("/types", response_model=ResourceTypeResponse)
|
||||
def create_resource_type(rt: ResourceTypeCreate, db: Session = Depends(get_db)):
|
||||
db_rt = ResourceType.model_validate(rt)
|
||||
db.add(db_rt)
|
||||
db.commit()
|
||||
db.refresh(db_rt)
|
||||
return db_rt
|
||||
|
||||
|
||||
@auth_required()
|
||||
@resources_router.get("/types", response_model=List[ResourceTypeResponse])
|
||||
def list_resource_types(db: Session = Depends(get_db)):
|
||||
rts = db.execute(select(ResourceType)).scalars().all()
|
||||
return rts
|
||||
|
||||
|
||||
@auth_required()
|
||||
@resources_router.get("/types/{type_id}", response_model=ResourceTypeResponse)
|
||||
def get_resource_type(type_id: int, db: Session = Depends(get_db)):
|
||||
rt = db.get(ResourceType, type_id)
|
||||
if not rt:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Resource type not found")
|
||||
|
||||
return rt
|
||||
|
||||
|
||||
@auth_required()
|
||||
@resources_router.delete("/types/{type_id}", status_code=status.HTTP_204_NO_CONTENT)
|
||||
def delete_resource_type(type_id: int, db: Session = Depends(get_db)):
|
||||
rt = db.get(ResourceType, type_id)
|
||||
if not rt:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Resource type not found")
|
||||
db.delete(rt)
|
||||
db.commit()
|
||||
return
|
||||
|
||||
|
||||
@auth_required()
|
||||
@resources_router.post("/types/{type_id}/changes", response_model=ResourceChangeResponse)
|
||||
def create_resource_change(type_id: int, change: ResourceChangeCreate, db: Session = Depends(get_db)):
|
||||
rt = db.get(ResourceType, type_id)
|
||||
if not rt:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Resource type not found")
|
||||
|
||||
db_change = ResourceChange.model_validate(change)
|
||||
db_change.type = rt
|
||||
db.add(db_change)
|
||||
db.commit()
|
||||
db.refresh(db_change)
|
||||
return db_change
|
||||
|
||||
|
||||
@auth_required()
|
||||
@resources_router.get("/types/{type_id}/changes", response_model=List[ResourceChangeResponse])
|
||||
def list_resource_changes(type_id: int, db: Session = Depends(get_db)):
|
||||
rt = db.get(ResourceType, type_id)
|
||||
if not rt:
|
||||
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail="Resource type not found")
|
||||
return rt.changes
|
||||
19
src/resources/schemas.py
Normal file
19
src/resources/schemas.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
class ResourceTypeCreate(BaseModel):
|
||||
name: str
|
||||
|
||||
class ResourceTypeResponse(ResourceTypeCreate):
|
||||
id: int
|
||||
balance: float
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
|
||||
class ResourceChangeCreate(BaseModel):
|
||||
change: float
|
||||
|
||||
class ResourceChangeResponse(ResourceChangeCreate):
|
||||
id: int
|
||||
timestamp: datetime
|
||||
model_config = ConfigDict(from_attributes=True)
|
||||
Reference in New Issue
Block a user