2024-08-11 03:51:22 +02:00
|
|
|
package entity
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/helpers"
|
2024-08-22 23:03:38 +02:00
|
|
|
"github.com/lysand-org/versia-go/pkg/versia"
|
|
|
|
|
versiacrypto "github.com/lysand-org/versia-go/pkg/versia/crypto"
|
|
|
|
|
versiautils "github.com/lysand-org/versia-go/pkg/versia/utils"
|
2024-08-11 03:51:22 +02:00
|
|
|
"net/url"
|
|
|
|
|
|
|
|
|
|
"github.com/lysand-org/versia-go/ent"
|
|
|
|
|
"github.com/lysand-org/versia-go/internal/utils"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
2024-08-27 19:59:12 +02:00
|
|
|
DisplayName string
|
|
|
|
|
Avatar versiautils.ImageContentTypeMap
|
|
|
|
|
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,
|
|
|
|
|
|
2024-08-27 19:59:12 +02:00
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-27 19:59:12 +02:00
|
|
|
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,
|
2024-08-27 19:59:12 +02:00
|
|
|
Avatar: u.Avatar,
|
2024-08-11 03:51:22 +02:00
|
|
|
Header: imageMap(u.Edges.HeaderImage),
|
|
|
|
|
Indexable: 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
|
|
|
},
|
2024-08-27 19:59:12 +02:00
|
|
|
Bio: u.Biography,
|
2024-08-11 03:51:22 +02:00
|
|
|
Fields: u.Fields,
|
|
|
|
|
|
2024-08-27 21:50:58 +02:00
|
|
|
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-27 19:59:12 +02:00
|
|
|
func userAvatar(u *ent.User) versiautils.ImageContentTypeMap {
|
2024-08-11 03:51:22 +02:00
|
|
|
if avatar := imageMap(u.Edges.AvatarImage); avatar != nil {
|
|
|
|
|
return avatar
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-22 23:03:38 +02:00
|
|
|
return versiautils.ImageContentTypeMap{
|
|
|
|
|
"image/svg+xml": versiautils.ImageContent{
|
2024-08-11 03:51:22 +02:00
|
|
|
Content: utils.DefaultAvatarURL(u.ID),
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-27 19:59:12 +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,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2024-08-22 23:03:38 +02:00
|
|
|
func imageMap(i *ent.Image) versiautils.ImageContentTypeMap {
|
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-22 23:03:38 +02:00
|
|
|
return versiautils.ImageContentTypeMap{
|
2024-08-11 03:51:22 +02:00
|
|
|
i.MimeType: {
|
2024-08-22 23:03:38 +02:00
|
|
|
Content: (*versiautils.URL)(u),
|
2024-08-11 03:51:22 +02:00
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
}
|