meraproject/services/user-reader/app/project_members_service.py

76 lines
2.3 KiB
Python

"""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