ad5e9b2e21
Signed-off-by: Michael Mayer <michael@photoprism.app>
161 lines
5.5 KiB
Go
161 lines
5.5 KiB
Go
package entity
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/photoprism/photoprism/pkg/clean"
|
|
"github.com/photoprism/photoprism/pkg/rnd"
|
|
)
|
|
|
|
const (
|
|
GenderMale = "male"
|
|
GenderFemale = "female"
|
|
GenderOther = "other"
|
|
GenderUnknown = ""
|
|
)
|
|
|
|
// UserDetails represents user profile information.
|
|
type UserDetails struct {
|
|
UserUID string `gorm:"type:VARBINARY(42);primary_key;auto_increment:false;" json:"-" yaml:"-"`
|
|
SubjUID string `gorm:"type:VARBINARY(42);index;" json:"SubjUID,omitempty" yaml:"SubjUID,omitempty"`
|
|
SubjSrc string `gorm:"type:VARBINARY(8);default:'';" json:"-" yaml:"SubjSrc,omitempty"`
|
|
PlaceID string `gorm:"type:VARBINARY(42);index;default:'zz'" json:"-" yaml:"-"`
|
|
PlaceSrc string `gorm:"type:VARBINARY(8);" json:"-" yaml:"PlaceSrc,omitempty"`
|
|
CellID string `gorm:"type:VARBINARY(42);index;default:'zz'" json:"-" yaml:"CellID,omitempty"`
|
|
BirthYear int `json:"BirthYear" yaml:"BirthYear,omitempty"`
|
|
BirthMonth int `json:"BirthMonth" yaml:"BirthMonth,omitempty"`
|
|
BirthDay int `json:"BirthDay" yaml:"BirthDay,omitempty"`
|
|
NameTitle string `gorm:"size:32;" json:"NameTitle" yaml:"NameTitle,omitempty"`
|
|
GivenName string `gorm:"size:64;" json:"GivenName" yaml:"GivenName,omitempty"`
|
|
MiddleName string `gorm:"size:64;" json:"MiddleName" yaml:"MiddleName,omitempty"`
|
|
FamilyName string `gorm:"size:64;" json:"FamilyName" yaml:"FamilyName,omitempty"`
|
|
NameSuffix string `gorm:"size:32;" json:"NameSuffix" yaml:"NameSuffix,omitempty"`
|
|
NickName string `gorm:"size:64;" json:"NickName" yaml:"NickName,omitempty"`
|
|
NameSrc string `gorm:"type:VARBINARY(8);" json:"NameSrc" yaml:"NameSrc,omitempty"`
|
|
UserGender string `gorm:"size:16;" json:"Gender" yaml:"Gender,omitempty"`
|
|
UserAbout string `gorm:"size:512;" json:"About" yaml:"About,omitempty"`
|
|
UserBio string `gorm:"size:2048;" json:"Bio" yaml:"Bio,omitempty"`
|
|
UserLocation string `gorm:"size:512;" json:"Location" yaml:"Location,omitempty"`
|
|
UserCountry string `gorm:"type:VARBINARY(2);" json:"Country" yaml:"Country,omitempty"`
|
|
UserPhone string `gorm:"size:32;" json:"Phone" yaml:"Phone,omitempty"`
|
|
SiteURL string `gorm:"type:VARBINARY(512);column:site_url" json:"SiteURL" yaml:"SiteURL,omitempty"`
|
|
ProfileURL string `gorm:"type:VARBINARY(512);column:profile_url" json:"ProfileURL" yaml:"ProfileURL,omitempty"`
|
|
FeedURL string `gorm:"type:VARBINARY(512);column:feed_url" json:"FeedURL,omitempty" yaml:"FeedURL,omitempty"`
|
|
AvatarURL string `gorm:"type:VARBINARY(512);column:avatar_url" json:"AvatarURL,omitempty" yaml:"AvatarURL,omitempty"`
|
|
OrgTitle string `gorm:"size:64;" json:"OrgTitle" yaml:"OrgTitle,omitempty"`
|
|
OrgName string `gorm:"size:128;" json:"OrgName" yaml:"OrgName,omitempty"`
|
|
OrgEmail string `gorm:"size:255;index;" json:"OrgEmail" yaml:"OrgEmail,omitempty"`
|
|
OrgPhone string `gorm:"size:32;" json:"OrgPhone" yaml:"OrgPhone,omitempty"`
|
|
OrgURL string `gorm:"type:VARBINARY(512);column:org_url" json:"OrgURL" yaml:"OrgURL,omitempty"`
|
|
IdURL string `gorm:"type:VARBINARY(512);column:id_url;" json:"IdURL,omitempty" yaml:"IdURL,omitempty"`
|
|
CreatedAt time.Time `json:"CreatedAt" yaml:"-"`
|
|
UpdatedAt time.Time `json:"UpdatedAt" yaml:"-"`
|
|
}
|
|
|
|
// TableName returns the entity table name.
|
|
func (UserDetails) TableName() string {
|
|
return "auth_users_details"
|
|
}
|
|
|
|
// NewUserDetails creates new user details.
|
|
func NewUserDetails(uid string) *UserDetails {
|
|
return &UserDetails{UserUID: uid}
|
|
}
|
|
|
|
// CreateUserDetails creates new user details or returns nil on error.
|
|
func CreateUserDetails(user *User) error {
|
|
if user == nil {
|
|
return fmt.Errorf("user is nil")
|
|
}
|
|
|
|
if user.UID() == "" {
|
|
return fmt.Errorf("empty user uid")
|
|
}
|
|
|
|
user.UserDetails = NewUserDetails(user.UID())
|
|
|
|
if err := Db().Where("user_uid = ?", user.UID()).First(user.UserDetails).Error; err == nil {
|
|
return nil
|
|
}
|
|
|
|
return user.UserDetails.Create()
|
|
}
|
|
|
|
// HasID tests if the entity has a valid uid.
|
|
func (m *UserDetails) HasID() bool {
|
|
return rnd.IsUID(m.UserUID, UserUID)
|
|
}
|
|
|
|
// Create new entity in the database.
|
|
func (m *UserDetails) Create() error {
|
|
return Db().Create(m).Error
|
|
}
|
|
|
|
// Save updates the record in the database or inserts a new record if it does not already exist.
|
|
func (m *UserDetails) Save() error {
|
|
return Db().Save(m).Error
|
|
}
|
|
|
|
// Updates multiple properties in the database.
|
|
func (m *UserDetails) Updates(values interface{}) error {
|
|
return UnscopedDb().Model(m).Updates(values).Error
|
|
}
|
|
|
|
// DisplayName returns a display name based on the user details.
|
|
func (m *UserDetails) DisplayName() string {
|
|
if m == nil {
|
|
return ""
|
|
}
|
|
|
|
n := make([]string, 0, 3)
|
|
|
|
// Add title if exists.
|
|
if m.NameTitle != "" {
|
|
n = append(n, m.NameTitle)
|
|
}
|
|
|
|
// Add given name if exists.
|
|
if m.GivenName != "" {
|
|
n = append(n, m.GivenName)
|
|
}
|
|
|
|
// Add family name if exists.
|
|
if m.FamilyName != "" {
|
|
n = append(n, m.FamilyName)
|
|
}
|
|
|
|
// Default to nick name.
|
|
if len(n) == 0 {
|
|
return m.NickName
|
|
}
|
|
|
|
return strings.Join(n, " ")
|
|
}
|
|
|
|
// SetGivenName updates the user's given name.
|
|
func (m *UserDetails) SetGivenName(name string) *UserDetails {
|
|
name = clean.Name(name)
|
|
|
|
if name == "" || SrcPriority[SrcAuto] < SrcPriority[m.NameSrc] {
|
|
return m
|
|
}
|
|
|
|
m.GivenName = name
|
|
|
|
return m
|
|
}
|
|
|
|
// SetFamilyName updates the user's family name.
|
|
func (m *UserDetails) SetFamilyName(name string) *UserDetails {
|
|
name = clean.Name(name)
|
|
|
|
if name == "" || SrcPriority[SrcAuto] < SrcPriority[m.NameSrc] {
|
|
return m
|
|
}
|
|
|
|
m.FamilyName = name
|
|
|
|
return m
|
|
}
|