calendar features
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2025-09-26 14:45:00 +09:00
parent b98034b616
commit 64171196b6
18 changed files with 2189 additions and 0 deletions

View File

@@ -0,0 +1,157 @@
import sys
import logging
from typing import Dict, List, Optional
from fastapi import FastAPI, Depends, HTTPException, Body, Path
from fastapi.middleware.cors import CORSMiddleware
# Настраиваем логирование
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger(__name__)
# Имитируем эндпоинты календарного сервиса для тестирования
app = FastAPI(title="Simplified Calendar Service")
# Включаем CORS
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# Упрощенная модель данных
from enum import Enum
from datetime import date, datetime
from typing import List, Optional
from pydantic import BaseModel, Field
# Модели для календарных записей
class EntryType(str, Enum):
PERIOD = "period"
OVULATION = "ovulation"
SYMPTOMS = "symptoms"
MOOD = "mood"
OTHER = "other"
class FlowIntensity(str, Enum):
LIGHT = "light"
MEDIUM = "medium"
HEAVY = "heavy"
class CalendarEntry(BaseModel):
id: int
user_id: int = 1
entry_date: date
entry_type: str
flow_intensity: Optional[str] = None
period_symptoms: Optional[str] = None
mood: Optional[str] = None
energy_level: Optional[int] = None
sleep_hours: Optional[float] = None
symptoms: Optional[str] = None
medications: Optional[str] = None
notes: Optional[str] = None
created_at: datetime = datetime.now()
updated_at: Optional[datetime] = None
# Хранилище данных в памяти
calendar_entries = []
# Вспомогательная функция для добавления тестовых данных
def add_test_entries():
if not calendar_entries:
for i in range(1, 5):
calendar_entries.append(
CalendarEntry(
id=i,
entry_date=date(2025, 9, 30),
entry_type="period",
flow_intensity="medium",
notes=f"Test entry {i}",
)
)
# Добавляем тестовые данные
add_test_entries()
@app.get("/")
def read_root():
return {"message": "Simplified Calendar Service API"}
@app.get("/health")
def health():
return {"status": "ok"}
# API для работы с календарем
@app.get("/api/v1/calendar/entries")
def get_calendar_entries():
"""Get all calendar entries"""
return calendar_entries
@app.post("/api/v1/calendar/entries", status_code=201)
def create_calendar_entry(entry: dict):
"""Create a new calendar entry"""
logger.debug(f"Received entry data: {entry}")
# Преобразуем строку даты в объект date
entry_date_str = entry.get("entry_date")
if entry_date_str and isinstance(entry_date_str, str):
try:
entry_date = date.fromisoformat(entry_date_str)
except ValueError:
entry_date = date.today()
else:
entry_date = date.today()
new_entry = CalendarEntry(
id=len(calendar_entries) + 1,
entry_date=entry_date,
entry_type=entry.get("entry_type", "other"),
flow_intensity=entry.get("flow_intensity"),
period_symptoms=entry.get("period_symptoms"),
mood=entry.get("mood"),
energy_level=entry.get("energy_level"),
sleep_hours=entry.get("sleep_hours"),
symptoms=entry.get("symptoms"),
medications=entry.get("medications"),
notes=entry.get("notes"),
)
calendar_entries.append(new_entry)
return new_entry
# Добавляем поддержку для /api/v1/entry
@app.post("/api/v1/entry", status_code=201)
def create_entry_without_calendar_prefix(entry: dict):
"""Create a new calendar entry via alternate endpoint (without /calendar/ prefix)"""
logger.debug(f"Received entry data via /api/v1/entry: {entry}")
return create_calendar_entry(entry)
# Добавляем поддержку для /api/v1/entries (legacy)
@app.post("/api/v1/entries", status_code=201)
def create_entry_legacy(entry: dict):
"""Create a new calendar entry via legacy endpoint"""
logger.debug(f"Received entry data via legacy endpoint: {entry}")
return create_calendar_entry(entry)
# Добавляем поддержку для мобильного формата
@app.post("/api/v1/calendar/entry", status_code=201)
def create_mobile_calendar_entry(mobile_entry: dict):
"""Create a new calendar entry from mobile app format"""
logger.debug(f"Received mobile entry data: {mobile_entry}")
# Преобразуем мобильный формат в стандартный
entry = {
"entry_date": mobile_entry.get("date", date.today().isoformat()),
"entry_type": mobile_entry.get("type", "OTHER").lower(),
"flow_intensity": "medium" if mobile_entry.get("flow_intensity") in [3, 4] else "light",
"notes": mobile_entry.get("notes"),
"symptoms": ", ".join(mobile_entry.get("symptoms", [])) if isinstance(mobile_entry.get("symptoms"), list) else ""
}
return create_calendar_entry(entry)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8888)