mirror of
https://github.com/versia-pub/versia-go.git
synced 2026-03-13 04:29:15 +01:00
chore: implement instance metadata import
This commit is contained in:
parent
5f9b611921
commit
95cff10def
13 changed files with 173 additions and 20 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue