"""Service-to-service write API составов проектов (только API-ключ).""" from __future__ import annotations import os import traceback from typing import Annotated, Any import pymysql from fastapi import APIRouter, Depends, HTTPException from app.main import _db_name, get_conn, require_api_key from app.project_members_helpers import fetch_member_item from app.project_members_write import ( ProjectMemberWrite, ensure_project_member_write_enabled, upsert_team_member, validate_member_write, ) router = APIRouter() def _http_500(e: Exception) -> HTTPException: dbg = os.environ.get("DEBUG", "") msg = str(e) if dbg == "1": msg = f"{msg}\n{traceback.format_exc()}" return HTTPException(status_code=500, detail=msg) @router.put("/api/service/project-members") def put_service_project_member( body: ProjectMemberWrite, _auth: Annotated[None, Depends(require_api_key)], ) -> dict[str, Any]: """Upsert участника проекта без X-Acting-Emp-Id и без isRwMember.""" ensure_project_member_write_enabled() try: with get_conn() as c: with c.cursor() as cur: db = _db_name(cur) project, _allowed = validate_member_write(cur, db, body) team_id = int(project["team"]) upsert_team_member( cur, db, team_id=team_id, emp_id=body.emp_id, section_id=body.section_id, role=body.role, active=body.active, text=body.text or "", ) c.commit() item = fetch_member_item(cur, db, body.project_id, body.emp_id) if not item: raise HTTPException( status_code=500, detail={ "code": "db_error", "message": "Запись не найдена после сохранения", }, ) return {"ok": True, **item} except HTTPException: raise except pymysql.Error as e: raise HTTPException(status_code=500, detail=str(e)) from e except Exception as e: raise _http_500(e) from e