BakoAI / app /api /communications.py
Okidi Norbert
Deployment fix: clean backend only
c6abe34
from uuid import uuid4
from datetime import datetime
from typing import List
from fastapi import APIRouter, Depends, HTTPException, status
from app.dependencies import (
get_supabase,
get_current_user,
require_team_account,
require_staff_member,
require_linked_account
)
from app.services.supabase_client import SupabaseService
from app.models.communication import Announcement, AnnouncementCreate, AnnouncementListResponse
router = APIRouter()
@router.get("/announcements", response_model=AnnouncementListResponse)
async def get_announcements(
current_user: dict = Depends(get_current_user),
supabase: SupabaseService = Depends(get_supabase),
):
"""
Get all announcements for the user's organization.
Accessible by Team Owners, Coaches, and Linked Players.
"""
org_id = current_user.get("organization_id")
# Fallback to DB check if not in token (account might have been linked after login)
if not org_id:
user_id = current_user["id"]
user_record = await supabase.select_one("users", user_id)
if user_record and user_record.get("organization_id"):
org_id = user_record["organization_id"]
elif current_user.get("account_type") == "team":
# Extra fallback for Owners
orgs = await supabase.select("organizations", filters={"owner_id": user_id})
if orgs:
org_id = orgs[0]["id"]
if not org_id:
# User is not linked to any organization
return AnnouncementListResponse(announcements=[], total=0)
announcements_data = await supabase.select(
"announcements",
filters={"organization_id": org_id},
order_by="created_at",
ascending=False
)
# Enrich with author name if needed (optional)
announcements = []
for item in announcements_data:
announcement = Announcement(**item)
# Fetch author name for UI
author = await supabase.select_one("users", str(item["author_id"]))
if author:
announcement.author_name = author.get("full_name") or author.get("email")
announcements.append(announcement)
return AnnouncementListResponse(announcements=announcements, total=len(announcements))
@router.post("/announcements", response_model=Announcement, status_code=status.HTTP_201_CREATED)
async def create_announcement(
data: AnnouncementCreate,
current_user: dict = Depends(require_staff_member),
supabase: SupabaseService = Depends(get_supabase),
):
"""
Create a new announcement for the organization.
Restricted to Coaching Staff (per user request).
"""
org_id = current_user.get("organization_id")
if not org_id:
raise HTTPException(status_code=403, detail="You must be linked to an organization")
announcement_id = str(uuid4())
record = {
"id": announcement_id,
"organization_id": org_id,
"author_id": current_user["id"],
"title": data.title,
"content": data.content,
"created_at": datetime.now().isoformat(),
"updated_at": datetime.now().isoformat()
}
saved = await supabase.insert("announcements", record)
# Create notifications for all players in the roster
try:
players = await supabase.select("players", filters={"organization_id": org_id})
for player in players:
if player.get("user_id"):
await supabase.insert("notifications", {
"id": str(uuid4()),
"recipient_id": player["user_id"],
"title": f"New Announcement: {data.title}",
"message": f"Coach {current_user.get('email')} posted a new announcement.",
"type": "announcement",
"read": False,
"created_at": datetime.now().isoformat()
})
except Exception as e:
print(f"Warning: Failed to send announcement notifications: {e}")
return Announcement(**saved)
@router.delete("/announcements/{announcement_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_announcement(
announcement_id: str,
current_user: dict = Depends(require_staff_member),
supabase: SupabaseService = Depends(get_supabase),
):
"""
Delete an announcement.
Restricted to Coaches.
"""
org_id = current_user.get("organization_id")
announcement = await supabase.select_one("announcements", announcement_id)
if not announcement:
raise HTTPException(status_code=404, detail="Announcement not found")
if str(announcement["organization_id"]) != str(org_id):
raise HTTPException(status_code=403, detail="Access denied")
await supabase.delete("announcements", announcement_id)
return None