feat: implement CRUD APIs for projects and scenarios with validated schemas

This commit is contained in:
2025-11-09 17:23:10 +01:00
parent 8bf46b80c8
commit 61b42b3041
14 changed files with 380 additions and 38 deletions

37
schemas/project.py Normal file
View File

@@ -0,0 +1,37 @@
from __future__ import annotations
from datetime import datetime
from pydantic import BaseModel, ConfigDict
from models import MiningOperationType
class ProjectBase(BaseModel):
name: str
location: str | None = None
operation_type: MiningOperationType
description: str | None = None
model_config = ConfigDict(extra="forbid")
class ProjectCreate(ProjectBase):
pass
class ProjectUpdate(BaseModel):
name: str | None = None
location: str | None = None
operation_type: MiningOperationType | None = None
description: str | None = None
model_config = ConfigDict(extra="forbid")
class ProjectRead(ProjectBase):
id: int
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)

66
schemas/scenario.py Normal file
View File

@@ -0,0 +1,66 @@
from __future__ import annotations
from datetime import date, datetime
from pydantic import BaseModel, ConfigDict, field_validator
from models import ResourceType, ScenarioStatus
class ScenarioBase(BaseModel):
name: str
description: str | None = None
status: ScenarioStatus = ScenarioStatus.DRAFT
start_date: date | None = None
end_date: date | None = None
discount_rate: float | None = None
currency: str | None = None
primary_resource: ResourceType | None = None
model_config = ConfigDict(extra="forbid")
@field_validator("currency")
@classmethod
def normalise_currency(cls, value: str | None) -> str | None:
if value is None:
return value
value = value.upper()
if len(value) != 3:
raise ValueError("Currency code must be a 3-letter ISO value")
return value
class ScenarioCreate(ScenarioBase):
pass
class ScenarioUpdate(BaseModel):
name: str | None = None
description: str | None = None
status: ScenarioStatus | None = None
start_date: date | None = None
end_date: date | None = None
discount_rate: float | None = None
currency: str | None = None
primary_resource: ResourceType | None = None
model_config = ConfigDict(extra="forbid")
@field_validator("currency")
@classmethod
def normalise_currency(cls, value: str | None) -> str | None:
if value is None:
return value
value = value.upper()
if len(value) != 3:
raise ValueError("Currency code must be a 3-letter ISO value")
return value
class ScenarioRead(ScenarioBase):
id: int
project_id: int
created_at: datetime
updated_at: datetime
model_config = ConfigDict(from_attributes=True)