Skip to content

Services

Business logic layer in server_service/database/services/. Each service composes one or more repositories and encapsulates domain logic.

UserService

create_user(name, email, password) -> User
get_by_email(email) -> User | None
get_by_id(user_id) -> User | None
verify_password(email, password) -> bool
update_user_profile(user_id, **kwargs) -> User

RoomService

create_room(owner_id, name=None, type="CHAT") -> Room
get_user_rooms(user_id) -> list[Room]
get_room_by_id(room_id) -> Room | None
get_room_by_token(token) -> Room | None
delete_room(room_id) -> None
add_member(room_id, user_id, role="MEMBER") -> RoomMember
send_message(room_id, user_id, text) -> Message
get_messages(room_id, limit=50) -> list[Message]

TokenService

create_tokens(user_id) -> tuple[str, str]  # (access_token, refresh_token)
verify_token(token) -> dict | None          # JWT payload
create_refresh_token(user_id, token) -> RefreshToken
rotate_refresh_token(old_token) -> tuple[str, str] | None

DashboardService

create_dashboard(owner_id, name) -> Room
list_dashboards(owner_id) -> list[Room]
add_panel(room_id, panel_config) -> DashboardPanel
remove_panel(room_id, panel_id) -> None
update_layout(dashboard_id, layout) -> None
delete_dashboard(dashboard_id) -> None

FileService

get_rooms_for_file(file_id) -> list[Room]  # For reupload WS notifications

ApiKeyService

generate_key(user_id) -> tuple[str, ApiKey]  # (plaintext, record)
validate_key(key) -> User | None
revoke_key(key_id, user_id) -> None
list_keys(user_id) -> list[ApiKey]

EmailService

SendGrid integration for transactional emails:

send_password_reset(email, token) -> None
send_welcome(email, name) -> None

LicenseService / LicenseCatalogService / LicenseSeatService

SaaS subscription management: license validation, seat allocation, tier pricing.

Repository pattern

Each service uses repositories (server_service/database/repository/) for data access. Repositories inherit from BaseRepository and provide typed CRUD operations over SQLAlchemy models.