91 lines
2.9 KiB
Python
91 lines
2.9 KiB
Python
import sqlite3
|
|
from datetime import UTC, datetime
|
|
from pathlib import Path
|
|
from uuid import uuid4
|
|
|
|
from app.database import get_connection
|
|
from app.models import TeamMember, TeamMemberCreateRequest
|
|
|
|
|
|
def _row_to_member(row: sqlite3.Row) -> TeamMember:
|
|
return TeamMember(
|
|
id=row["id"],
|
|
name=row["name"],
|
|
student_number=row["student_number"],
|
|
sort_order=row["sort_order"],
|
|
created_at=datetime.fromisoformat(row["created_at"]),
|
|
updated_at=datetime.fromisoformat(row["updated_at"]),
|
|
)
|
|
|
|
|
|
def list_members(db_path: Path) -> list[TeamMember]:
|
|
conn = get_connection(db_path)
|
|
try:
|
|
rows = conn.execute("SELECT * FROM team_members ORDER BY sort_order ASC").fetchall()
|
|
return [_row_to_member(row) for row in rows]
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def add_member(db_path: Path, request: TeamMemberCreateRequest) -> TeamMember:
|
|
conn = get_connection(db_path)
|
|
try:
|
|
row = conn.execute(
|
|
"SELECT COALESCE(MAX(sort_order) + 1, 0) AS next_order FROM team_members"
|
|
).fetchone()
|
|
sort_order: int = row["next_order"] if row else 0
|
|
member_id = str(uuid4())
|
|
now = datetime.now(UTC).isoformat()
|
|
conn.execute(
|
|
"INSERT INTO team_members"
|
|
" (id, name, student_number, sort_order, created_at, updated_at)"
|
|
" VALUES (?, ?, ?, ?, ?, ?)",
|
|
(member_id, request.name, request.student_number, sort_order, now, now),
|
|
)
|
|
conn.commit()
|
|
return TeamMember(
|
|
id=member_id,
|
|
name=request.name,
|
|
student_number=request.student_number,
|
|
sort_order=sort_order,
|
|
created_at=datetime.fromisoformat(now),
|
|
updated_at=datetime.fromisoformat(now),
|
|
)
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def delete_member(db_path: Path, member_id: str) -> bool:
|
|
conn = get_connection(db_path)
|
|
try:
|
|
existing = conn.execute(
|
|
"SELECT id FROM team_members WHERE id = ?", (member_id,)
|
|
).fetchone()
|
|
if existing is None:
|
|
return False
|
|
conn.execute("DELETE FROM team_members WHERE id = ?", (member_id,))
|
|
conn.commit()
|
|
return True
|
|
finally:
|
|
conn.close()
|
|
|
|
|
|
def reorder_members(db_path: Path, member_ids: list[str]) -> list[TeamMember]:
|
|
conn = get_connection(db_path)
|
|
try:
|
|
existing_ids = {
|
|
row["id"] for row in conn.execute("SELECT id FROM team_members").fetchall()
|
|
}
|
|
missing = set(member_ids) - existing_ids
|
|
if missing:
|
|
raise ValueError(f"Member IDs not found: {missing}")
|
|
now = datetime.now(UTC).isoformat()
|
|
for index, mid in enumerate(member_ids):
|
|
conn.execute(
|
|
"UPDATE team_members SET sort_order = ?, updated_at = ? WHERE id = ?",
|
|
(index, now, mid),
|
|
)
|
|
conn.commit()
|
|
return list_members(db_path)
|
|
finally:
|
|
conn.close()
|