versia-go/internal/entity/user.go

160 lines
3.6 KiB
Go
Raw Permalink Normal View History

2024-08-11 03:51:22 +02:00
package entity
import (
2024-08-28 00:25:25 +02:00
"github.com/versia-pub/versia-go/internal/helpers"
"github.com/versia-pub/versia-go/pkg/versia"
versiacrypto "github.com/versia-pub/versia-go/pkg/versia/crypto"
versiautils "github.com/versia-pub/versia-go/pkg/versia/utils"
2024-08-11 03:51:22 +02:00
"net/url"
2024-08-28 00:25:25 +02:00
"github.com/versia-pub/versia-go/ent"
"github.com/versia-pub/versia-go/internal/utils"
2024-08-11 03:51:22 +02:00
)
type User struct {
*ent.User
2024-08-22 23:03:38 +02:00
URI *versiautils.URL
PKActorURI *versiautils.URL
PublicKey *versiacrypto.SPKIPublicKey
Inbox *versiautils.URL
Outbox *versiautils.URL
Featured *versiautils.URL
Followers *versiautils.URL
Following *versiautils.URL
2024-08-11 03:51:22 +02:00
DisplayName string
2024-08-28 00:25:25 +02:00
Avatar versiautils.ImageContentMap
Biography versiautils.TextContentTypeMap
Signer versiacrypto.Signer
2024-08-11 03:51:22 +02:00
}
2024-08-20 22:43:26 +02:00
func NewUser(dbData *ent.User) (*User, error) {
u := &User{
User: dbData,
2024-08-22 23:03:38 +02:00
PublicKey: &versiacrypto.SPKIPublicKey{
2024-08-20 22:43:26 +02:00
Key: nil,
Algorithm: dbData.PublicKeyAlgorithm,
},
DisplayName: dbData.Username,
Avatar: userAvatar(dbData),
Biography: userBiography(dbData),
2024-08-20 22:43:26 +02:00
}
2024-08-11 03:51:22 +02:00
2024-08-20 22:43:26 +02:00
if dbData.DisplayName != nil {
u.DisplayName = *dbData.DisplayName
2024-08-11 03:51:22 +02:00
}
var err error
2024-08-20 22:43:26 +02:00
if u.PublicKey.Key, err = versiacrypto.ToTypedKey(dbData.PublicKeyAlgorithm, dbData.PublicKey); err != nil {
2024-08-11 03:51:22 +02:00
return nil, err
}
2024-08-20 22:43:26 +02:00
2024-08-22 23:03:38 +02:00
if u.URI, err = versiautils.ParseURL(dbData.URI); err != nil {
2024-08-11 03:51:22 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
if u.PKActorURI, err = versiautils.ParseURL(dbData.PublicKeyActor); err != nil {
2024-08-11 03:51:22 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
if u.Inbox, err = versiautils.ParseURL(dbData.Inbox); err != nil {
2024-08-11 03:51:22 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
if u.Outbox, err = versiautils.ParseURL(dbData.Outbox); err != nil {
2024-08-11 03:51:22 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
if u.Featured, err = versiautils.ParseURL(dbData.Featured); err != nil {
2024-08-20 22:43:26 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
if u.Followers, err = versiautils.ParseURL(dbData.Followers); err != nil {
2024-08-20 22:43:26 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
if u.Following, err = versiautils.ParseURL(dbData.Following); err != nil {
2024-08-11 03:51:22 +02:00
return nil, err
}
2024-08-22 23:03:38 +02:00
u.Signer = versiacrypto.Signer{
2024-08-20 22:43:26 +02:00
PrivateKey: dbData.PrivateKey,
2024-08-11 03:51:22 +02:00
UserURL: u.URI.ToStd(),
}
return u, nil
}
func (u User) ToVersia() *versia.User {
2024-08-22 23:03:38 +02:00
return &versia.User{
Entity: versia.Entity{
2024-08-11 03:51:22 +02:00
ID: u.ID,
URI: u.URI,
2024-08-22 23:03:38 +02:00
CreatedAt: versiautils.Time(u.CreatedAt),
2024-08-11 03:51:22 +02:00
Extensions: u.Extensions,
},
DisplayName: helpers.StringPtr(u.DisplayName),
Username: u.Username,
Avatar: u.Avatar,
2024-08-11 03:51:22 +02:00
Header: imageMap(u.Edges.HeaderImage),
2024-08-28 00:25:25 +02:00
Indexable: helpers.BoolPtr(u.Indexable),
2024-08-22 23:03:38 +02:00
PublicKey: versia.UserPublicKey{
2024-08-20 22:43:26 +02:00
Actor: u.PKActorURI,
Algorithm: u.PublicKeyAlgorithm,
Key: u.PublicKey,
2024-08-11 03:51:22 +02:00
},
Bio: u.Biography,
2024-08-11 03:51:22 +02:00
Fields: u.Fields,
Inbox: u.Inbox,
Collections: versia.UserCollections{
versia.UserCollectionOutbox: u.Outbox,
versia.UserCollectionFeatured: u.Featured,
versia.UserCollectionFollowing: u.Following,
versia.UserCollectionFollowers: u.Followers,
},
2024-08-11 03:51:22 +02:00
}
}
2024-08-28 00:25:25 +02:00
func userAvatar(u *ent.User) versiautils.ImageContentMap {
2024-08-11 03:51:22 +02:00
if avatar := imageMap(u.Edges.AvatarImage); avatar != nil {
return avatar
}
2024-08-28 00:25:25 +02:00
return versiautils.ImageContentMap{
"image/svg+xml": versiautils.File{
2024-08-11 03:51:22 +02:00
Content: utils.DefaultAvatarURL(u.ID),
Remote: true,
2024-08-11 03:51:22 +02:00
},
}
}
func userBiography(u *ent.User) versiautils.TextContentTypeMap {
2024-08-11 03:51:22 +02:00
if u.Biography == nil {
return nil
}
// TODO: Render HTML
2024-08-22 23:03:38 +02:00
return versiautils.TextContentTypeMap{
"text/html": versiautils.TextContent{
2024-08-11 03:51:22 +02:00
Content: *u.Biography,
Remote: false,
2024-08-11 03:51:22 +02:00
},
}
}
2024-08-28 00:25:25 +02:00
func imageMap(i *ent.Image) versiautils.ImageContentMap {
2024-08-11 03:51:22 +02:00
if i == nil {
return nil
}
u, err := url.Parse(i.URL)
if err != nil {
return nil
}
2024-08-28 00:25:25 +02:00
return versiautils.ImageContentMap{
2024-08-11 03:51:22 +02:00
i.MimeType: {
Content: versiautils.URLFromStd(u),
Remote: true,
2024-08-11 03:51:22 +02:00
},
}
}