from __future__ import annotations import uuid from sqlalchemy import String from sqlalchemy.dialects.postgresql import UUID from sqlalchemy.orm import Mapped, mapped_column from core.db.base import Base, SoftDeleteMixin, TimestampMixin from schemas.enums import GroupMemberRole, GroupMemberSource, GroupMemberStatus __all__ = [ "GroupMember", "GroupMemberRole", "GroupMemberSource", "GroupMemberStatus", ] class GroupMember(TimestampMixin, SoftDeleteMixin, Base): __tablename__: str = "group_members" __table_args__ = {"extend_existing": True} id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), primary_key=True, default=uuid.uuid4 ) group_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), nullable=False, ) user_id: Mapped[uuid.UUID] = mapped_column( UUID(as_uuid=True), nullable=False, ) role: Mapped[GroupMemberRole] = mapped_column( String(20), nullable=False, ) join_source: Mapped[GroupMemberSource] = mapped_column( String(20), nullable=False, ) invited_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) joined_at: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) removed_at: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) status: Mapped[GroupMemberStatus] = mapped_column( String(20), nullable=False, default=GroupMemberStatus.ACTIVE, ) created_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, ) updated_by: Mapped[uuid.UUID | None] = mapped_column( UUID(as_uuid=True), nullable=True, )