linstrom/web/shared/User.go

117 lines
3 KiB
Go

package webshared
import (
"slices"
"time"
"git.mstar.dev/mstar/linstrom/config"
"git.mstar.dev/mstar/linstrom/shared"
"git.mstar.dev/mstar/linstrom/storage-new/models"
)
// Web/json representation of a user
type User struct {
// ---- Section public data ----
// All data here will always be included, even if empty,
// in which case it will be marked as null instead of omitted
ID string `json:"id"`
CreatedAt time.Time `json:"created_at"`
ServerId uint `json:"server_id"`
Displayname string `json:"displayname"`
Username string `json:"username"`
Description string `json:"description"`
IsBot bool `json:"is_bot"`
IconId *string `json:"icon_id"`
BackgroundId *string `json:"background_id"`
BannerId *string `json:"banner_id"`
Indexable bool `json:"indexable"`
PublicKey []byte `json:"public_key"`
RestrictedFollow bool `json:"restricted_follow"`
Location *string `json:"location"`
Birthday *time.Time `json:"birthday"`
// ---- Section Debug data ----
// All these entries should only be available
// for the debug server and should be cleared
// before serving on the public server.
// Every debug field must be omitempty
Verified *bool `json:"verified,omitempty"`
FinishedRegistration *bool `json:"finished_registration,omitempty"`
}
// Compiler assertations for interface implementations
var _ shared.Sanitisable = &User{}
var _ shared.Clonable = &User{}
func (u *User) Sanitize() {
u.Verified = nil
u.FinishedRegistration = nil
}
func (u *User) Clone() shared.Clonable {
user := *u
if u.IconId != nil {
tmp := *u.IconId
user.IconId = &tmp
}
if u.BackgroundId != nil {
tmp := *u.BackgroundId
user.BackgroundId = &tmp
}
if u.BannerId != nil {
tmp := *u.BannerId
user.BannerId = &tmp
}
if u.Location != nil {
tmp := *u.Location
user.Location = &tmp
}
if u.Birthday != nil {
tmp := *u.Birthday
user.Birthday = &tmp
}
if u.Verified != nil {
tmp := *u.Verified
user.Verified = &tmp
}
if u.FinishedRegistration != nil {
tmp := *u.FinishedRegistration
user.FinishedRegistration = &tmp
}
user.PublicKey = slices.Clone(u.PublicKey)
return &user
}
func (u *User) FromModel(m *models.User) {
u.ID = m.ID
u.CreatedAt = m.CreatedAt
u.ServerId = m.ServerId
u.Displayname = m.DisplayName
u.IsBot = m.IsBot
u.Username = m.Username
if m.IconId.Valid {
u.IconId = &m.IconId.String
}
if m.BackgroundId.Valid {
u.BackgroundId = &m.IconId.String
}
if m.BannerId.Valid {
u.BannerId = &m.IconId.String
}
u.Indexable = m.Indexable
if config.GlobalConfig.Experimental.UseEd25519Keys {
u.PublicKey = append(u.PublicKey, m.PublicKeyEd...)
} else {
u.PublicKey = append(u.PublicKey, m.PublicKeyRsa...)
}
u.RestrictedFollow = m.RestrictedFollow
if m.Location.Valid {
u.Location = &m.Location.String
}
if m.Birthday.Valid {
u.Birthday = &m.Birthday.Time
}
u.Verified = &m.Verified
u.FinishedRegistration = &m.FinishedRegistration
}