package store import ( "context" "database/sql" ) // Driver is an interface for store driver. // It contains all methods that store database driver should implement. type Driver interface { GetDB() *sql.DB Close() error IsInitialized(ctx context.Context) (bool, error) // GetDatabaseSize returns the database size in bytes, or -1 if unavailable. // A non-nil error indicates a hard failure; -1 with nil error means the // driver cannot report a size from the underlying database. GetDatabaseSize(ctx context.Context) (int64, error) // Attachment model related methods. CreateAttachment(ctx context.Context, create *Attachment) (*Attachment, error) ListAttachments(ctx context.Context, find *FindAttachment) ([]*Attachment, error) GetAttachmentStorageUsage(ctx context.Context, creatorID int32) (int64, error) UpdateAttachment(ctx context.Context, update *UpdateAttachment) error DeleteAttachment(ctx context.Context, delete *DeleteAttachment) error DeleteAttachments(ctx context.Context, deletes []*DeleteAttachment) error DeleteAttachmentsWithPolicy(ctx context.Context, policy *AttachmentDeletionPolicy, attachmentIDs []int32) error ApplyMemoMutation(ctx context.Context, mutation *MemoMutation) error // Memo model related methods. CreateMemo(ctx context.Context, create *Memo) (*Memo, error) ListMemos(ctx context.Context, find *FindMemo) ([]*Memo, error) UpdateMemo(ctx context.Context, update *UpdateMemo) error RefreshMemoDerivedPayload(ctx context.Context, refresh *RefreshMemoDerivedPayload) error DeleteMemo(ctx context.Context, delete *DeleteMemo) error DeleteMemoWithPolicy(ctx context.Context, delete *DeleteMemoWithPolicy) (*DeleteMemoWithPolicyResult, error) // CountUserMemos counts the memos a user created, comments included, in every row status and Space. CountUserMemos(ctx context.Context, creatorID int32) (int64, error) // Space model related methods. CreateSpace(ctx context.Context, create *Space, creatorID int32) (*Space, error) ListSpaces(ctx context.Context, find *FindSpace) ([]*Space, error) UpdateSpace(ctx context.Context, update *UpdateSpace, actorUserID int32) (*Space, error) DeleteSpace(ctx context.Context, delete *DeleteSpace) (*DeleteSpaceResult, error) ListSpaceMembers(ctx context.Context, find *FindSpaceMember) ([]*SpaceMember, error) UpdateSpaceMember(ctx context.Context, update *UpdateSpaceMember, actorUserID int32) (*SpaceMember, error) DeleteSpaceMember(ctx context.Context, delete *DeleteSpaceMember, actorUserID int32) error CreateSpaceInvitation(ctx context.Context, create *SpaceInvitation, actorUserID int32) (*SpaceInvitation, error) ListSpaceInvitations(ctx context.Context, find *FindSpaceInvitation) ([]*SpaceInvitation, error) AcceptSpaceInvitation(ctx context.Context, accept *AcceptSpaceInvitation, actorUserID int32) (*SpaceMember, error) DeclineSpaceInvitation(ctx context.Context, decline *DeclineSpaceInvitation, actorUserID int32) error RevokeSpaceInvitation(ctx context.Context, revoke *RevokeSpaceInvitation, actorUserID int32) error // MemoRelation model related methods. UpsertMemoRelation(ctx context.Context, create *MemoRelation) (*MemoRelation, error) ListMemoRelations(ctx context.Context, find *FindMemoRelation) ([]*MemoRelation, error) DeleteMemoRelation(ctx context.Context, delete *DeleteMemoRelation) error // InstanceSetting model related methods. // CreateInstanceSettingIfNotExists atomically creates the setting when its name is absent and reports whether it inserted the row. CreateInstanceSettingIfNotExists(ctx context.Context, create *InstanceSetting) (bool, error) // UpdateInstanceSettingIfUnchanged replaces the value only when the stored value still equals oldValue, and reports whether it did. UpdateInstanceSettingIfUnchanged(ctx context.Context, name, oldValue, newValue string) (bool, error) // GetInstanceSettingTx reads one setting within tx, locking its row where the database supports row locks, or returns nil when it is absent. GetInstanceSettingTx(ctx context.Context, tx *sql.Tx, name string) (*InstanceSetting, error) // CreateInstanceSettingIfNotExistsTx is CreateInstanceSettingIfNotExists within tx. CreateInstanceSettingIfNotExistsTx(ctx context.Context, tx *sql.Tx, create *InstanceSetting) (bool, error) // UpdateInstanceSettingIfUnchangedTx is UpdateInstanceSettingIfUnchanged within tx. UpdateInstanceSettingIfUnchangedTx(ctx context.Context, tx *sql.Tx, name, oldValue, newValue string) (bool, error) UpsertInstanceSetting(ctx context.Context, upsert *InstanceSetting) (*InstanceSetting, error) // UpsertInstanceSettingTx writes the setting within tx, for callers that must commit it together with other statements. UpsertInstanceSettingTx(ctx context.Context, tx *sql.Tx, upsert *InstanceSetting) error ListInstanceSettings(ctx context.Context, find *FindInstanceSetting) ([]*InstanceSetting, error) DeleteInstanceSetting(ctx context.Context, delete *DeleteInstanceSetting) error DeleteInstanceSettingTx(ctx context.Context, tx *sql.Tx, delete *DeleteInstanceSetting) error // User model related methods. CreateUser(ctx context.Context, create *User) (*User, error) UpdateUser(ctx context.Context, update *UpdateUser) (*User, error) ListUsers(ctx context.Context, find *FindUser) ([]*User, error) // CreateUserTx, UpdateUserTx, and ListUsersTx are the same methods within tx. CreateUserTx(ctx context.Context, tx *sql.Tx, create *User) (*User, error) UpdateUserTx(ctx context.Context, tx *sql.Tx, update *UpdateUser) (*User, error) ListUsersTx(ctx context.Context, tx *sql.Tx, find *FindUser) ([]*User, error) DeleteUser(ctx context.Context, delete *DeleteUser) (*DeleteUserResult, error) // UserSetting model related methods. UpsertUserSetting(ctx context.Context, upsert *UserSetting) (*UserSetting, error) ListUserSettings(ctx context.Context, find *FindUserSetting) ([]*UserSetting, error) DeleteUserSettings(ctx context.Context, delete *DeleteUserSetting) error // GetUserByPATHash returns the token matching tokenHash with its owner ID, or // (nil, nil) when no stored token matches. An error means the lookup itself // failed, including a stored row that cannot be decoded. GetUserByPATHash(ctx context.Context, tokenHash string) (*PATQueryResult, error) // IdentityProvider model related methods. CreateIdentityProvider(ctx context.Context, create *IdentityProvider) (*IdentityProvider, error) ListIdentityProviders(ctx context.Context, find *FindIdentityProvider) ([]*IdentityProvider, error) UpdateIdentityProvider(ctx context.Context, update *UpdateIdentityProvider) (*IdentityProvider, error) DeleteIdentityProvider(ctx context.Context, delete *DeleteIdentityProvider) error // The identity provider methods within tx. CreateIdentityProviderTx(ctx context.Context, tx *sql.Tx, create *IdentityProvider) (*IdentityProvider, error) ListIdentityProvidersTx(ctx context.Context, tx *sql.Tx, find *FindIdentityProvider) ([]*IdentityProvider, error) UpdateIdentityProviderTx(ctx context.Context, tx *sql.Tx, update *UpdateIdentityProvider) (*IdentityProvider, error) DeleteIdentityProviderTx(ctx context.Context, tx *sql.Tx, delete *DeleteIdentityProvider) error // ApplyAuthenticationConfigMutationTx reads the authentication configuration, validates the mutation, and applies it within tx. ApplyAuthenticationConfigMutationTx(ctx context.Context, tx *sql.Tx, mutation *AuthenticationConfigMutation) error // IsRetryableTransactionError reports whether err is a serialization or locking conflict that running the transaction again can resolve. IsRetryableTransactionError(err error) bool // Inbox model related methods. CreateInbox(ctx context.Context, create *Inbox) (*Inbox, error) ListInboxes(ctx context.Context, find *FindInbox) ([]*Inbox, error) UpdateInbox(ctx context.Context, update *UpdateInbox) (*Inbox, error) DeleteInbox(ctx context.Context, delete *DeleteInbox) error // Reaction model related methods. UpsertReaction(ctx context.Context, create *Reaction) (*Reaction, error) ListReactions(ctx context.Context, find *FindReaction) ([]*Reaction, error) GetReaction(ctx context.Context, find *FindReaction) (*Reaction, error) DeleteReaction(ctx context.Context, delete *DeleteReaction) error // MemoShare model related methods. CreateMemoShare(ctx context.Context, create *MemoShare) (*MemoShare, error) ListMemoShares(ctx context.Context, find *FindMemoShare) ([]*MemoShare, error) GetMemoShare(ctx context.Context, find *FindMemoShare) (*MemoShare, error) DeleteMemoShare(ctx context.Context, delete *DeleteMemoShare) error // UserIdentity model related methods. CreateUserIdentity(ctx context.Context, create *UserIdentity) (*UserIdentity, error) CreateUserWithIdentity(ctx context.Context, createUser *User, createIdentity *UserIdentity) (*User, error) ListUserIdentities(ctx context.Context, find *FindUserIdentity) ([]*UserIdentity, error) DeleteUserIdentities(ctx context.Context, delete *DeleteUserIdentity) error // The identity link methods within tx. CreateUserIdentityTx(ctx context.Context, tx *sql.Tx, create *UserIdentity) (*UserIdentity, error) ListUserIdentitiesTx(ctx context.Context, tx *sql.Tx, find *FindUserIdentity) ([]*UserIdentity, error) DeleteUserIdentitiesTx(ctx context.Context, tx *sql.Tx, delete *DeleteUserIdentity) error }