versia-go/internal/entity/server_metadata.go
2024-08-28 01:10:38 +02:00

99 lines
2.3 KiB
Go

package entity
import (
"github.com/lysand-org/versia-go/ent"
"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"
)
type InstanceMetadata struct {
*ent.InstanceMetadata
Moderators []User
ModeratorsCollection *versiautils.URL
Admins []User
AdminsCollection *versiautils.URL
SharedInbox *versiautils.URL
PublicKey *versiacrypto.SPKIPublicKey
Logo *versiautils.ImageContentTypeMap
Banner *versiautils.ImageContentTypeMap
}
func NewInstanceMetadata(dbData *ent.InstanceMetadata) (*InstanceMetadata, error) {
n := &InstanceMetadata{
InstanceMetadata: dbData,
PublicKey: &versiacrypto.SPKIPublicKey{},
}
var err error
if n.PublicKey.Key, err = versiacrypto.ToTypedKey(dbData.PublicKeyAlgorithm, dbData.PublicKey); err != nil {
return nil, err
}
if n.SharedInbox, err = versiautils.ParseURL(dbData.SharedInboxURI); err != nil {
return nil, err
}
if dbData.ModeratorsURI != nil {
if n.ModeratorsCollection, err = versiautils.ParseURL(*dbData.ModeratorsURI); err != nil {
return nil, err
}
}
if dbData.AdminsURI != nil {
if n.AdminsCollection, err = versiautils.ParseURL(*dbData.AdminsURI); err != nil {
return nil, err
}
}
for _, r := range dbData.Edges.Moderators {
u, err := NewUser(r)
if err != nil {
return nil, err
}
n.Moderators = append(n.Moderators, *u)
}
for _, r := range dbData.Edges.Admins {
u, err := NewUser(r)
if err != nil {
return nil, err
}
n.Admins = append(n.Admins, *u)
}
return n, nil
}
func (m InstanceMetadata) ToVersia() versia.InstanceMetadata {
return versia.InstanceMetadata{
CreatedAt: versiautils.TimeFromStd(m.CreatedAt),
Extensions: m.Extensions,
Name: m.Name,
Description: m.Description,
Host: m.Host,
SharedInbox: m.SharedInbox,
Moderators: m.ModeratorsCollection,
Admins: m.AdminsCollection,
Logo: m.Logo,
Banner: m.Banner,
PublicKey: versia.InstancePublicKey{
Algorithm: m.PublicKeyAlgorithm,
Key: m.PublicKey,
},
Software: versia.InstanceSoftware{
Name: m.SoftwareName,
Version: m.SoftwareVersion,
},
Compatibility: versia.InstanceCompatibility{
Versions: m.SupportedVersions,
Extensions: m.SupportedExtensions,
},
}
}