76 lines
2.3 KiB
Python
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
|