mirror of
https://github.com/versia-pub/versia-go.git
synced 2025-12-06 06:28:18 +01:00
chore: implement instance metadata import
This commit is contained in:
parent
5f9b611921
commit
95cff10def
|
|
@ -47,7 +47,7 @@ type InstanceMetadata struct {
|
|||
// SoftwareVersion holds the value of the "softwareVersion" field.
|
||||
SoftwareVersion string `json:"softwareVersion,omitempty"`
|
||||
// SharedInboxURI holds the value of the "sharedInboxURI" field.
|
||||
SharedInboxURI string `json:"sharedInboxURI,omitempty"`
|
||||
SharedInboxURI *string `json:"sharedInboxURI,omitempty"`
|
||||
// ModeratorsURI holds the value of the "moderatorsURI" field.
|
||||
ModeratorsURI *string `json:"moderatorsURI,omitempty"`
|
||||
// AdminsURI holds the value of the "adminsURI" field.
|
||||
|
|
@ -231,7 +231,8 @@ func (im *InstanceMetadata) assignValues(columns []string, values []any) error {
|
|||
if value, ok := values[i].(*sql.NullString); !ok {
|
||||
return fmt.Errorf("unexpected type %T for field sharedInboxURI", values[i])
|
||||
} else if value.Valid {
|
||||
im.SharedInboxURI = value.String
|
||||
im.SharedInboxURI = new(string)
|
||||
*im.SharedInboxURI = value.String
|
||||
}
|
||||
case instancemetadata.FieldModeratorsURI:
|
||||
if value, ok := values[i].(*sql.NullString); !ok {
|
||||
|
|
@ -383,8 +384,10 @@ func (im *InstanceMetadata) String() string {
|
|||
builder.WriteString("softwareVersion=")
|
||||
builder.WriteString(im.SoftwareVersion)
|
||||
builder.WriteString(", ")
|
||||
if v := im.SharedInboxURI; v != nil {
|
||||
builder.WriteString("sharedInboxURI=")
|
||||
builder.WriteString(im.SharedInboxURI)
|
||||
builder.WriteString(*v)
|
||||
}
|
||||
builder.WriteString(", ")
|
||||
if v := im.ModeratorsURI; v != nil {
|
||||
builder.WriteString("moderatorsURI=")
|
||||
|
|
|
|||
|
|
@ -851,6 +851,16 @@ func SharedInboxURIHasSuffix(v string) predicate.InstanceMetadata {
|
|||
return predicate.InstanceMetadata(sql.FieldHasSuffix(FieldSharedInboxURI, v))
|
||||
}
|
||||
|
||||
// SharedInboxURIIsNil applies the IsNil predicate on the "sharedInboxURI" field.
|
||||
func SharedInboxURIIsNil() predicate.InstanceMetadata {
|
||||
return predicate.InstanceMetadata(sql.FieldIsNull(FieldSharedInboxURI))
|
||||
}
|
||||
|
||||
// SharedInboxURINotNil applies the NotNil predicate on the "sharedInboxURI" field.
|
||||
func SharedInboxURINotNil() predicate.InstanceMetadata {
|
||||
return predicate.InstanceMetadata(sql.FieldNotNull(FieldSharedInboxURI))
|
||||
}
|
||||
|
||||
// SharedInboxURIEqualFold applies the EqualFold predicate on the "sharedInboxURI" field.
|
||||
func SharedInboxURIEqualFold(v string) predicate.InstanceMetadata {
|
||||
return predicate.InstanceMetadata(sql.FieldEqualFold(FieldSharedInboxURI, v))
|
||||
|
|
|
|||
|
|
@ -134,6 +134,14 @@ func (imc *InstanceMetadataCreate) SetSharedInboxURI(s string) *InstanceMetadata
|
|||
return imc
|
||||
}
|
||||
|
||||
// SetNillableSharedInboxURI sets the "sharedInboxURI" field if the given value is not nil.
|
||||
func (imc *InstanceMetadataCreate) SetNillableSharedInboxURI(s *string) *InstanceMetadataCreate {
|
||||
if s != nil {
|
||||
imc.SetSharedInboxURI(*s)
|
||||
}
|
||||
return imc
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
func (imc *InstanceMetadataCreate) SetModeratorsURI(s string) *InstanceMetadataCreate {
|
||||
imc.mutation.SetModeratorsURI(s)
|
||||
|
|
@ -410,9 +418,6 @@ func (imc *InstanceMetadataCreate) check() error {
|
|||
return &ValidationError{Name: "softwareVersion", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.softwareVersion": %w`, err)}
|
||||
}
|
||||
}
|
||||
if _, ok := imc.mutation.SharedInboxURI(); !ok {
|
||||
return &ValidationError{Name: "sharedInboxURI", err: errors.New(`ent: missing required field "InstanceMetadata.sharedInboxURI"`)}
|
||||
}
|
||||
if v, ok := imc.mutation.SharedInboxURI(); ok {
|
||||
if err := instancemetadata.SharedInboxURIValidator(v); err != nil {
|
||||
return &ValidationError{Name: "sharedInboxURI", err: fmt.Errorf(`ent: validator failed for field "InstanceMetadata.sharedInboxURI": %w`, err)}
|
||||
|
|
@ -544,7 +549,7 @@ func (imc *InstanceMetadataCreate) createSpec() (*InstanceMetadata, *sqlgraph.Cr
|
|||
}
|
||||
if value, ok := imc.mutation.SharedInboxURI(); ok {
|
||||
_spec.SetField(instancemetadata.FieldSharedInboxURI, field.TypeString, value)
|
||||
_node.SharedInboxURI = value
|
||||
_node.SharedInboxURI = &value
|
||||
}
|
||||
if value, ok := imc.mutation.ModeratorsURI(); ok {
|
||||
_spec.SetField(instancemetadata.FieldModeratorsURI, field.TypeString, value)
|
||||
|
|
@ -846,6 +851,12 @@ func (u *InstanceMetadataUpsert) UpdateSharedInboxURI() *InstanceMetadataUpsert
|
|||
return u
|
||||
}
|
||||
|
||||
// ClearSharedInboxURI clears the value of the "sharedInboxURI" field.
|
||||
func (u *InstanceMetadataUpsert) ClearSharedInboxURI() *InstanceMetadataUpsert {
|
||||
u.SetNull(instancemetadata.FieldSharedInboxURI)
|
||||
return u
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
func (u *InstanceMetadataUpsert) SetModeratorsURI(v string) *InstanceMetadataUpsert {
|
||||
u.Set(instancemetadata.FieldModeratorsURI, v)
|
||||
|
|
@ -1225,6 +1236,13 @@ func (u *InstanceMetadataUpsertOne) UpdateSharedInboxURI() *InstanceMetadataUpse
|
|||
})
|
||||
}
|
||||
|
||||
// ClearSharedInboxURI clears the value of the "sharedInboxURI" field.
|
||||
func (u *InstanceMetadataUpsertOne) ClearSharedInboxURI() *InstanceMetadataUpsertOne {
|
||||
return u.Update(func(s *InstanceMetadataUpsert) {
|
||||
s.ClearSharedInboxURI()
|
||||
})
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
func (u *InstanceMetadataUpsertOne) SetModeratorsURI(v string) *InstanceMetadataUpsertOne {
|
||||
return u.Update(func(s *InstanceMetadataUpsert) {
|
||||
|
|
@ -1793,6 +1811,13 @@ func (u *InstanceMetadataUpsertBulk) UpdateSharedInboxURI() *InstanceMetadataUps
|
|||
})
|
||||
}
|
||||
|
||||
// ClearSharedInboxURI clears the value of the "sharedInboxURI" field.
|
||||
func (u *InstanceMetadataUpsertBulk) ClearSharedInboxURI() *InstanceMetadataUpsertBulk {
|
||||
return u.Update(func(s *InstanceMetadataUpsert) {
|
||||
s.ClearSharedInboxURI()
|
||||
})
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
func (u *InstanceMetadataUpsertBulk) SetModeratorsURI(v string) *InstanceMetadataUpsertBulk {
|
||||
return u.Update(func(s *InstanceMetadataUpsert) {
|
||||
|
|
|
|||
|
|
@ -194,6 +194,12 @@ func (imu *InstanceMetadataUpdate) SetNillableSharedInboxURI(s *string) *Instanc
|
|||
return imu
|
||||
}
|
||||
|
||||
// ClearSharedInboxURI clears the value of the "sharedInboxURI" field.
|
||||
func (imu *InstanceMetadataUpdate) ClearSharedInboxURI() *InstanceMetadataUpdate {
|
||||
imu.mutation.ClearSharedInboxURI()
|
||||
return imu
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
func (imu *InstanceMetadataUpdate) SetModeratorsURI(s string) *InstanceMetadataUpdate {
|
||||
imu.mutation.SetModeratorsURI(s)
|
||||
|
|
@ -609,6 +615,9 @@ func (imu *InstanceMetadataUpdate) sqlSave(ctx context.Context) (n int, err erro
|
|||
if value, ok := imu.mutation.SharedInboxURI(); ok {
|
||||
_spec.SetField(instancemetadata.FieldSharedInboxURI, field.TypeString, value)
|
||||
}
|
||||
if imu.mutation.SharedInboxURICleared() {
|
||||
_spec.ClearField(instancemetadata.FieldSharedInboxURI, field.TypeString)
|
||||
}
|
||||
if value, ok := imu.mutation.ModeratorsURI(); ok {
|
||||
_spec.SetField(instancemetadata.FieldModeratorsURI, field.TypeString, value)
|
||||
}
|
||||
|
|
@ -978,6 +987,12 @@ func (imuo *InstanceMetadataUpdateOne) SetNillableSharedInboxURI(s *string) *Ins
|
|||
return imuo
|
||||
}
|
||||
|
||||
// ClearSharedInboxURI clears the value of the "sharedInboxURI" field.
|
||||
func (imuo *InstanceMetadataUpdateOne) ClearSharedInboxURI() *InstanceMetadataUpdateOne {
|
||||
imuo.mutation.ClearSharedInboxURI()
|
||||
return imuo
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
func (imuo *InstanceMetadataUpdateOne) SetModeratorsURI(s string) *InstanceMetadataUpdateOne {
|
||||
imuo.mutation.SetModeratorsURI(s)
|
||||
|
|
@ -1423,6 +1438,9 @@ func (imuo *InstanceMetadataUpdateOne) sqlSave(ctx context.Context) (_node *Inst
|
|||
if value, ok := imuo.mutation.SharedInboxURI(); ok {
|
||||
_spec.SetField(instancemetadata.FieldSharedInboxURI, field.TypeString, value)
|
||||
}
|
||||
if imuo.mutation.SharedInboxURICleared() {
|
||||
_spec.ClearField(instancemetadata.FieldSharedInboxURI, field.TypeString)
|
||||
}
|
||||
if value, ok := imuo.mutation.ModeratorsURI(); ok {
|
||||
_spec.SetField(instancemetadata.FieldModeratorsURI, field.TypeString, value)
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -114,7 +114,7 @@ var (
|
|||
{Name: "private_key", Type: field.TypeBytes, Nullable: true},
|
||||
{Name: "software_name", Type: field.TypeString},
|
||||
{Name: "software_version", Type: field.TypeString},
|
||||
{Name: "shared_inbox_uri", Type: field.TypeString},
|
||||
{Name: "shared_inbox_uri", Type: field.TypeString, Nullable: true},
|
||||
{Name: "moderators_uri", Type: field.TypeString, Nullable: true},
|
||||
{Name: "admins_uri", Type: field.TypeString, Nullable: true},
|
||||
{Name: "logo_endpoint", Type: field.TypeString, Nullable: true},
|
||||
|
|
|
|||
|
|
@ -3071,7 +3071,7 @@ func (m *InstanceMetadataMutation) SharedInboxURI() (r string, exists bool) {
|
|||
// OldSharedInboxURI returns the old "sharedInboxURI" field's value of the InstanceMetadata entity.
|
||||
// If the InstanceMetadata object wasn't provided to the builder, the object is fetched from the database.
|
||||
// An error is returned if the mutation operation is not UpdateOne, or the database query fails.
|
||||
func (m *InstanceMetadataMutation) OldSharedInboxURI(ctx context.Context) (v string, err error) {
|
||||
func (m *InstanceMetadataMutation) OldSharedInboxURI(ctx context.Context) (v *string, err error) {
|
||||
if !m.op.Is(OpUpdateOne) {
|
||||
return v, errors.New("OldSharedInboxURI is only allowed on UpdateOne operations")
|
||||
}
|
||||
|
|
@ -3085,9 +3085,22 @@ func (m *InstanceMetadataMutation) OldSharedInboxURI(ctx context.Context) (v str
|
|||
return oldValue.SharedInboxURI, nil
|
||||
}
|
||||
|
||||
// ClearSharedInboxURI clears the value of the "sharedInboxURI" field.
|
||||
func (m *InstanceMetadataMutation) ClearSharedInboxURI() {
|
||||
m.sharedInboxURI = nil
|
||||
m.clearedFields[instancemetadata.FieldSharedInboxURI] = struct{}{}
|
||||
}
|
||||
|
||||
// SharedInboxURICleared returns if the "sharedInboxURI" field was cleared in this mutation.
|
||||
func (m *InstanceMetadataMutation) SharedInboxURICleared() bool {
|
||||
_, ok := m.clearedFields[instancemetadata.FieldSharedInboxURI]
|
||||
return ok
|
||||
}
|
||||
|
||||
// ResetSharedInboxURI resets all changes to the "sharedInboxURI" field.
|
||||
func (m *InstanceMetadataMutation) ResetSharedInboxURI() {
|
||||
m.sharedInboxURI = nil
|
||||
delete(m.clearedFields, instancemetadata.FieldSharedInboxURI)
|
||||
}
|
||||
|
||||
// SetModeratorsURI sets the "moderatorsURI" field.
|
||||
|
|
@ -4053,6 +4066,9 @@ func (m *InstanceMetadataMutation) ClearedFields() []string {
|
|||
if m.FieldCleared(instancemetadata.FieldPrivateKey) {
|
||||
fields = append(fields, instancemetadata.FieldPrivateKey)
|
||||
}
|
||||
if m.FieldCleared(instancemetadata.FieldSharedInboxURI) {
|
||||
fields = append(fields, instancemetadata.FieldSharedInboxURI)
|
||||
}
|
||||
if m.FieldCleared(instancemetadata.FieldModeratorsURI) {
|
||||
fields = append(fields, instancemetadata.FieldModeratorsURI)
|
||||
}
|
||||
|
|
@ -4091,6 +4107,9 @@ func (m *InstanceMetadataMutation) ClearField(name string) error {
|
|||
case instancemetadata.FieldPrivateKey:
|
||||
m.ClearPrivateKey()
|
||||
return nil
|
||||
case instancemetadata.FieldSharedInboxURI:
|
||||
m.ClearSharedInboxURI()
|
||||
return nil
|
||||
case instancemetadata.FieldModeratorsURI:
|
||||
m.ClearModeratorsURI()
|
||||
return nil
|
||||
|
|
|
|||
|
|
@ -25,7 +25,10 @@ func (InstanceMetadata) Fields() []ent.Field {
|
|||
field.String("softwareName").NotEmpty(),
|
||||
field.String("softwareVersion").NotEmpty(),
|
||||
|
||||
field.String("sharedInboxURI").Validate(ValidateURI),
|
||||
field.String("sharedInboxURI").
|
||||
Validate(ValidateURI).
|
||||
Optional().
|
||||
Nillable(),
|
||||
field.String("moderatorsURI").
|
||||
Validate(ValidateURI).
|
||||
Optional().
|
||||
|
|
|
|||
2
go.mod
2
go.mod
|
|
@ -14,6 +14,7 @@ require (
|
|||
github.com/google/uuid v1.6.0
|
||||
github.com/jackc/pgx/v5 v5.6.0
|
||||
github.com/joho/godotenv v1.5.1
|
||||
github.com/ldez/mimetype v0.3.0
|
||||
github.com/nats-io/nats.go v1.36.0
|
||||
github.com/pkg/errors v0.9.1
|
||||
github.com/rs/zerolog v1.33.0
|
||||
|
|
@ -43,7 +44,6 @@ require (
|
|||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||
github.com/jackc/puddle/v2 v2.2.1 // indirect
|
||||
github.com/klauspost/compress v1.17.9 // indirect
|
||||
github.com/ldez/mimetype v0.3.0 // indirect
|
||||
github.com/leodido/go-urn v1.4.0 // indirect
|
||||
github.com/mattn/go-colorable v0.1.13 // indirect
|
||||
github.com/mattn/go-isatty v0.0.20 // indirect
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -125,6 +125,10 @@ func (i ImageContentMap) String() string {
|
|||
return ""
|
||||
}
|
||||
|
||||
func (i ImageContentMap) Map() map[string]File {
|
||||
return i
|
||||
}
|
||||
|
||||
type NoteAttachmentContentMap ContentMap[File]
|
||||
|
||||
var ErrContentMapEntryNotRemote = errors.New("content map entry not remote")
|
||||
|
|
|
|||
Loading…
Reference in a new issue