mirror of
https://github.com/versia-pub/versia-go.git
synced 2025-12-06 14:28:20 +01:00
140 lines
3 KiB
Go
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),
|
||
|
|
},
|
||
|
|
}
|
||
|
|
}
|