Files
rehearshalhub/api/src/rehearsalhub/schemas/invite.py
Mistral Vibe 56ffd98f5e Phase 1 backend implementation: Add invite management endpoints
Implements core invite management features for band admins:
- GET /bands/{band_id}/invites - List all invites for a band (admin only)
- DELETE /invites/{invite_id} - Revoke pending invite (admin only)
- GET /invites/{token}/info - Get invite details (public)

Backend changes:
- Add invites router with 3 endpoints
- Update BandRepository with get_invites_for_band and get_invite_by_id methods
- Add new schemas for invite listing and info
- Register invites router in main.py

Tests:
- Integration tests for all 3 endpoints
- Permission tests (admin vs non-admin)
- Edge cases (not found, expired, etc.)

This addresses the core requirements:
- Admins can see pending invites
- Admins can revoke pending invites
- Users can view invite details before accepting

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-04-01 11:30:52 +02:00

66 lines
1.4 KiB
Python

from __future__ import annotations
import uuid
from datetime import datetime
from pydantic import BaseModel, ConfigDict
class BandInviteRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
band_id: uuid.UUID
token: str
role: str
expires_at: datetime
used_at: datetime | None = None
class BandInviteListItem(BaseModel):
"""Invite for listing (includes creator info)"""
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
band_id: uuid.UUID
token: str
role: str
expires_at: datetime
created_at: datetime
is_used: bool
used_at: datetime | None = None
# Creator info (optional, can be expanded)
class BandInviteList(BaseModel):
"""Response for listing invites"""
model_config = ConfigDict(from_attributes=True)
invites: list[BandInviteListItem]
total: int
pending: int
class InviteInfoRead(BaseModel):
"""Public invite info (used for /invites/{token}/info)"""
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
band_id: uuid.UUID
band_name: str
band_slug: str
role: str
expires_at: datetime
created_at: datetime
is_used: bool
class BandMemberRead(BaseModel):
model_config = ConfigDict(from_attributes=True)
id: uuid.UUID
display_name: str
email: str
role: str
joined_at: datetime