Documentation
¶
Index ¶
- Constants
- Variables
- func NewStatsRepo(db StatsStorer) ds.Datastore
- type AuthRepo
- func (repo *AuthRepo) Authenticate(username, password string) (err error)
- func (repo *AuthRepo) GetOwner() domain.Owner
- func (repo *AuthRepo) Logout()
- func (repo *AuthRepo) PrivateKey() ed25519.PrivateKey
- func (repo *AuthRepo) SessionToken() string
- func (repo *AuthRepo) SetOwner(o domain.Owner) (_ domain.Owner, err error)
- type AuthStorer
- type Base64Image
- type BlockLevel
- type BlocklistTerm
- type BlocksRepo
- func (repo *BlocksRepo) Block(blockerId, blockeeId string) error
- func (repo *BlocksRepo) IsBlocked(blockerId, blockeeId string) (bool, error)
- func (repo *BlocksRepo) List(blockerId string, limit *uint64, cursor *string) ([]string, string, error)
- func (repo *BlocksRepo) Unblock(blockerId, blockeeId string) error
- type BlocksStorer
- type BookmarkRepo
- type BookmarkStorer
- type ChatRepo
- func (repo *ChatRepo) CreateChat(chatId *string, ownerId, otherUserId string) (chat domain.Chat, err error)
- func (repo *ChatRepo) CreateMessage(msg domain.ChatMessage) (domain.ChatMessage, error)
- func (repo *ChatRepo) DeleteChat(chatId string) error
- func (repo *ChatRepo) DeleteMessage(chatId, id string) error
- func (repo *ChatRepo) GetChat(chatId string) (chat domain.Chat, err error)
- func (repo *ChatRepo) GetMessage(chatId, id string) (m domain.ChatMessage, err error)
- func (repo *ChatRepo) GetUserChats(userId string, limit *uint64, cursor *string) ([]domain.Chat, string, error)
- func (repo *ChatRepo) ListMessages(chatId string, limit *uint64, cursor *string) ([]domain.ChatMessage, string, error)
- type ChatStorer
- type DevicesRepo
- type DevicesStorer
- type FilterRepo
- func (repo *FilterRepo) AddKeyword(userId, filterId string, kw domain.FilterKeyword) (domain.FilterKeyword, error)
- func (repo *FilterRepo) Create(userId string, f domain.Filter) (domain.Filter, error)
- func (repo *FilterRepo) Delete(userId, filterId string) error
- func (repo *FilterRepo) DeleteKeyword(userId, keywordId string) error
- func (repo *FilterRepo) Get(userId, filterId string) (domain.Filter, error)
- func (repo *FilterRepo) List(userId string, limit *uint64, cursor *string) ([]domain.Filter, string, error)
- func (repo *FilterRepo) Update(userId string, f domain.Filter) (domain.Filter, error)
- func (repo *FilterRepo) UpdateKeyword(userId string, kw domain.FilterKeyword) (domain.FilterKeyword, error)
- type FilterStorer
- type FollowRepo
- func (repo *FollowRepo) AddFollowRequest(targetUserId, followerId string) error
- func (repo *FollowRepo) Follow(fromUserId, toUserId string) error
- func (repo *FollowRepo) GetFollowers(userId string, limit *uint64, cursor *string) ([]string, string, error)
- func (repo *FollowRepo) GetFollowersCount(userId string) (uint64, error)
- func (repo *FollowRepo) GetFollowings(userId string, limit *uint64, cursor *string) ([]string, string, error)
- func (repo *FollowRepo) GetFollowingsCount(userId string) (uint64, error)
- func (repo *FollowRepo) HasFollowRequest(targetUserId, followerId string) (bool, error)
- func (repo *FollowRepo) IsFollower(ownerId, otherUserId string) bool
- func (repo *FollowRepo) IsFollowing(ownerId, otherUserId string) bool
- func (repo *FollowRepo) ListFollowRequests(targetUserId string, limit *uint64, cursor *string) ([]string, string, error)
- func (repo *FollowRepo) RemoveFollowRequest(targetUserId, followerId string) error
- func (repo *FollowRepo) Unfollow(fromUserId, toUserId string) error
- type FollowerStorer
- type ImageKey
- type LikeRepo
- func (repo *LikeRepo) Like(tweetId, userId string, isTransitive bool) (likesCount uint64, err error)
- func (repo *LikeRepo) Liked(userId string, limit *uint64, cursor *string) ([]domain.LikedTweet, string, error)
- func (repo *LikeRepo) Likers(tweetId string, limit *uint64, cursor *string) (_ likedUserIDs, cur string, err error)
- func (repo *LikeRepo) LikesCount(tweetId string) (likesNum uint64, err error)
- func (repo *LikeRepo) RemoveLiked(userId, tweetId string) error
- func (repo *LikeRepo) SetLiked(userId, tweetId, ownerUserId string) error
- func (repo *LikeRepo) Unlike(tweetId, userId string, isTransitive bool) (likesCount uint64, err error)
- type LikeStatsStorer
- type LikeStorer
- type MediaMeta
- type MediaRepo
- func (repo *MediaRepo) GetImage(userId, key string) (Base64Image, error)
- func (repo *MediaRepo) GetImageMeta(userId, key string) (MediaMeta, error)
- func (repo *MediaRepo) SetForeignImageWithTTL(userId, key string, img Base64Image) error
- func (repo *MediaRepo) SetImage(userId string, img Base64Image) (_ ImageKey, err error)
- func (repo *MediaRepo) SetImageMeta(userId, key string, meta MediaMeta) error
- type MediaStorer
- type MutesRepo
- type MutesStorer
- type NewUserNotifier
- type NodeRepo
- func (d *NodeRepo) Batch(ctx context.Context) (datastore.Batch, error)
- func (d *NodeRepo) BlocklistExponential(peerId string) error
- func (d *NodeRepo) BlocklistPermanent(peerId string) error
- func (d *NodeRepo) BlocklistRemove(peerId string) error
- func (d *NodeRepo) BlocklistTerm(peerId string) (*BlocklistTerm, error)
- func (d *NodeRepo) Close() (err error)
- func (d *NodeRepo) Delete(ctx context.Context, key datastore.Key) error
- func (d *NodeRepo) DiskUsage(ctx context.Context) (uint64, error)
- func (d *NodeRepo) Get(ctx context.Context, key datastore.Key) (value []byte, err error)
- func (d *NodeRepo) GetExpiration(ctx context.Context, key datastore.Key) (t time.Time, err error)
- func (d *NodeRepo) GetSize(ctx context.Context, key datastore.Key) (_ int, err error)
- func (d *NodeRepo) Has(ctx context.Context, key datastore.Key) (_ bool, err error)
- func (d *NodeRepo) IsBlocklisted(peerId string) bool
- func (d *NodeRepo) Put(ctx context.Context, key datastore.Key, value []byte) error
- func (d *NodeRepo) PutWithTTL(ctx context.Context, key datastore.Key, value []byte, ttl time.Duration) error
- func (d *NodeRepo) Query(ctx context.Context, q datastore.Query) (datastore.Results, error)
- func (d *NodeRepo) SetTTL(ctx context.Context, key datastore.Key, ttl time.Duration) error
- func (d *NodeRepo) Sync(ctx context.Context, _ datastore.Key) error
- type NodeStorer
- type NotificationsRepo
- func (repo *NotificationsRepo) Add(not domain.Notification) error
- func (repo *NotificationsRepo) Get(userId, notificationId string) (domain.Notification, error)
- func (repo *NotificationsRepo) List(userId string, limit *uint64, cursor *string) ([]domain.Notification, string, error)
- func (repo *NotificationsRepo) MarkAllRead(userId string) error
- func (repo *NotificationsRepo) MarkRead(userId, notificationId string) error
- func (repo *NotificationsRepo) ReverseList(userId string, cursor *string, limit *uint64) ([]domain.Notification, string, error)
- func (repo *NotificationsRepo) UnreadCount(userId string) (uint64, error)
- type NotificationsStorer
- type OutboxEntry
- type OutboxRepo
- func (repo *OutboxRepo) Delete(destNodeId, id string) error
- func (repo *OutboxRepo) Enqueue(destNodeId, route string, payload []byte) (OutboxEntry, error)
- func (repo *OutboxRepo) ListByNode(destNodeId string) ([]OutboxEntry, error)
- func (repo *OutboxRepo) ListNodes() ([]string, error)
- func (repo *OutboxRepo) Save(entry OutboxEntry) error
- type OutboxStorer
- type SettingsRepo
- type SettingsStorer
- type StatsStorer
- type SubscriptionsRepo
- type SubscriptionsStorer
- type TimelineRepo
- type TimelineStorer
- type TweetRepo
- func (repo *TweetRepo) AddReply(reply domain.Tweet, isTransitive bool) (domain.Tweet, error)
- func (repo *TweetRepo) AppendEdit(edit domain.TweetEdit) (domain.TweetEdit, error)
- func (repo *TweetRepo) Blocklist(tweetId string) error
- func (repo *TweetRepo) Create(userId string, tweet domain.Tweet) (domain.Tweet, error)
- func (repo *TweetRepo) CreateWithTTL(userId string, tweet domain.Tweet, duration time.Duration) (domain.Tweet, error)
- func (repo *TweetRepo) Delete(userID, tweetID string) error
- func (repo *TweetRepo) DeleteReply(parentID, replyID string, isTransitive bool) (domain.Tweet, error)
- func (repo *TweetRepo) Get(userID, tweetID string) (tweet domain.Tweet, err error)
- func (repo *TweetRepo) GetReplies(parentID string, limit *uint64, cursor *string) ([]domain.Tweet, string, error)
- func (repo *TweetRepo) GetReply(parentID, replyID string) (domain.Tweet, error)
- func (repo *TweetRepo) GetViewsCount(tweetId string) (uint64, error)
- func (repo *TweetRepo) IsBlocklisted(tweetId string) bool
- func (repo *TweetRepo) List(userId string, limit *uint64, cursor *string) ([]domain.Tweet, string, error)
- func (repo *TweetRepo) NewRetweet(tweet domain.Tweet, isTransitive bool) (_ domain.Tweet, err error)
- func (repo *TweetRepo) Pin(userId, tweetId string) (domain.Tweet, error)
- func (repo *TweetRepo) RecordView(tweetId, viewerId string) (uint64, error)
- func (repo *TweetRepo) RepliesCount(tweetId string) (uint64, error)
- func (repo *TweetRepo) Retweeters(tweetId string, limit *uint64, cursor *string) (_ retweetersIDs, cur string, err error)
- func (repo *TweetRepo) RetweetsCount(tweetId string) (uint64, error)
- func (repo *TweetRepo) TweetsCount(userId string) (uint64, error)
- func (repo *TweetRepo) UnRetweet(retweetedByUserID, tweetId string, isTransitive bool) error
- func (repo *TweetRepo) Unpin(userId, tweetId string) (domain.Tweet, error)
- func (repo *TweetRepo) Update(updateTweet domain.Tweet) error
- type TweetStatsStorer
- type TweetsStorer
- type UserRepo
- func (repo *UserRepo) Create(user domain.User) (domain.User, error)
- func (repo *UserRepo) CreateWithTTL(user domain.User, ttl time.Duration) (domain.User, error)
- func (repo *UserRepo) Delete(userId string) error
- func (repo *UserRepo) Get(userId string) (user domain.User, err error)
- func (repo *UserRepo) GetBatch(userIDs ...string) (users []domain.User, err error)
- func (repo *UserRepo) GetByNodeID(nodeID string) (user domain.User, err error)
- func (repo *UserRepo) List(limit *uint64, cursor *string) ([]domain.User, string, error)
- func (repo *UserRepo) Search(query string, limit *uint64, cursor *string) ([]domain.User, string, error)
- func (repo *UserRepo) Update(userId string, newUser domain.User) (domain.User, error)
- func (repo *UserRepo) WhoToFollow(limit *uint64, cursor *string) ([]domain.User, string, error)
- type UserStorer
Constants ¶
const ( AuthRepoName = "/AUTH" PassSubName = "PASS" // TODO pass restore functionality DefaultOwnerKey = "OWNER" )
const ( ChatNamespace = "/CHATS" MessageNamespace = "/MESSAGES" NonceSubNamespace = "NONCE" )
const ( LikeRepoName = "/LIKES" IncrSubNamespace = "INCR" LikerSubNamespace = "LIKER" LikedSubNamespace = "LIKED" // per-user index of liked tweet refs )
const ( MediaRepoName = "/MEDIA" ImageSubNamespace = "IMAGES" ImageMetaSubNS = "IMAGES_META" // VideoSubNamespace is reserved — videos are not yet supported. VideoSubNamespace = "VIDEOS" )
const ( BlocklistSubNamespace = "BLOCKLIST" BlocklistUserSubNamespace = "USER" BlocklistTermSubNamespace = "TERM" )
const ( UsersRepoName = "/USERS" DefaultWarpnetUserNetwork = "warpnet" )
const (
BlocksRepoName = "/BLOCKS"
)
const BookmarkRepoName = "/BOOKMARKS"
const (
DevicesRepoName = "/DEVICES"
)
const (
ErrNilNodeRepo = local_store.DBError("node repo is nil")
)
slash is required because of: invalid datastore key: NODES:/peers/keys/AASAQAISEAXNRKHMX2O3AA26JM7NGIWUPOGIITJ2UHHXGX4OWIEKPNAW6YCSK/priv
const FilterRepoName = "/FILTERS"
const (
FollowRepoName = "/FOLLOW"
)
const (
MutesRepoName = "/MUTES"
)
const (
NotificationsRepoName = "/NOTIFICATIONS"
)
const OutboxNamespace = "/OUTBOX"
OutboxNamespace holds outgoing messages that could not be delivered because the destination node was offline. Entries are keyed per destination node and replayed once that node is seen online again.
const SettingsRepoName = "/SETTINGS"
const ( // SubscriptionsRepoName holds the local watchlist: whose new tweets // I want notifications about. SubscriptionsRepoName = "/SUBSCRIPTIONS" )
const TimelineRepoName = "/TIMELINE"
const (
TweetsNamespace = "/TWEETS"
)
Variables ¶
var ( ErrChatNotFound = local_store.DBError("chat not found") ErrMessageNotFound = local_store.DBError("message not found") )
var ( ErrMediaNotFound = local_store.DBError("media not found") ErrMediaRepoNotInit = local_store.DBError("media repo is not initialized") )
var ( ErrTweetNotFound = local.DBError("tweet not found") ErrViewsNotFound = local.DBError("views not found") ErrReplyNotFound = local.DBError("reply not found") )
var ( ErrUserNotFound = local_store.DBError("user not found") ErrUserAlreadyExists = local_store.DBError("user already exists") )
var ErrAlreadyFollowed = local_store.DBError("already followed")
var ErrFilterNotFound = local_store.DBError("filter not found")
var ErrLikesNotFound = local_store.DBError("like not found")
var ErrNilAuthRepo = local_store.DBError("auth repo is nil")
var ErrNilDevicesRepo = local_store.DBError("devices repo is nil")
var ErrNotificationsNotFound = local_store.DBError("notifications not found")
Functions ¶
func NewStatsRepo ¶ added in v0.6.120
func NewStatsRepo(db StatsStorer) ds.Datastore
Types ¶
type AuthRepo ¶
type AuthRepo struct {
// contains filtered or unexported fields
}
func NewAuthRepo ¶
func NewAuthRepo(db AuthStorer, network string) *AuthRepo
func (*AuthRepo) Authenticate ¶
func (*AuthRepo) PrivateKey ¶
func (repo *AuthRepo) PrivateKey() ed25519.PrivateKey
func (*AuthRepo) SessionToken ¶
type AuthStorer ¶
type Base64Image ¶
type Base64Image string
type BlockLevel ¶ added in v0.5.105
type BlockLevel int
const ( InitialBlock BlockLevel = iota + 1 MediumBlock AdvancedBlock PermanentBlock )
func (BlockLevel) Next ¶ added in v0.5.105
func (b BlockLevel) Next() BlockLevel
type BlocklistTerm ¶ added in v0.5.129
type BlocklistTerm struct {
PeerID string
Level BlockLevel
}
type BlocksRepo ¶ added in v0.7.26
type BlocksRepo struct {
// contains filtered or unexported fields
}
BlocksRepo persists the set of user ids the local owner has blocked.
func NewBlocksRepo ¶ added in v0.7.26
func NewBlocksRepo(db BlocksStorer) *BlocksRepo
func (*BlocksRepo) Block ¶ added in v0.7.26
func (repo *BlocksRepo) Block(blockerId, blockeeId string) error
Block records that blockerId has blocked blockeeId.
func (*BlocksRepo) IsBlocked ¶ added in v0.7.26
func (repo *BlocksRepo) IsBlocked(blockerId, blockeeId string) (bool, error)
func (*BlocksRepo) Unblock ¶ added in v0.7.26
func (repo *BlocksRepo) Unblock(blockerId, blockeeId string) error
Unblock removes a previously-recorded block.
type BlocksStorer ¶ added in v0.7.26
type BlocksStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type BookmarkRepo ¶ added in v0.7.26
type BookmarkRepo struct {
// contains filtered or unexported fields
}
func NewBookmarkRepo ¶ added in v0.7.26
func NewBookmarkRepo(db BookmarkStorer) *BookmarkRepo
func (*BookmarkRepo) Bookmark ¶ added in v0.7.26
func (repo *BookmarkRepo) Bookmark(userId, tweetId, ownerUserId string) error
func (*BookmarkRepo) Unbookmark ¶ added in v0.7.26
func (repo *BookmarkRepo) Unbookmark(userId, tweetId string) error
type BookmarkStorer ¶ added in v0.7.26
type BookmarkStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type ChatRepo ¶
type ChatRepo struct {
// contains filtered or unexported fields
}
func NewChatRepo ¶
func NewChatRepo(db ChatStorer) *ChatRepo
func (*ChatRepo) CreateChat ¶
func (*ChatRepo) CreateMessage ¶
func (repo *ChatRepo) CreateMessage(msg domain.ChatMessage) (domain.ChatMessage, error)
func (*ChatRepo) DeleteChat ¶
func (*ChatRepo) DeleteMessage ¶
func (*ChatRepo) GetMessage ¶
func (repo *ChatRepo) GetMessage(chatId, id string) (m domain.ChatMessage, err error)
func (*ChatRepo) GetUserChats ¶
func (*ChatRepo) ListMessages ¶
type ChatStorer ¶
type ChatStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type DevicesRepo ¶ added in v0.6.263
type DevicesRepo struct {
// contains filtered or unexported fields
}
func NewDevicesRepo ¶ added in v0.6.263
func NewDevicesRepo(db DevicesStorer) *DevicesRepo
func (*DevicesRepo) GetDevices ¶ added in v0.6.263
func (repo *DevicesRepo) GetDevices(ownerNodeId string) (devices []domain.Device, err error)
type DevicesStorer ¶ added in v0.6.263
type FilterRepo ¶ added in v0.7.26
type FilterRepo struct {
// contains filtered or unexported fields
}
func NewFilterRepo ¶ added in v0.7.26
func NewFilterRepo(db FilterStorer) *FilterRepo
func (*FilterRepo) AddKeyword ¶ added in v0.7.26
func (repo *FilterRepo) AddKeyword(userId, filterId string, kw domain.FilterKeyword) (domain.FilterKeyword, error)
AddKeyword appends a new keyword to an existing filter.
func (*FilterRepo) Delete ¶ added in v0.7.26
func (repo *FilterRepo) Delete(userId, filterId string) error
func (*FilterRepo) DeleteKeyword ¶ added in v0.7.26
func (repo *FilterRepo) DeleteKeyword(userId, keywordId string) error
DeleteKeyword removes a keyword by id from whichever filter owns it.
func (*FilterRepo) Get ¶ added in v0.7.26
func (repo *FilterRepo) Get(userId, filterId string) (domain.Filter, error)
func (*FilterRepo) UpdateKeyword ¶ added in v0.7.26
func (repo *FilterRepo) UpdateKeyword(userId string, kw domain.FilterKeyword) (domain.FilterKeyword, error)
UpdateKeyword replaces a keyword on the filter that owns it.
type FilterStorer ¶ added in v0.7.26
type FilterStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type FollowRepo ¶
type FollowRepo struct {
// contains filtered or unexported fields
}
func NewFollowRepo ¶
func NewFollowRepo(db FollowerStorer) *FollowRepo
func (*FollowRepo) AddFollowRequest ¶ added in v0.7.26
func (repo *FollowRepo) AddFollowRequest(targetUserId, followerId string) error
AddFollowRequest records a pending follow request from followerId against targetUserId (locked-user flow). On approval the entry should be removed via RemoveFollowRequest and re-recorded via Follow; on reject it's just removed.
func (*FollowRepo) Follow ¶
func (repo *FollowRepo) Follow(fromUserId, toUserId string) error
func (*FollowRepo) GetFollowers ¶
func (*FollowRepo) GetFollowersCount ¶
func (repo *FollowRepo) GetFollowersCount(userId string) (uint64, error)
func (*FollowRepo) GetFollowings ¶ added in v0.5.83
func (repo *FollowRepo) GetFollowings(userId string, limit *uint64, cursor *string) ([]string, string, error)
GetFollowings following - one who is followed (has his/her posts monitored by another user)
func (*FollowRepo) GetFollowingsCount ¶ added in v0.5.83
func (repo *FollowRepo) GetFollowingsCount(userId string) (uint64, error)
func (*FollowRepo) HasFollowRequest ¶ added in v0.7.26
func (repo *FollowRepo) HasFollowRequest(targetUserId, followerId string) (bool, error)
HasFollowRequest reports whether followerId has an outstanding pending follow request against targetUserId.
func (*FollowRepo) IsFollower ¶ added in v0.5.83
func (repo *FollowRepo) IsFollower(ownerId, otherUserId string) bool
func (*FollowRepo) IsFollowing ¶ added in v0.5.83
func (repo *FollowRepo) IsFollowing(ownerId, otherUserId string) bool
func (*FollowRepo) ListFollowRequests ¶ added in v0.7.26
func (repo *FollowRepo) ListFollowRequests(targetUserId string, limit *uint64, cursor *string) ([]string, string, error)
ListFollowRequests returns the follower ids waiting for approval on the given target user, oldest-first.
func (*FollowRepo) RemoveFollowRequest ¶ added in v0.7.26
func (repo *FollowRepo) RemoveFollowRequest(targetUserId, followerId string) error
RemoveFollowRequest deletes a pending follow request (idempotent).
func (*FollowRepo) Unfollow ¶
func (repo *FollowRepo) Unfollow(fromUserId, toUserId string) error
type FollowerStorer ¶
type LikeRepo ¶
type LikeRepo struct {
// contains filtered or unexported fields
}
func NewLikeRepo ¶
func NewLikeRepo(db LikeStorer, statsDb LikeStatsStorer) *LikeRepo
func (*LikeRepo) Like ¶
func (repo *LikeRepo) Like(tweetId, userId string, isTransitive bool) (likesCount uint64, err error)
isTransitive tells whether this action should propagate to the network-wide (CRDT) counter, which is replicated ("transits") across nodes. The caller (handler) sets it true only on the acting user's own node, so an action observed on more than one node is counted once. The local per-node counter is always updated (it backs the read-time fallback).
func (*LikeRepo) LikesCount ¶
func (*LikeRepo) RemoveLiked ¶ added in v0.7.403
type LikeStatsStorer ¶ added in v0.5.158
type LikeStorer ¶
type MediaMeta ¶ added in v0.7.26
type MediaMeta struct {
Description string `json:"description"`
FocusX float32 `json:"focus_x"`
FocusY float32 `json:"focus_y"`
}
MediaMeta is the per-image metadata layer: Mastodon's compose alt-text (description) and focal point (focus_x / focus_y in [-1, 1]). Stored under a parallel key from the image blob so updating metadata doesn't rewrite the (potentially MB-sized) base64 payload.
type MediaRepo ¶
type MediaRepo struct {
// contains filtered or unexported fields
}
func NewMediaRepo ¶
func NewMediaRepo(db MediaStorer) *MediaRepo
func (*MediaRepo) GetImage ¶
func (repo *MediaRepo) GetImage(userId, key string) (Base64Image, error)
func (*MediaRepo) GetImageMeta ¶ added in v0.7.26
func (*MediaRepo) SetForeignImageWithTTL ¶
func (repo *MediaRepo) SetForeignImageWithTTL(userId, key string, img Base64Image) error
type MediaStorer ¶
type MutesRepo ¶ added in v0.7.26
type MutesRepo struct {
// contains filtered or unexported fields
}
MutesRepo persists the set of user ids the local owner has muted.
func NewMutesRepo ¶ added in v0.7.26
func NewMutesRepo(db MutesStorer) *MutesRepo
type MutesStorer ¶ added in v0.7.26
type MutesStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type NewUserNotifier ¶ added in v0.7.483
type NewUserNotifier interface {
Add(not domain.Notification) error
}
NewUserNotifier records a "new user discovered" notification for the local owner when a previously-unknown user is first stored.
type NodeRepo ¶
type NodeRepo struct {
RelaySelfHashHex string
// contains filtered or unexported fields
}
func NewNodeRepo ¶
func NewNodeRepo(db NodeStorer) *NodeRepo
func (*NodeRepo) BlocklistExponential ¶ added in v0.3.9
func (*NodeRepo) BlocklistPermanent ¶ added in v0.7.26
BlocklistPermanent puts peerId on the peer-level blocklist with no TTL (PermanentBlock). Unlike Blocklist (which escalates the BlockLevel and writes the matching expiring entry), this is what social blocks resolve to: the user explicitly decided to block, and the ban stays until they unblock.
func (*NodeRepo) BlocklistRemove ¶
func (*NodeRepo) BlocklistTerm ¶ added in v0.5.129
func (d *NodeRepo) BlocklistTerm(peerId string) (*BlocklistTerm, error)
func (*NodeRepo) DiskUsage ¶
DiskUsage implements the PersistentDatastore interface. It returns the sum of lsm and value log files sizes in bytes.
func (*NodeRepo) GetExpiration ¶
func (*NodeRepo) IsBlocklisted ¶
func (*NodeRepo) PutWithTTL ¶
type NodeStorer ¶
type NodeStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
Get(key local_store.DatabaseKey) ([]byte, error)
GetExpiration(key local_store.DatabaseKey) (uint64, error)
GetSize(key local_store.DatabaseKey) (int64, error)
Sync() error
IsClosed() bool
InnerDB() *local_store.WarpDB
SetWithTTL(key local_store.DatabaseKey, value []byte, ttl time.Duration) error
Set(key local_store.DatabaseKey, value []byte) error
Delete(key local_store.DatabaseKey) error
}
type NotificationsRepo ¶ added in v0.5.30
type NotificationsRepo struct {
// contains filtered or unexported fields
}
func NewNotificationsRepo ¶ added in v0.5.30
func NewNotificationsRepo(db NotificationsStorer) *NotificationsRepo
func (*NotificationsRepo) Add ¶ added in v0.5.30
func (repo *NotificationsRepo) Add(not domain.Notification) error
func (*NotificationsRepo) Get ¶ added in v0.7.26
func (repo *NotificationsRepo) Get(userId, notificationId string) (domain.Notification, error)
func (*NotificationsRepo) List ¶ added in v0.5.30
func (repo *NotificationsRepo) List(userId string, limit *uint64, cursor *string) ([]domain.Notification, string, error)
func (*NotificationsRepo) MarkAllRead ¶ added in v0.7.422
func (repo *NotificationsRepo) MarkAllRead(userId string) error
MarkAllRead flips IsRead to true for every unread notification the user has. Unread keys are collected in a read-only txn (no conflict tracking), then each is flipped with the same targeted-write pattern MarkRead uses — one small txn per key — so concurrent single MarkRead calls can't commit-conflict a whole page. IsRead is monotonic, so racing writers converge on the same state. Rows expired by TTL between the scan and the write are skipped.
func (*NotificationsRepo) MarkRead ¶ added in v0.7.26
func (repo *NotificationsRepo) MarkRead(userId, notificationId string) error
MarkRead flips Notification.IsRead to true for the given notification. Notification keys are timestamp-indexed within a per-user prefix, so a scan is unavoidable to locate the row from (userId, notificationId).
The scan and the write live in *separate* transactions on purpose. Badger's SSI tracks every key the txn reads; doing the prefix scan inside the same RW txn that later writes one key would add the entire page (~100 sibling notifications) to the read set, and a concurrent MarkRead on any of those siblings would commit-conflict the second writer. Splitting the work means the write txn's read+write sets are both just {targetKey}, so two MarkRead calls on different notifications no longer collide. Two MarkRead calls on the *same* notification can still race, but IsRead is monotonic, so the loser's view-after-commit matches the winner's regardless.
func (*NotificationsRepo) ReverseList ¶ added in v0.7.362
func (repo *NotificationsRepo) ReverseList(userId string, cursor *string, limit *uint64) ([]domain.Notification, string, error)
func (*NotificationsRepo) UnreadCount ¶ added in v0.7.59
func (repo *NotificationsRepo) UnreadCount(userId string) (uint64, error)
UnreadCount scans every notification under the user's prefix and returns the number with IsRead == false. List paginates, so the caller can't count "unread across all pages" without doing the full scan itself; this method centralises that walk so handlers don't derive the unread count from one page (which gave a flickering "20 unread" badge that mirrored whatever happened to be on page 1).
O(N) over the user's stored notifications. The repo's 24 h TTL on every Add() bounds N, so a scan per call is acceptable for now; if volume grows we'll move to a maintained counter mirrored on Add / MarkRead.
type NotificationsStorer ¶ added in v0.5.30
type OutboxEntry ¶ added in v0.7.521
type OutboxEntry struct {
Id string `json:"id"`
DestNodeId string `json:"dest_node_id"`
Route string `json:"route"`
Payload []byte `json:"payload"`
Attempts int `json:"attempts"`
CreatedAt time.Time `json:"created_at"`
}
OutboxEntry is one undelivered outgoing stream request. Id is a ULID that doubles as the FIFO ordering key and as the stable envelope message id reused across redelivery attempts, so the receiver's idempotency layer can dedupe.
type OutboxRepo ¶ added in v0.7.521
type OutboxRepo struct {
// contains filtered or unexported fields
}
func NewOutboxRepo ¶ added in v0.7.521
func NewOutboxRepo(db OutboxStorer) *OutboxRepo
func (*OutboxRepo) Delete ¶ added in v0.7.521
func (repo *OutboxRepo) Delete(destNodeId, id string) error
Delete removes a delivered entry.
func (*OutboxRepo) Enqueue ¶ added in v0.7.521
func (repo *OutboxRepo) Enqueue(destNodeId, route string, payload []byte) (OutboxEntry, error)
Enqueue stores an undelivered request for destNodeId and returns the created entry. The ULID key preserves per-node FIFO order for later replay.
func (*OutboxRepo) ListByNode ¶ added in v0.7.521
func (repo *OutboxRepo) ListByNode(destNodeId string) ([]OutboxEntry, error)
ListByNode returns every queued entry for destNodeId in FIFO (oldest-first) order.
func (*OutboxRepo) ListNodes ¶ added in v0.7.521
func (repo *OutboxRepo) ListNodes() ([]string, error)
ListNodes returns the distinct destination node ids that currently have at least one queued entry, used to flush everything on startup.
func (*OutboxRepo) Save ¶ added in v0.7.521
func (repo *OutboxRepo) Save(entry OutboxEntry) error
Save rewrites an existing entry in place (same key), used to persist an incremented attempt counter after a failed redelivery.
type OutboxStorer ¶ added in v0.7.521
type OutboxStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type SettingsRepo ¶ added in v0.7.483
type SettingsRepo struct {
// contains filtered or unexported fields
}
func NewSettingsRepo ¶ added in v0.7.483
func NewSettingsRepo(db SettingsStorer) *SettingsRepo
func (*SettingsRepo) GetNotificationSettings ¶ added in v0.7.483
func (repo *SettingsRepo) GetNotificationSettings(userId string) (domain.NotificationSettings, error)
GetNotificationSettings returns the user's notification settings, or a zero-value (email disabled) record when none has been saved yet.
func (*SettingsRepo) SetNotificationSettings ¶ added in v0.7.483
func (repo *SettingsRepo) SetNotificationSettings(userId string, s domain.NotificationSettings) error
SetNotificationSettings persists the user's notification settings.
type SettingsStorer ¶ added in v0.7.483
type SettingsStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type StatsStorer ¶ added in v0.6.120
type StatsStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
Get(key local_store.DatabaseKey) ([]byte, error)
GetExpiration(key local_store.DatabaseKey) (uint64, error)
GetSize(key local_store.DatabaseKey) (int64, error)
Sync() error
IsClosed() bool
InnerDB() *local_store.WarpDB
SetWithTTL(key local_store.DatabaseKey, value []byte, ttl time.Duration) error
Set(key local_store.DatabaseKey, value []byte) error
Delete(key local_store.DatabaseKey) error
}
type SubscriptionsRepo ¶ added in v0.7.26
type SubscriptionsRepo struct {
// contains filtered or unexported fields
}
SubscriptionsRepo persists the local "notify me about this user's new posts" watchlist.
func NewSubscriptionsRepo ¶ added in v0.7.26
func NewSubscriptionsRepo(db SubscriptionsStorer) *SubscriptionsRepo
func (*SubscriptionsRepo) IsSubscribed ¶ added in v0.7.26
func (repo *SubscriptionsRepo) IsSubscribed(selfId, targetUserId string) (bool, error)
func (*SubscriptionsRepo) Subscribe ¶ added in v0.7.26
func (repo *SubscriptionsRepo) Subscribe(selfId, targetUserId string) error
func (*SubscriptionsRepo) Unsubscribe ¶ added in v0.7.26
func (repo *SubscriptionsRepo) Unsubscribe(selfId, targetUserId string) error
type SubscriptionsStorer ¶ added in v0.7.26
type SubscriptionsStorer interface {
NewTxn() (local_store.WarpTransactioner, error)
}
type TimelineRepo ¶
type TimelineRepo struct {
// contains filtered or unexported fields
}
func NewTimelineRepo ¶
func NewTimelineRepo(db TimelineStorer) *TimelineRepo
func (*TimelineRepo) AddTweetToTimeline ¶
func (repo *TimelineRepo) AddTweetToTimeline(userId string, tweet domain.Tweet) error
func (*TimelineRepo) DeleteTweetFromTimeline ¶
func (repo *TimelineRepo) DeleteTweetFromTimeline(userID, tweetID string) error
func (*TimelineRepo) GetTimeline ¶
func (repo *TimelineRepo) GetTimeline(userId string, limit *uint64, cursor *string) ([]domain.Tweet, string, error)
GetTimeline retrieves a user's timeline sorted from newest to oldest
type TimelineStorer ¶
type TweetRepo ¶
type TweetRepo struct {
// contains filtered or unexported fields
}
func NewTweetRepo ¶
func NewTweetRepo(db TweetsStorer, statsDb TweetStatsStorer) *TweetRepo
func (*TweetRepo) AddReply ¶ added in v0.7.381
isTransitive tells whether this reply should propagate to the network-wide (CRDT) reply counter, which is replicated ("transits") across nodes. The handler sets it true only on the replier's own node, so a reply stored on both the replier's and the parent author's node is counted once. The local per-node counter is always updated (it backs the read-time fallback).
func (*TweetRepo) AppendEdit ¶ added in v0.7.26
func (*TweetRepo) CreateWithTTL ¶ added in v0.3.61
func (*TweetRepo) DeleteReply ¶ added in v0.7.381
func (*TweetRepo) GetReplies ¶ added in v0.7.381
func (repo *TweetRepo) GetReplies(parentID string, limit *uint64, cursor *string) ([]domain.Tweet, string, error)
GetReplies returns the direct replies to parentID, newest first — the tweet List of the parent's partition. Replies are tweets, so the result is a flat []domain.Tweet, each carrying its ParentId for clients that want to nest.
func (*TweetRepo) GetViewsCount ¶ added in v0.5.158
func (*TweetRepo) IsBlocklisted ¶ added in v0.5.30
func (*TweetRepo) NewRetweet ¶
func (*TweetRepo) RecordView ¶ added in v0.6.316
RecordView increments the view counter for tweetId on behalf of viewerId. The (tweetId, viewerId) pair is recorded permanently, so subsequent views from the same viewer — across sessions, restarts, days — are no-ops. The first call wins; the counter is incremented exactly once per unique viewer. The increment is atomic via the underlying transaction and replicated through the CRDT stats store, so it is safe under concurrent calls across nodes.
func (*TweetRepo) RepliesCount ¶ added in v0.7.381
func (*TweetRepo) Retweeters ¶
func (*TweetRepo) RetweetsCount ¶
type TweetStatsStorer ¶ added in v0.5.158
type TweetsStorer ¶
type TweetsStorer interface {
NewTxn() (local.WarpTransactioner, error)
Set(key local.DatabaseKey, value []byte) error
Get(key local.DatabaseKey) ([]byte, error)
Delete(key local.DatabaseKey) error
GetExpiration(key local.DatabaseKey) (uint64, error)
}
type UserRepo ¶
type UserRepo struct {
// contains filtered or unexported fields
}
func NewUserRepo ¶
func NewUserRepo(db UserStorer) *UserRepo
func NewUserRepoNotifying ¶ added in v0.7.483
func NewUserRepoNotifying(db UserStorer, notifier NewUserNotifier, ownerUserId string) *UserRepo
NewUserRepoNotifying returns a UserRepo that, on first storing a genuinely new (non-owner) user, records a "new user discovered" notification for the owner via notifier.
func (*UserRepo) CreateWithTTL ¶ added in v0.3.61
func (*UserRepo) GetByNodeID ¶
func (*UserRepo) Search ¶ added in v0.7.26
func (repo *UserRepo) Search(query string, limit *uint64, cursor *string) ([]domain.User, string, error)
Search returns users whose Username, Bio, or NodeId contains the (lower-cased) query. This is a server-side scan-and-filter — it preserves the cursor for incremental pages but still touches every matching record in the prefix range. A true substring index belongs here later; the API shape is forward-compatible.