Documentation
¶
Index ¶
- Constants
- func MemberNameValid(name string) bool
- func NotNull[T any](slice []T) []T
- func UsernameValid(username string) (err error)
- type Badge
- type CustomPreference
- type CustomPreferences
- type DB
- func (db *DB) AccountFlags(ctx context.Context, userID xid.ID) (fs []PrideFlag, err error)
- func (db *DB) AckWarning(ctx context.Context, userID xid.ID, id int64) (ok bool, err error)
- func (db *DB) ActiveUsers(ctx context.Context, dur time.Duration) (numUsers int64, err error)
- func (db *DB) CleanUser(ctx context.Context, id xid.ID) error
- func (db *DB) ConvertAvatar(data string) (webpOut *bytes.Buffer, jpgOut *bytes.Buffer, err error)
- func (db *DB) ConvertFlag(data string) (webpOut *bytes.Buffer, err error)
- func (db *DB) Counts(ctx context.Context) (numUsers, numMembers, usersDay, usersWeek, usersMonth int64)
- func (db *DB) CreateExport(ctx context.Context, userID xid.ID, filename string, file *bytes.Buffer) (de DataExport, err error)
- func (db *DB) CreateFediverseApp(ctx context.Context, instance, instanceType, clientID, clientSecret string) (fa FediverseApp, err error)
- func (db *DB) CreateFlag(ctx context.Context, tx pgx.Tx, userID xid.ID, name, desc string) (f PrideFlag, err error)
- func (db *DB) CreateInvite(ctx context.Context, userID xid.ID) (i Invite, err error)
- func (db *DB) CreateMember(ctx context.Context, tx pgx.Tx, userID xid.ID, name string, ...) (m Member, err error)
- func (db *DB) CreateNotice(ctx context.Context, notice string, start, end time.Time) (n Notice, err error)
- func (db *DB) CreateReport(ctx context.Context, reporterID, userID xid.ID, memberID *xid.ID, ...) (r Report, err error)
- func (db *DB) CreateUser(ctx context.Context, tx pgx.Tx, username string) (u User, err error)
- func (db *DB) CreateWarning(ctx context.Context, tx pgx.Tx, userID xid.ID, reason string) (w Warning, err error)
- func (db *DB) CurrentNotice(ctx context.Context) (n Notice, err error)
- func (db *DB) DeleteExport(ctx context.Context, de DataExport) (err error)
- func (db *DB) DeleteFlag(ctx context.Context, flagID xid.ID, hash string) error
- func (db *DB) DeleteMember(ctx context.Context, id xid.ID) (err error)
- func (db *DB) DeleteMemberAvatar(ctx context.Context, memberID xid.ID, hash string) error
- func (db *DB) DeleteUser(ctx context.Context, tx pgx.Tx, id xid.ID, selfDelete bool, reason string) error
- func (db *DB) DeleteUserAvatar(ctx context.Context, userID xid.ID, hash string) error
- func (db *DB) DeleteUserMembers(ctx context.Context, tx pgx.Tx, id xid.ID) error
- func (db *DB) DiscordUser(ctx context.Context, discordID string) (u User, err error)
- func (db *DB) EditFlag(ctx context.Context, tx pgx.Tx, flagID xid.ID, name, desc, hash *string) (f PrideFlag, err error)
- func (db *DB) FediverseApp(ctx context.Context, instance string) (fa FediverseApp, err error)
- func (db *DB) FediverseAppByID(ctx context.Context, id int64) (fa FediverseApp, err error)
- func (db *DB) FediverseUser(ctx context.Context, userID string, instanceAppID int64) (u User, err error)
- func (db *DB) FlagObject(ctx context.Context, flagID xid.ID, hash string) (io.ReadCloser, error)
- func (db *DB) ForceDeleteUser(ctx context.Context, id xid.ID) error
- func (db *DB) GetJSON(ctx context.Context, key string, v any) error
- func (db *DB) GoogleUser(ctx context.Context, googleID string) (u User, err error)
- func (db *DB) HasRecentExport(ctx context.Context, userID xid.ID) (hasExport bool, err error)
- func (db *DB) InactiveUsers(ctx context.Context, tx pgx.Tx) (us []User, err error)
- func (db *DB) InvalidateAllTokens(ctx context.Context, tx pgx.Tx, userID xid.ID) error
- func (db *DB) InvalidateInvite(ctx context.Context, tx pgx.Tx, code string) (valid, alreadyUsed bool, err error)
- func (db *DB) InvalidateToken(ctx context.Context, userID xid.ID, tokenID xid.ID) (t Token, err error)
- func (db *DB) Member(ctx context.Context, id xid.ID) (m Member, err error)
- func (db *DB) MemberAvatar(ctx context.Context, memberID xid.ID, hash string) (io.ReadCloser, error)
- func (db *DB) MemberBySID(ctx context.Context, sid string) (u Member, err error)
- func (db *DB) MemberBySnowflake(ctx context.Context, id common.MemberID) (m Member, err error)
- func (db *DB) MemberCount(ctx context.Context, userID xid.ID) (n int64, err error)
- func (db *DB) MemberFields(ctx context.Context, id xid.ID) (fs []Field, err error)
- func (db *DB) MemberFlags(ctx context.Context, memberID xid.ID) (fs []MemberFlag, err error)
- func (db *DB) MultiCmd(ctx context.Context, cmds ...radix.Action) error
- func (db *DB) Notices(ctx context.Context) (ns []Notice, err error)
- func (db *DB) Report(ctx context.Context, tx pgx.Tx, id int64) (r Report, err error)
- func (db *DB) Reports(ctx context.Context, closed bool, before int) (rs []Report, err error)
- func (db *DB) ReportsByReporter(ctx context.Context, reporterID xid.ID, before int) (rs []Report, err error)
- func (db *DB) ReportsByUser(ctx context.Context, userID xid.ID, before int) (rs []Report, err error)
- func (db *DB) RerollMemberSID(ctx context.Context, userID, memberID xid.ID) (newID string, err error)
- func (db *DB) RerollUserSID(ctx context.Context, id xid.ID) (newID string, err error)
- func (db *DB) ResetUser(ctx context.Context, tx pgx.Tx, id xid.ID) error
- func (db *DB) ResolveReport(ctx context.Context, ex Execer, id int64, adminID xid.ID, comment string) error
- func (db *DB) SaveToken(ctx context.Context, userID xid.ID, tokenID xid.ID, apiOnly, readOnly bool) (t Token, err error)
- func (db *DB) SetJSON(ctx context.Context, key string, v any, args ...string) error
- func (db *DB) SetMemberFields(ctx context.Context, tx pgx.Tx, memberID xid.ID, fields []Field) (err error)
- func (db *DB) SetMemberFlags(ctx context.Context, tx pgx.Tx, memberID xid.ID, flags []xid.ID) (err error)
- func (db *DB) SetMemberNamesPronouns(ctx context.Context, tx pgx.Tx, memberID xid.ID, names []FieldEntry, ...) (err error)
- func (db *DB) SetUserFields(ctx context.Context, tx pgx.Tx, userID xid.ID, fields []Field) (err error)
- func (db *DB) SetUserFlags(ctx context.Context, tx pgx.Tx, userID xid.ID, flags []xid.ID) (err error)
- func (db *DB) SetUserNamesPronouns(ctx context.Context, tx pgx.Tx, userID xid.ID, names []FieldEntry, ...) (err error)
- func (db *DB) TokenValid(ctx context.Context, userID, tokenID xid.ID) (valid bool, err error)
- func (db *DB) Tokens(ctx context.Context, userID xid.ID) (ts []Token, err error)
- func (db *DB) TotalMemberCount(ctx context.Context) (numMembers int64, err error)
- func (db *DB) TotalUserCount(ctx context.Context) (numUsers int64, err error)
- func (db *DB) TumblrUser(ctx context.Context, tumblrID string) (u User, err error)
- func (db *DB) UndoDeleteUser(ctx context.Context, id xid.ID) error
- func (db *DB) UpdateActiveTime(ctx context.Context, tx connOrTx, userID xid.ID) (err error)
- func (db *DB) UpdateMember(ctx context.Context, tx pgx.Tx, id xid.ID, name, displayName, bio *string, ...) (m Member, err error)
- func (db *DB) UpdateUser(ctx context.Context, tx pgx.Tx, id xid.ID, displayName, bio *string, ...) (u User, err error)
- func (db *DB) UpdateUserSettings(ctx context.Context, id xid.ID, us UserSettings) error
- func (db *DB) UpdateUsername(ctx context.Context, tx pgx.Tx, id xid.ID, newName string) error
- func (db *DB) User(ctx context.Context, id xid.ID) (u User, err error)
- func (db *DB) UserAvatar(ctx context.Context, userID xid.ID, hash string) (io.ReadCloser, error)
- func (db *DB) UserBySID(ctx context.Context, sid string) (u User, err error)
- func (db *DB) UserBySnowflake(ctx context.Context, id common.UserID) (u User, err error)
- func (db *DB) UserExport(ctx context.Context, userID xid.ID) (de DataExport, err error)
- func (db *DB) UserFields(ctx context.Context, id xid.ID) (fs []Field, err error)
- func (db *DB) UserFlag(ctx context.Context, flagID xid.ID) (f PrideFlag, err error)
- func (db *DB) UserFlags(ctx context.Context, userID xid.ID) (fs []UserFlag, err error)
- func (db *DB) UserInvites(ctx context.Context, userID xid.ID) (is []Invite, err error)
- func (db *DB) UserMember(ctx context.Context, userID xid.ID, memberRef string) (m Member, err error)
- func (db *DB) UserMembers(ctx context.Context, userID xid.ID, showHidden bool) (ms []Member, err error)
- func (db *DB) Username(ctx context.Context, name string) (u User, err error)
- func (db *DB) UsernameTaken(ctx context.Context, username string) (valid, taken bool, err error)
- func (db *DB) Warnings(ctx context.Context, userID xid.ID, unread bool) (ws []Warning, err error)
- func (db *DB) WriteFlag(ctx context.Context, flagID xid.ID, flag *bytes.Buffer) (hash string, err error)
- func (db *DB) WriteMemberAvatar(ctx context.Context, memberID xid.ID, webp *bytes.Buffer, jpeg *bytes.Buffer) (hash string, err error)
- func (db *DB) WriteUserAvatar(ctx context.Context, userID xid.ID, webp *bytes.Buffer, jpeg *bytes.Buffer) (hash string, err error)
- type DataExport
- type Execer
- type FediverseApp
- type Field
- type FieldEntry
- type Invite
- type Member
- type MemberFlag
- type Notice
- type PreferenceSize
- type PrideFlag
- type PronounEntry
- type Report
- type Token
- type User
- func (u User) NumProviders() (numProviders int)
- func (u User) UTCOffset() (offset int, ok bool)
- func (u *User) UnlinkDiscord(ctx context.Context, ex Execer) error
- func (u *User) UnlinkFedi(ctx context.Context, ex Execer) error
- func (u *User) UnlinkGoogle(ctx context.Context, ex Execer) error
- func (u *User) UnlinkTumblr(ctx context.Context, ex Execer) error
- func (u *User) UpdateFromDiscord(ctx context.Context, ex Execer, du *discordgo.User) error
- func (u *User) UpdateFromFedi(ctx context.Context, ex Execer, userID, username string, appID int64) error
- func (u *User) UpdateFromGoogle(ctx context.Context, ex Execer, googleID, googleUsername string) error
- func (u *User) UpdateFromTumblr(ctx context.Context, ex Execer, tumblrID, tumblrUsername string) error
- type UserFlag
- type UserSettings
- type Warning
- type WordStatus
Constants ¶
const ( MaxFields = 25 FieldNameMaxLength = 100 FieldEntriesLimit = 100 FieldEntryMaxLength = 100 )
const ( MaxPrideFlags = 500 MaxPrideFlagTitleLength = 100 MaxPrideFlagDescLength = 500 )
const ( ErrInvalidFlagID = errors.Sentinel("invalid flag ID") ErrFlagNotFound = errors.Sentinel("flag not found") )
const ( MaxMemberCount = 500 MaxMemberNameLength = 100 )
const ( ErrMemberNotFound = errors.Sentinel("member not found") ErrMemberNameInUse = errors.Sentinel("member name already in use") )
const ( ActiveMonth = 30 * 24 * time.Hour ActiveWeek = 7 * 24 * time.Hour ActiveDay = 24 * time.Hour )
const ( ErrUserNotFound = errors.Sentinel("user not found") ErrUsernameTaken = errors.Sentinel("username is already taken") ErrInvalidUsername = errors.Sentinel("username contains invalid characters") ErrUsernameTooShort = errors.Sentinel("username is too short") ErrUsernameTooLong = errors.Sentinel("username is too long") ErrBannedUsername = errors.Sentinel("username is banned") )
const ( MaxUsernameLength = 40 MaxDisplayNameLength = 100 MaxUserBioLength = 1000 MaxUserLinksLength = 25 MaxLinkLength = 256 )
const ( SelfDeleteAfter = 30 * 24 * time.Hour ModDeleteAfter = 180 * 24 * time.Hour )
const ErrFileTooLarge = errors.Sentinel("file to be converted exceeds maximum size")
const ErrInvalidContentType = errors.Sentinel("invalid avatar content type")
const ErrInvalidDataURI = errors.Sentinel("invalid data URI")
const ErrNoExport = errors.Sentinel("no data export exists")
const ErrNoInstanceApp = errors.Sentinel("instance doesn't have an app")
const ErrNoNotice = errors.Sentinel("no current notice")
const ErrNothingToUpdate = errors.Sentinel("nothing to update")
const ErrReportNotFound = errors.Sentinel("report not found")
const ErrTooManyInvites = errors.Sentinel("user invite limit reached")
const KeepExportTime = 7 * 24 * time.Hour
const MaxFlagInputSize = 512_000
const ReportPageSize = 100
const TokenExpiryTime = 3 * 30 * 24 * time.Hour
3 months, might be customizable later
Variables ¶
This section is empty.
Functions ¶
func MemberNameValid ¶
func NotNull ¶
func NotNull[T any](slice []T) []T
NotNull is a little helper that returns an *empty slice* when the slice's length is 0. This is to prevent nil slices from being marshaled as JSON null
func UsernameValid ¶
Types ¶
type CustomPreference ¶
type CustomPreference struct {
Icon string `json:"icon"`
Tooltip string `json:"tooltip"`
Size PreferenceSize `json:"size"`
Muted bool `json:"muted"`
Favourite bool `json:"favourite"`
}
func (CustomPreference) Validate ¶
func (c CustomPreference) Validate() string
type CustomPreferences ¶
type CustomPreferences = map[string]CustomPreference
type DB ¶
type DB struct {
*pgxpool.Pool
Redis radix.Client
TotalRequests prometheus.Counter
// contains filtered or unexported fields
}
func (*DB) AccountFlags ¶
func (*DB) AckWarning ¶
func (*DB) ActiveUsers ¶
func (*DB) ConvertAvatar ¶
func (db *DB) ConvertAvatar(data string) ( webpOut *bytes.Buffer, jpgOut *bytes.Buffer, err error, )
ConvertAvatar parses an avatar from a data URI, converts it to WebP and JPEG, and returns the results.
func (*DB) ConvertFlag ¶
ConvertFlag parses a flag from a data URI, converts it to WebP, and returns the result.
func (*DB) CreateExport ¶
func (*DB) CreateFediverseApp ¶
func (*DB) CreateFlag ¶
func (*DB) CreateInvite ¶
func (*DB) CreateMember ¶
func (db *DB) CreateMember( ctx context.Context, tx pgx.Tx, userID xid.ID, name string, displayName *string, bio string, links []string, ) (m Member, err error)
CreateMember creates a member.
func (*DB) CreateNotice ¶ added in v0.6.2
func (*DB) CreateReport ¶
func (*DB) CreateUser ¶
CreateUser creates a user with the given username.
func (*DB) CreateWarning ¶
func (*DB) CurrentNotice ¶ added in v0.6.2
func (*DB) DeleteExport ¶
func (db *DB) DeleteExport(ctx context.Context, de DataExport) (err error)
func (*DB) DeleteFlag ¶
func (*DB) DeleteMember ¶
DeleteMember deletes a member by the given ID. This is irreversible.
func (*DB) DeleteMemberAvatar ¶
func (*DB) DeleteUser ¶
func (*DB) DeleteUserAvatar ¶
func (*DB) DeleteUserMembers ¶
func (*DB) DiscordUser ¶
DiscordUser fetches a user by Discord user ID.
func (*DB) FediverseApp ¶
func (*DB) FediverseAppByID ¶
func (*DB) FediverseUser ¶
func (*DB) FlagObject ¶
func (*DB) GoogleUser ¶
GoogleUser fetches a user by Google user ID.
func (*DB) HasRecentExport ¶
func (*DB) InactiveUsers ¶ added in v0.6.3
InactiveUsers gets the list of inactive users from the database. "Inactive" is defined as: - not logged in for 30 days or more - no display name, bio, avatar, names, pronouns, profile links, or profile fields - no members
func (*DB) InvalidateAllTokens ¶
func (*DB) InvalidateInvite ¶
func (*DB) InvalidateToken ¶
func (*DB) MemberAvatar ¶
func (*DB) MemberBySID ¶
MemberBySID gets a user by their short ID.
func (*DB) MemberBySnowflake ¶ added in v0.6.1
func (*DB) MemberCount ¶
MemberCount returns the number of members that the given user has.
func (*DB) MemberFields ¶
MemberFields returns the fields associated with the given member ID.
func (*DB) MemberFlags ¶
func (*DB) MultiCmd ¶
MultiCmd executes the given Redis commands in order. If any return an error, the function is aborted.
func (*DB) ReportsByReporter ¶
func (*DB) ReportsByUser ¶
func (*DB) RerollMemberSID ¶
func (*DB) RerollUserSID ¶
func (*DB) ResolveReport ¶
func (*DB) SaveToken ¶
func (db *DB) SaveToken(ctx context.Context, userID xid.ID, tokenID xid.ID, apiOnly, readOnly bool) (t Token, err error)
SaveToken saves a token to the database.
func (*DB) SetMemberFields ¶
func (db *DB) SetMemberFields(ctx context.Context, tx pgx.Tx, memberID xid.ID, fields []Field) (err error)
SetMemberFields updates the fields for the given member.
func (*DB) SetMemberFlags ¶
func (*DB) SetMemberNamesPronouns ¶
func (db *DB) SetMemberNamesPronouns(ctx context.Context, tx pgx.Tx, memberID xid.ID, names []FieldEntry, pronouns []PronounEntry) (err error)
func (*DB) SetUserFields ¶
func (db *DB) SetUserFields(ctx context.Context, tx pgx.Tx, userID xid.ID, fields []Field) (err error)
SetUserFields updates the fields for the given user.
func (*DB) SetUserFlags ¶
func (*DB) SetUserNamesPronouns ¶
func (db *DB) SetUserNamesPronouns(ctx context.Context, tx pgx.Tx, userID xid.ID, names []FieldEntry, pronouns []PronounEntry) (err error)
func (*DB) TokenValid ¶
func (*DB) TotalMemberCount ¶
func (*DB) TotalUserCount ¶
func (*DB) TumblrUser ¶
TumblrUser fetches a user by Tumblr user ID.
func (*DB) UpdateActiveTime ¶
UpdateActiveTime is called on create and update endpoints (PATCH /users/@me, POST/PATCH/DELETE /members)
func (*DB) UpdateMember ¶
func (*DB) UpdateUser ¶
func (*DB) UpdateUserSettings ¶ added in v0.6.1
func (*DB) UpdateUsername ¶
UpdateUsername validates the given username, then updates the given user's name to it if valid.
func (*DB) UserAvatar ¶
func (*DB) UserBySnowflake ¶ added in v0.6.1
UserBySnowflake gets a user by their snowflake ID.
func (*DB) UserExport ¶
func (*DB) UserFields ¶
UserFields returns the fields associated with the given user ID.
func (*DB) UserInvites ¶
func (*DB) UserMember ¶
func (db *DB) UserMember(ctx context.Context, userID xid.ID, memberRef string) (m Member, err error)
UserMember returns a member scoped by user.
func (*DB) UserMembers ¶
func (db *DB) UserMembers(ctx context.Context, userID xid.ID, showHidden bool) (ms []Member, err error)
UserMembers returns all of a user's members, sorted by name.
func (*DB) UsernameTaken ¶
UsernameTaken checks if the given username is already taken.
func (*DB) WriteMemberAvatar ¶
type DataExport ¶
func (DataExport) Path ¶
func (de DataExport) Path() string
type FediverseApp ¶
type FediverseApp struct {
ID int64
// Instance is the instance's base API url, excluding schema
Instance string
ClientID string
ClientSecret string
InstanceType string
}
func (FediverseApp) ClientConfig ¶
func (f FediverseApp) ClientConfig() *oauth2.Config
func (FediverseApp) MastodonCompatible ¶
func (f FediverseApp) MastodonCompatible() bool
func (FediverseApp) Misskey ¶
func (f FediverseApp) Misskey() bool
type Field ¶
type Field struct {
ID int64 `json:"-"`
Name string `json:"name"`
Entries []FieldEntry `json:"entries"`
}
func (Field) Validate ¶
func (f Field) Validate(custom CustomPreferences) string
Validate validates this field. If it is invalid, a non-empty string is returned as error message.
type FieldEntry ¶
type FieldEntry struct {
Value string `json:"value"`
Status WordStatus `json:"status"`
}
func (FieldEntry) Validate ¶
func (fe FieldEntry) Validate(custom CustomPreferences) string
type MemberFlag ¶
type PreferenceSize ¶
type PreferenceSize string
const ( PreferenceSizeLarge PreferenceSize = "large" PreferenceSizeNormal PreferenceSize = "normal" PreferenceSizeSmall PreferenceSize = "small" )
type PronounEntry ¶
type PronounEntry struct {
Pronouns string `json:"pronouns"`
DisplayText *string `json:"display_text"`
Status WordStatus `json:"status"`
}
func (PronounEntry) String ¶
func (p PronounEntry) String() string
func (PronounEntry) Validate ¶
func (p PronounEntry) Validate(custom CustomPreferences) string
type Report ¶
type Report struct {
ID int64 `json:"id"`
UserID xid.ID `json:"user_id"`
UserName string `json:"user_name"`
MemberID xid.ID `json:"member_id"`
MemberName *string `json:"member_name"`
Reason string `json:"reason"`
ReporterID xid.ID `json:"reporter_id"`
CreatedAt time.Time `json:"created_at"`
ResolvedAt *time.Time `json:"resolved_at"`
AdminID xid.ID `json:"admin_id"`
AdminComment *string `json:"admin_comment"`
}
type User ¶
type User struct {
ID xid.ID
SnowflakeID common.UserID
SID string `db:"sid"`
Username string
DisplayName *string
Bio *string
MemberTitle *string
LastActive time.Time
Avatar *string
Links []string
Names []FieldEntry
Pronouns []PronounEntry
Discord *string
DiscordUsername *string
Fediverse *string
FediverseUsername *string
FediverseAppID *int64
FediverseInstance *string
Tumblr *string
TumblrUsername *string
Google *string
GoogleUsername *string
MaxInvites int
IsAdmin bool
ListPrivate bool
LastSIDReroll time.Time `db:"last_sid_reroll"`
Timezone *string
Settings UserSettings
DeletedAt *time.Time
SelfDelete *bool
DeleteReason *string
CustomPreferences CustomPreferences
}
func (User) NumProviders ¶
func (User) UTCOffset ¶ added in v0.5.8
UTCOffset returns the user's UTC offset in seconds. If the user does not have a timezone set, `ok` is false.
func (*User) UpdateFromDiscord ¶
func (*User) UpdateFromFedi ¶
func (*User) UpdateFromGoogle ¶
type UserSettings ¶ added in v0.6.1
type WordStatus ¶
type WordStatus string
func (*WordStatus) UnmarshalJSON ¶
func (w *WordStatus) UnmarshalJSON(src []byte) error
func (WordStatus) Valid ¶
func (w WordStatus) Valid(extra CustomPreferences) bool