initial release
This commit is contained in:
parent
e156de22c3
commit
b3ac11a85e
37 changed files with 3649 additions and 669 deletions
91
backend/app/services/team_service.py
Normal file
91
backend/app/services/team_service.py
Normal file
|
|
@ -0,0 +1,91 @@
|
|||
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()
|
||||
Loading…
Add table
Add a link
Reference in a new issue