Documentation
¶
Index ¶
- Constants
- Variables
- func DirectConversationMemberSetKey(memberIDs []string) string
- type AppInstallation
- type AttachUploadInput
- type AuditLogEntry
- type BotToken
- type BotTokenAuth
- type BotWithTokens
- type Channel
- type ConnectedAccount
- type CreateAppInstallationInput
- type CreateAuditLogEntryInput
- type CreateBotInput
- type CreateBotTokenInput
- type CreateChannelInput
- type CreateConnectedAccountInput
- type CreateDirectConversationInput
- type CreateDirectMessageInput
- type CreateEventDeliveryAttemptInput
- type CreateEventSubscriptionInput
- type CreateMessageInput
- type CreateReactionInput
- type CreateSlashCommandInput
- type CreateSlashCommandInvocationInput
- type CreateThreadReplyInput
- type CreateTopicInput
- type CreateUploadInput
- type CreateUserInput
- type CreateWorkspaceInput
- type DeleteMessageInput
- type DirectConversation
- type Event
- type EventDeliveryAttempt
- type EventSubscription
- type Invite
- type MagicLink
- type MemberModeration
- type Message
- type MessagePage
- type MessagePageRequest
- type NotificationSettings
- type PushNotificationRecipient
- type ReadReceipt
- type RouteTarget
- type SearchResult
- type Session
- type SlashCommand
- type SlashCommandInvocation
- type Store
- type ThreadState
- type Topic
- type UpdateChannelInput
- type UpdateMemberModerationInput
- type UpdateMessageInput
- type UpdateNotificationSettingsInput
- type UpdateUserProfileAndNotificationSettingsInput
- type UpdateUserProfileInput
- type Upload
- type UploadQuota
- type UploadQuotaReservation
- type UpsertIdentityUserInput
- type User
- type Workspace
Constants ¶
const ( WorkspaceRoleOwner = "owner" WorkspaceRoleModerator = "moderator" WorkspaceRoleMember = "member" WorkspaceRoleGuest = "guest" WorkspaceRoleBot = "bot" GuestChannelName = "guest" GuestPostLimit = 3 MaxDirectConversationMembers = 32 UploadQuotaBytesPerUserWorkspace int64 = 512 << 20 UploadQuotaCountPerUserWorkspace int64 = 64 )
Variables ¶
var ErrClientNonceConflict = errors.New("client nonce was already used for a different message")
ErrClientNonceConflict is returned when a client reuses an idempotency nonce for a different message request.
var ErrInvalidMessagePage = errors.New("invalid message page request")
ErrInvalidMessagePage is returned when a message-history request combines mutually exclusive cursors or uses an invalid cursor value.
var ErrMessageNotWritable = errors.New("message is not writable")
ErrMessageNotWritable is returned when a user can read a message but cannot mutate it.
var ErrModerationRestricted = errors.New("moderation restriction")
ErrModerationRestricted is returned when a workspace moderation rule blocks a write. HTTP callers surface it as a 403 or 429 depending on the rule.
var ErrPostRateLimited = errors.New("waiting room post limit reached")
ErrPostRateLimited is returned when a waiting-room guest exhausts the small daily post budget.
var ErrQuotedMessageOutOfScope = errors.New("quoted message is not in this channel, conversation, or thread")
ErrQuotedMessageOutOfScope is returned when a message tries to quote another message that does not belong to the same channel, direct conversation, or thread. It is surfaced to API callers as a 400.
var ErrUploadQuotaExceeded = errors.New("upload quota exceeded")
ErrUploadQuotaExceeded is returned when a user has exhausted their upload budget in a workspace.
Functions ¶
func DirectConversationMemberSetKey ¶
DirectConversationMemberSetKey returns a stable key for canonical one-to-one conversations. Group conversations intentionally remain non-canonical.
Types ¶
type AppInstallation ¶
type AppInstallation struct {
ID string `json:"id"`
WorkspaceID string `json:"workspace_id"`
AppSlug string `json:"app_slug"`
DisplayName string `json:"display_name"`
BotUserID string `json:"bot_user_id"`
Config map[string]any `json:"config"`
CreatedBy string `json:"created_by,omitempty"`
CreatedAt string `json:"created_at"`
RevokedAt *string `json:"revoked_at,omitempty"`
}
type AttachUploadInput ¶
type AuditLogEntry ¶
type AuditLogEntry struct {
ID string `json:"id"`
WorkspaceID string `json:"workspace_id"`
ActorUserID string `json:"actor_user_id"`
Action string `json:"action"`
TargetType string `json:"target_type"`
TargetID string `json:"target_id"`
Metadata map[string]any `json:"metadata"`
CreatedAt string `json:"created_at"`
}
type BotToken ¶
type BotToken struct {
ID string `json:"id"`
BotUserID string `json:"bot_user_id"`
WorkspaceID string `json:"workspace_id"`
OwnerUserID string `json:"owner_user_id,omitempty"`
Name string `json:"name"`
Scopes []string `json:"scopes"`
CreatedBy string `json:"created_by,omitempty"`
CreatedAt string `json:"created_at"`
LastUsedAt *string `json:"last_used_at,omitempty"`
RevokedAt *string `json:"revoked_at,omitempty"`
Token string `json:"token,omitempty"`
}
type BotTokenAuth ¶
type BotWithTokens ¶
type Channel ¶
type Channel struct {
ID string `json:"id"`
RouteID string `json:"route_id"`
WorkspaceID string `json:"workspace_id"`
Name string `json:"name"`
Kind string `json:"kind"`
CreatedAt string `json:"created_at"`
ArchivedAt *string `json:"archived_at,omitempty"`
LastSeq int64 `json:"last_seq"`
LastReadSeq int64 `json:"last_read_seq"`
UnreadCount int64 `json:"unread_count"`
}
type ConnectedAccount ¶
type ConnectedAccount struct {
ID string `json:"id"`
WorkspaceID string `json:"workspace_id"`
UserID string `json:"user_id"`
Provider string `json:"provider"`
ProviderAccountID string `json:"provider_account_id"`
DisplayName string `json:"display_name"`
Scopes []string `json:"scopes"`
Metadata map[string]any `json:"metadata"`
CreatedAt string `json:"created_at"`
RevokedAt *string `json:"revoked_at,omitempty"`
}
type CreateBotInput ¶
type CreateBotTokenInput ¶
type CreateChannelInput ¶
type CreateMessageInput ¶
type CreateReactionInput ¶
type CreateSlashCommandInput ¶
type CreateThreadReplyInput ¶
type CreateTopicInput ¶
type CreateUploadInput ¶
type CreateUserInput ¶
type CreateWorkspaceInput ¶
type DeleteMessageInput ¶
type DirectConversation ¶
type DirectConversation struct {
ID string `json:"id"`
RouteID string `json:"route_id"`
WorkspaceID string `json:"workspace_id"`
CreatedAt string `json:"created_at"`
Members []User `json:"members"`
LastSeq int64 `json:"last_seq"`
LastReadSeq int64 `json:"last_read_seq"`
UnreadCount int64 `json:"unread_count"`
}
type Event ¶
type Event struct {
ID string `json:"id"`
Cursor string `json:"cursor"`
Type string `json:"type"`
WorkspaceID string `json:"workspace_id"`
ChannelID string `json:"channel_id,omitempty"`
Seq *int64 `json:"seq,omitempty"`
CreatedAt string `json:"created_at"`
PayloadJSON string `json:"-"`
Payload any `json:"payload"`
RecipientUserIDs []string `json:"-"`
}
type EventDeliveryAttempt ¶
type EventDeliveryAttempt struct {
ID string `json:"id"`
SubscriptionID string `json:"subscription_id"`
EventID string `json:"event_id"`
WorkspaceID string `json:"workspace_id"`
EventType string `json:"event_type"`
Attempt int `json:"attempt"`
RequestJSON string `json:"request_json,omitempty"`
ResponseStatus int `json:"response_status"`
ResponseBody string `json:"response_body,omitempty"`
Error string `json:"error,omitempty"`
CreatedAt string `json:"created_at"`
CompletedAt string `json:"completed_at"`
}
type EventSubscription ¶
type EventSubscription struct {
ID string `json:"id"`
WorkspaceID string `json:"workspace_id"`
AppInstallationID string `json:"app_installation_id,omitempty"`
EventTypes []string `json:"event_types"`
CallbackURL string `json:"callback_url"`
SigningSecret string `json:"signing_secret,omitempty"`
CreatedBy string `json:"created_by,omitempty"`
CreatedAt string `json:"created_at"`
RevokedAt *string `json:"revoked_at,omitempty"`
}
type MemberModeration ¶
type MemberModeration struct {
WorkspaceID string `json:"workspace_id"`
User User `json:"user"`
Role string `json:"role"`
PostsRemaining int `json:"posts_remaining"`
PostLimit int `json:"post_limit"`
TimeoutUntil *string `json:"timeout_until,omitempty"`
BlockedAt *string `json:"blocked_at,omitempty"`
ModerationNote string `json:"moderation_note,omitempty"`
ModerationBy string `json:"moderation_by,omitempty"`
ModerationAt string `json:"moderation_at,omitempty"`
}
type Message ¶
type Message struct {
ID string `json:"id"`
RouteID string `json:"route_id,omitempty"`
WorkspaceID string `json:"workspace_id"`
ChannelID string `json:"channel_id,omitempty"`
DirectConversationID string `json:"direct_conversation_id,omitempty"`
AuthorID string `json:"author_id"`
ParentMessageID *string `json:"parent_message_id,omitempty"`
ThreadRootID string `json:"thread_root_id"`
TopicID string `json:"topic_id,omitempty"`
ChannelSeq *int64 `json:"channel_seq,omitempty"`
ThreadSeq *int64 `json:"thread_seq,omitempty"`
Body string `json:"body"`
BodyFormat string `json:"body_format"`
CreatedAt string `json:"created_at"`
EditedAt *string `json:"edited_at,omitempty"`
DeletedAt *string `json:"deleted_at,omitempty"`
Author *User `json:"author,omitempty"`
Attachments []Upload `json:"attachments,omitempty"`
QuotedMessageID *string `json:"quoted_message_id,omitempty"`
QuotedBodySnapshot string `json:"quoted_body_snapshot,omitempty"`
QuotedAuthorID *string `json:"quoted_author_id,omitempty"`
QuotedAuthor *User `json:"quoted_author,omitempty"`
// Nonce is a client-supplied idempotency key used by optimistic UIs to match
// the server response to a pending placeholder and safely retry after a lost
// response.
Nonce string `json:"nonce,omitempty"`
}
type MessagePage ¶
type MessagePageRequest ¶
type NotificationSettings ¶
type ReadReceipt ¶
type RouteTarget ¶
type RouteTarget struct {
WorkspaceID string `json:"workspace_id"`
WorkspaceRouteID string `json:"workspace_route_id"`
TargetType string `json:"target_type"`
TargetID string `json:"target_id"`
TargetRouteID string `json:"target_route_id"`
ParentType string `json:"parent_type,omitempty"`
ParentID string `json:"parent_id,omitempty"`
ParentRouteID string `json:"parent_route_id,omitempty"`
CanonicalPath string `json:"canonical_path"`
}
type SearchResult ¶
type SlashCommand ¶
type SlashCommand struct {
ID string `json:"id"`
WorkspaceID string `json:"workspace_id"`
AppInstallationID string `json:"app_installation_id,omitempty"`
Command string `json:"command"`
Description string `json:"description"`
CallbackURL string `json:"callback_url"`
SigningSecret string `json:"signing_secret,omitempty"`
BotUserID string `json:"bot_user_id"`
CreatedBy string `json:"created_by,omitempty"`
CreatedAt string `json:"created_at"`
RevokedAt *string `json:"revoked_at,omitempty"`
}
type SlashCommandInvocation ¶
type SlashCommandInvocation struct {
ID string `json:"id"`
CommandID string `json:"command_id"`
WorkspaceID string `json:"workspace_id"`
ChannelID string `json:"channel_id"`
UserID string `json:"user_id"`
Text string `json:"text"`
PayloadJSON string `json:"payload_json,omitempty"`
ResponseStatus int `json:"response_status"`
ResponseBody string `json:"response_body,omitempty"`
Error string `json:"error,omitempty"`
CreatedAt string `json:"created_at"`
CompletedAt *string `json:"completed_at,omitempty"`
}
type Store ¶
type Store interface {
Close() error
Migrate(ctx context.Context) error
EnsureBootstrap(ctx context.Context, name, email string) (User, error)
CreateUser(ctx context.Context, input CreateUserInput) (User, error)
CreateBot(ctx context.Context, input CreateBotInput) (User, BotToken, error)
ListBots(ctx context.Context, workspaceID, requesterID string) ([]BotWithTokens, error)
CreateBotToken(ctx context.Context, input CreateBotTokenInput) (BotToken, error)
ListBotTokens(ctx context.Context, botUserID, requesterID string) ([]BotToken, error)
RevokeBotToken(ctx context.Context, tokenID, requesterID string) (BotToken, error)
ListAppInstallations(ctx context.Context, workspaceID, requesterID string) ([]AppInstallation, error)
CreateAppInstallation(ctx context.Context, input CreateAppInstallationInput) (AppInstallation, error)
RevokeAppInstallation(ctx context.Context, installationID, requesterID string) (AppInstallation, error)
ListSlashCommands(ctx context.Context, workspaceID, requesterID string) ([]SlashCommand, error)
CreateSlashCommand(ctx context.Context, input CreateSlashCommandInput) (SlashCommand, error)
RevokeSlashCommand(ctx context.Context, commandID, requesterID string) (SlashCommand, error)
GetSlashCommandForChannel(ctx context.Context, channelID, command, requesterID string) (SlashCommand, error)
CreateSlashCommandInvocation(ctx context.Context, input CreateSlashCommandInvocationInput) (SlashCommandInvocation, error)
CompleteSlashCommandInvocation(ctx context.Context, invocationID string, status int, responseBody, invokeError string) (SlashCommandInvocation, error)
ListEventSubscriptions(ctx context.Context, workspaceID, requesterID string) ([]EventSubscription, error)
CreateEventSubscription(ctx context.Context, input CreateEventSubscriptionInput) (EventSubscription, error)
RevokeEventSubscription(ctx context.Context, subscriptionID, requesterID string) (EventSubscription, error)
ListEventSubscriptionsForEvent(ctx context.Context, event Event) ([]EventSubscription, error)
CreateEventDeliveryAttempt(ctx context.Context, input CreateEventDeliveryAttemptInput) (EventDeliveryAttempt, error)
ListEventDeliveryAttempts(ctx context.Context, subscriptionID, requesterID string) ([]EventDeliveryAttempt, error)
CreateAuditLogEntry(ctx context.Context, input CreateAuditLogEntryInput) (AuditLogEntry, error)
ListAuditLogEntries(ctx context.Context, workspaceID, requesterID string, limit int) ([]AuditLogEntry, error)
ListConnectedAccounts(ctx context.Context, workspaceID, requesterID string) ([]ConnectedAccount, error)
CreateConnectedAccount(ctx context.Context, input CreateConnectedAccountInput) (ConnectedAccount, error)
RevokeConnectedAccount(ctx context.Context, accountID, requesterID string) (ConnectedAccount, error)
UpsertIdentityUser(ctx context.Context, input UpsertIdentityUserInput) (User, error)
UpdateUserProfile(ctx context.Context, input UpdateUserProfileInput) (User, error)
UpdateUserProfileAndNotificationSettings(ctx context.Context, input UpdateUserProfileAndNotificationSettingsInput) (User, error)
UpdateNotificationSettings(ctx context.Context, input UpdateNotificationSettingsInput) (NotificationSettings, error)
ListPushNotificationRecipients(ctx context.Context, messageID string) ([]PushNotificationRecipient, error)
AddWorkspaceMember(ctx context.Context, workspaceID, userID, role string) error
EnsureDefaultWorkspaceMember(ctx context.Context, userID string) (Workspace, error)
EnsureDefaultGuestWorkspaceMember(ctx context.Context, userID, role string) (Workspace, error)
ListWorkspaceMembers(ctx context.Context, workspaceID, actorUserID string) ([]MemberModeration, error)
UpdateMemberModeration(ctx context.Context, input UpdateMemberModerationInput) (MemberModeration, Event, error)
UserHasNonGuestMembership(ctx context.Context, userID string) (bool, error)
UploadQuota(ctx context.Context, workspaceID, userID string) (UploadQuota, error)
CanCreateUpload(ctx context.Context, workspaceID, userID string, byteSize int64) error
ReserveUploadQuota(ctx context.Context, workspaceID, userID string, byteSize int64) (UploadQuotaReservation, error)
CreateReservedUpload(ctx context.Context, reservationID string, input CreateUploadInput) (Upload, error)
ReleaseUploadQuotaReservation(ctx context.Context, reservationID, userID string) error
FirstUser(ctx context.Context) (User, error)
GetUser(ctx context.Context, id string) (User, error)
ListWorkspaces(ctx context.Context, userID string) ([]Workspace, error)
CreateWorkspace(ctx context.Context, input CreateWorkspaceInput, ownerID string) (Workspace, error)
GetWorkspace(ctx context.Context, workspaceID, userID string) (Workspace, error)
CanPublishEphemeral(ctx context.Context, workspaceID, channelID, directConversationID, userID string) error
ResolveRouteTarget(ctx context.Context, userID, workspaceRouteID, targetRouteID string) (RouteTarget, error)
ResolveLegacyRouteTarget(ctx context.Context, userID, workspaceID, targetID string) (RouteTarget, error)
ListChannels(ctx context.Context, workspaceID, userID string) ([]Channel, error)
GetChannel(ctx context.Context, channelID, userID string) (Channel, error)
CreateChannel(ctx context.Context, input CreateChannelInput) (Channel, Event, error)
UpdateChannel(ctx context.Context, input UpdateChannelInput) (Channel, Event, error)
ListTopics(ctx context.Context, workspaceID, requesterID string) ([]Topic, error)
CreateTopic(ctx context.Context, input CreateTopicInput) (Topic, error)
ListMessages(ctx context.Context, channelID, userID string, page MessagePageRequest) (MessagePage, error)
GetMessage(ctx context.Context, messageID, userID string) (Message, error)
EnsureThreadRouteID(ctx context.Context, userID, rootMessageID string) (Message, error)
CreateMessage(ctx context.Context, input CreateMessageInput) (Message, Event, error)
UpdateMessage(ctx context.Context, input UpdateMessageInput) (Message, Event, error)
DeleteMessage(ctx context.Context, input DeleteMessageInput) (Message, Event, error)
GetThread(ctx context.Context, rootMessageID, userID string, limit int) (Message, []Message, ThreadState, error)
CreateThreadReply(ctx context.Context, input CreateThreadReplyInput) (Message, ThreadState, []Event, error)
AddReaction(ctx context.Context, input CreateReactionInput) (Event, error)
RemoveReaction(ctx context.Context, input CreateReactionInput) (Event, error)
ListEventsAfter(ctx context.Context, workspaceID, userID, cursor string, limit int) ([]Event, error)
CreateUpload(ctx context.Context, input CreateUploadInput) (Upload, error)
GetUpload(ctx context.Context, uploadID, userID string) (Upload, error)
UploadHasDirectMessageAttachment(ctx context.Context, uploadID string) (bool, error)
UploadHasOtherDirectMessageAttachment(ctx context.Context, uploadID, messageID string) (bool, error)
AttachUpload(ctx context.Context, input AttachUploadInput) (Event, error)
SearchMessages(ctx context.Context, workspaceID, channelID, userID, query string, limit int) ([]SearchResult, error)
ListDirectConversations(ctx context.Context, workspaceID, userID string) ([]DirectConversation, error)
GetDirectConversation(ctx context.Context, conversationID, userID string) (DirectConversation, error)
CreateDirectConversation(ctx context.Context, input CreateDirectConversationInput) (DirectConversation, error)
ListDirectMessages(ctx context.Context, conversationID, userID string, page MessagePageRequest) (MessagePage, error)
CreateDirectMessage(ctx context.Context, input CreateDirectMessageInput) (Message, Event, error)
MarkChannelRead(ctx context.Context, channelID, userID string, seq int64) (ReadReceipt, Event, error)
MarkDirectRead(ctx context.Context, conversationID, userID string, seq int64) (ReadReceipt, Event, error)
CreateInvite(ctx context.Context, workspaceID, createdBy string) (Invite, error)
CreateMagicLink(ctx context.Context, email, displayName string) (MagicLink, error)
ConsumeMagicLink(ctx context.Context, token string) (User, Session, error)
CreateSession(ctx context.Context, userID string) (Session, error)
GetSessionUser(ctx context.Context, token string) (User, error)
GetBotTokenAuth(ctx context.Context, token string) (BotTokenAuth, error)
}
type ThreadState ¶
type UpdateChannelInput ¶
type UpdateMessageInput ¶
type UpdateUserProfileAndNotificationSettingsInput ¶
type UpdateUserProfileAndNotificationSettingsInput struct {
UserID string
DisplayName string
Handle string
AvatarURL string
NotificationSettings *NotificationSettings
}
type UpdateUserProfileInput ¶
type Upload ¶
type Upload struct {
ID string `json:"id"`
WorkspaceID string `json:"workspace_id"`
OwnerID string `json:"owner_id"`
Filename string `json:"filename"`
ContentType string `json:"content_type"`
ByteSize int64 `json:"byte_size"`
Width int `json:"width"`
Height int `json:"height"`
DurationMS int `json:"duration_ms"`
StoragePath string `json:"-"`
CreatedAt string `json:"created_at"`
}
type UploadQuota ¶
type UploadQuota struct {
MaxBytes int64
UsedBytes int64
RemainingBytes int64
MaxCount int64
UsedCount int64
RemainingCount int64
}
func (UploadQuota) CanFit ¶
func (q UploadQuota) CanFit(byteSize int64) error
type UploadQuotaReservation ¶
type UpsertIdentityUserInput ¶
type User ¶
type User struct {
ID string `json:"id"`
Kind string `json:"kind"`
OwnerUserID string `json:"owner_user_id,omitempty"`
DisplayName string `json:"display_name"`
Handle string `json:"handle"`
AvatarURL string `json:"avatar_url"`
CreatedAt string `json:"created_at"`
NotificationSettings *NotificationSettings `json:"notification_settings,omitempty"`
}