linstrom/storage-new/models/User.go
mstar 588849a6c2
Some checks are pending
/ test (push) Waiting to run
Big ol' note about string/uuid as primary key
TODO: Apply the same tag change to other structs with uuid id too
2025-03-27 16:46:53 +01:00

71 lines
3.2 KiB
Go

package models
import (
"time"
"gorm.io/gorm"
)
// A user describes an account for creating content.
// This may be controlled by either a human or some external script
//
// Data stored in external types:
// - Custom info fields
// - Being types
// - Tags
// - Relations
// - Pronouns
// - Roles
// - AP remote links
// - Auth methods and tokens (hashed pw, totp key, passkey id)
type User struct {
// ID is a uuid for this account
//
// NOTE: Performance and storage wise, using a UUID (as string) for the primary key
// is not the best idea and it would be better to use incrementing integers
// Additionally, there is a risk with inconsistency if postgres crashes during a commit
// in which case the new entry might not have a valid Id with which it could be found
// and the username is lost until manual recovery
// However, a UUID is still necessary in some way to provide a (secondary) stable
// identifier for users and other servers, especially when changing the username
// (username != display name) might be a future feature
// Same also applies for other types that use a UUID as primary key
// TODO: Copy the default value and gorm type to those other types as well
ID string `gorm:"primarykey;type:uuid;default:gen_random_uuid()"`
// Username of the user (eg "max" if the full username is @max@example.com)
// Assume unchangable (once set by a user) to be kind to other implementations
// Would be an easy avenue to fuck with them though
Username string `gorm:"unique"`
CreatedAt time.Time // When this entry was created. Automatically set by gorm
// When this account was last updated. Will also be used for refreshing remote accounts. Automatically set by gorm
UpdatedAt time.Time
// When this entry was deleted (for soft deletions)
// Soft delete means that this entry still exists in the db, but gorm won't include it anymore unless specifically told to
// If not null, this entry is marked as deleted
DeletedAt gorm.DeletedAt `gorm:"index"`
// Server RemoteServer // `gorm:"foreignKey:ServerId;references:ID"` // The server this user is from
ServerId uint // Id of the server this user is from, needed for including RemoteServer
DisplayName string // The display name of the user. Can be different from the handle
Description string // The description of a user account
IsBot bool // Whether to mark this account as a script controlled one
Icon MediaMetadata
IconId string // ID of a media file used as icon
Background *MediaMetadata
BackgroundId *string // ID of a media file used as background image
Banner *MediaMetadata
BannerId *string // ID of a media file used as banner
Indexable bool // Whether this account can be found by crawlers
PublicKey []byte // The public key of the account
// Whether this account restricts following
// If true, the owner must approve of a follow request first
RestrictedFollow bool
Location *string
Birthday *time.Time
// --- And internal account stuff ---
// Whether the account got verified and is allowed to be active
// For local accounts being active means being allowed to login and perform interactions
// For remote users, if an account is not verified, any interactions it sends are discarded
Verified bool
}