chore: implement instance metadata import

This commit is contained in:
DevMiner 2024-09-22 01:08:21 +02:00
parent 5f9b611921
commit 95cff10def
13 changed files with 173 additions and 20 deletions

View file

@ -10,6 +10,8 @@ import (
type InstanceMetadata struct {
*ent.InstanceMetadata
URI *versiautils.URL
Moderators []User
ModeratorsCollection *versiautils.URL
@ -35,9 +37,14 @@ func NewInstanceMetadata(dbData *ent.InstanceMetadata) (*InstanceMetadata, error
return nil, err
}
if n.SharedInbox, err = versiautils.ParseURL(dbData.SharedInboxURI); err != nil {
if n.URI, err = versiautils.ParseURL(dbData.URI); err != nil {
return nil, err
}
if dbData.SharedInboxURI != nil {
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

View file

@ -4,6 +4,7 @@ import (
"context"
"git.devminer.xyz/devminer/unitel"
"github.com/go-logr/logr"
"github.com/ldez/mimetype"
"github.com/versia-pub/versia-go/ent"
"github.com/versia-pub/versia-go/ent/instancemetadata"
"github.com/versia-pub/versia-go/internal/entity"
@ -50,14 +51,76 @@ func (i *InstanceMetadataRepositoryImpl) GetByHost(ctx context.Context, host str
return entity.NewInstanceMetadata(m)
}
func (i *InstanceMetadataRepositoryImpl) ImportFromVersiaByURI(ctx context.Context, uri *versiautils.URL) (*entity.InstanceMetadata, error) {
s := i.telemetry.StartSpan(ctx, "function", "repo_impls/InstanceMetadataRepositoryImpl.ImportFromVersiaByURI").
AddAttribute("uri", uri.String())
func (i *InstanceMetadataRepositoryImpl) Resolve(ctx context.Context, host string) (*entity.InstanceMetadata, error) {
s := i.telemetry.StartSpan(ctx, "function", "repo_impls/InstanceMetadataRepositoryImpl.Resolve").
AddAttribute("host", host)
defer s.End()
ctx = s.Context()
// TODO: implement storing the instance metadata
//i.federationService.
metadata, err := i.federationService.DiscoverInstance(ctx, host)
if err != nil {
return nil, err
}
logoURL, logoType := preferredImage(metadata.Logo)
bannerURL, bannerType := preferredImage(metadata.Banner)
meta, err := i.db.InstanceMetadata.Create().
SetName(metadata.Name).
SetNillableDescription(metadata.Description).
SetHost(metadata.Host).
SetPublicKey(metadata.PublicKey.Key.ToKey().([]byte)).
SetPublicKeyAlgorithm(metadata.PublicKey.Key.Algorithm).
SetSoftwareName(metadata.Software.Name).
SetSoftwareVersion(metadata.Software.Version).
SetNillableSharedInboxURI(urlToStrPtr(metadata.SharedInbox)).
SetNillableModeratorsURI(urlToStrPtr(metadata.Moderators)).
SetNillableAdminsURI(urlToStrPtr(metadata.Admins)).
SetNillableLogoEndpoint(logoURL).
SetNillableLogoMimeType(logoType).
SetNillableBannerEndpoint(bannerURL).
SetNillableBannerMimeType(bannerType).
SetSupportedVersions(metadata.Compatibility.Versions).
SetSupportedExtensions(metadata.Compatibility.Extensions).
Save(ctx)
if err != nil {
return nil, err
}
return entity.NewInstanceMetadata(meta)
}
func urlToStrPtr(u *versiautils.URL) *string {
if u == nil {
return nil
}
v := u.String()
return &v
}
var preferredImageMIMETypes = []string{
mimetype.ImageWebp,
mimetype.ImageJxl,
mimetype.ImagePng,
mimetype.ImageJpeg,
mimetype.ImageGif,
mimetype.ImageBmp,
}
func preferredImage(i *versiautils.ImageContentMap) (*string, *string) {
if i == nil {
return nil, nil
}
m := i.Map()
for _, type_ := range preferredImageMIMETypes {
if v, ok := m[type_]; !ok {
return urlToStrPtr(v.Content), &type_
}
}
return nil, nil
}

View file

@ -46,7 +46,8 @@ type NoteRepository interface {
type InstanceMetadataRepository interface {
GetByHost(ctx context.Context, host string) (*entity.InstanceMetadata, error)
ImportFromVersiaByURI(ctx context.Context, uri *versiautils.URL) (*entity.InstanceMetadata, error)
Resolve(ctx context.Context, host string) (*entity.InstanceMetadata, error)
}
type Manager interface {