versia-go/internal/entity/user.go
2024-08-13 01:18:14 +02:00

140 lines
3 KiB
Go

package entity
import (
"github.com/lysand-org/versia-go/internal/helpers"
"net/url"
"github.com/lysand-org/versia-go/ent"
"github.com/lysand-org/versia-go/internal/utils"
"github.com/lysand-org/versia-go/pkg/lysand"
)
type User struct {
*ent.User
URI *lysand.URL
Inbox *lysand.URL
Outbox *lysand.URL
Featured *lysand.URL
Followers *lysand.URL
Following *lysand.URL
DisplayName string
LysandAvatar lysand.ImageContentTypeMap
LysandBiography lysand.TextContentTypeMap
Signer lysand.Signer
}
func NewUser(dbUser *ent.User) (*User, error) {
u := &User{User: dbUser}
u.DisplayName = u.Username
if dbUser.DisplayName != nil {
u.DisplayName = *dbUser.DisplayName
}
var err error
if u.URI, err = lysand.ParseURL(dbUser.URI); err != nil {
return nil, err
}
if u.Inbox, err = lysand.ParseURL(dbUser.Inbox); err != nil {
return nil, err
}
if u.Outbox, err = lysand.ParseURL(dbUser.Outbox); err != nil {
return nil, err
}
if u.Featured, err = lysand.ParseURL(dbUser.Featured); err != nil {
return nil, err
}
if u.Followers, err = lysand.ParseURL(dbUser.Followers); err != nil {
return nil, err
}
if u.Following, err = lysand.ParseURL(dbUser.Following); err != nil {
return nil, err
}
u.LysandAvatar = lysandAvatar(dbUser)
u.LysandBiography = lysandBiography(dbUser)
u.Signer = lysand.Signer{
PrivateKey: dbUser.PrivateKey,
UserURL: u.URI.ToStd(),
}
return u, nil
}
func (u User) ToLysand() *lysand.User {
return &lysand.User{
Entity: lysand.Entity{
ID: u.ID,
URI: u.URI,
CreatedAt: lysand.TimeFromStd(u.CreatedAt),
Extensions: u.Extensions,
},
DisplayName: helpers.StringPtr(u.DisplayName),
Username: u.Username,
Avatar: u.LysandAvatar,
Header: imageMap(u.Edges.HeaderImage),
Indexable: u.Indexable,
PublicKey: lysand.PublicKey{
Actor: utils.UserAPIURL(u.ID),
PublicKey: lysand.SPKIPublicKey(u.PublicKey),
},
Bio: u.LysandBiography,
Fields: u.Fields,
Inbox: u.Inbox,
Outbox: u.Outbox,
Featured: u.Featured,
Followers: u.Followers,
Following: u.Following,
// TODO: Remove these, they got deprecated and moved into an extension
Likes: utils.UserLikesAPIURL(u.ID),
Dislikes: utils.UserDislikesAPIURL(u.ID),
}
}
func lysandAvatar(u *ent.User) lysand.ImageContentTypeMap {
if avatar := imageMap(u.Edges.AvatarImage); avatar != nil {
return avatar
}
return lysand.ImageContentTypeMap{
"image/svg+xml": lysand.ImageContent{
Content: utils.DefaultAvatarURL(u.ID),
},
}
}
func lysandBiography(u *ent.User) lysand.TextContentTypeMap {
if u.Biography == nil {
return nil
}
// TODO: Render HTML
return lysand.TextContentTypeMap{
"text/html": lysand.TextContent{
Content: *u.Biography,
},
}
}
func imageMap(i *ent.Image) lysand.ImageContentTypeMap {
if i == nil {
return nil
}
u, err := url.Parse(i.URL)
if err != nil {
return nil
}
return lysand.ImageContentTypeMap{
i.MimeType: {
Content: (*lysand.URL)(u),
},
}
}