mirror of
https://github.com/versia-pub/versia-go.git
synced 2025-12-06 14:28:20 +01:00
114 lines
3.3 KiB
Go
114 lines
3.3 KiB
Go
package versia
|
|
|
|
import (
|
|
"encoding/json"
|
|
versiacrypto "github.com/lysand-org/versia-go/pkg/versia/crypto"
|
|
versiautils "github.com/lysand-org/versia-go/pkg/versia/utils"
|
|
)
|
|
|
|
// InstanceMetadata represents the metadata of a Lysand instance. For more information, see the [Spec].
|
|
//
|
|
// ! Unlike other entities, instance metadata is not meant to be federated.
|
|
//
|
|
// [Spec]: https://versia.pub/entities/instance-metadata
|
|
type InstanceMetadata struct {
|
|
// Type is always "InstanceMetadata"
|
|
Type string `json:"type"`
|
|
|
|
// Extensions is a map of active extensions
|
|
Extensions Extensions `json:"extensions,omitempty"`
|
|
|
|
// Name is the name of the instance
|
|
Name string `json:"name"`
|
|
|
|
// Description is a description of the instance
|
|
Description *string `json:"description,omitempty"`
|
|
|
|
// Host is the hostname of the instance, including the port
|
|
Host string `json:"host,omitempty"`
|
|
|
|
// PublicKey is the public key of the instance
|
|
PublicKey InstancePublicKey `json:"public_key"`
|
|
|
|
// SharedInbox is the URL to the instance's shared inbox
|
|
SharedInbox *versiautils.URL `json:"shared_inbox,omitempty"`
|
|
|
|
// Moderators is a URL to a collection of moderators
|
|
Moderators *versiautils.URL `json:"moderators,omitempty"`
|
|
|
|
// Admins is a URL to a collection of administrators
|
|
Admins *versiautils.URL `json:"admins,omitempty"`
|
|
|
|
// Logo is the URL to the instance's logo
|
|
Logo *versiautils.ImageContentTypeMap `json:"logo,omitempty"`
|
|
|
|
// Banner is the URL to the instance's banner
|
|
Banner *versiautils.ImageContentTypeMap `json:"banner,omitempty"`
|
|
|
|
// Software is information about the instance software
|
|
Software InstanceSoftware `json:"software"`
|
|
|
|
// Compatibility is information about the instance's compatibility with different Lysand versions
|
|
Compatibility InstanceCompatibility `json:"compatibility"`
|
|
}
|
|
|
|
func (s InstanceMetadata) MarshalJSON() ([]byte, error) {
|
|
type instanceMetadata InstanceMetadata
|
|
s2 := instanceMetadata(s)
|
|
s2.Type = "InstanceMetadata"
|
|
return json.Marshal(s2)
|
|
}
|
|
|
|
// InstanceSoftware represents the software of a Lysand instance.
|
|
type InstanceSoftware struct {
|
|
// Name is the name of the instance software
|
|
Name string `json:"name"`
|
|
// Version is the version of the instance software
|
|
Version string `json:"version"`
|
|
}
|
|
|
|
// InstanceCompatibility represents the compatibility of a Lysand instance.
|
|
type InstanceCompatibility struct {
|
|
// Versions is a list of versions of Lysand the instance is compatible with
|
|
Versions []string `json:"versions"`
|
|
|
|
// Extensions is a list of extensions supported by the instance
|
|
Extensions []string `json:"extensions"`
|
|
}
|
|
|
|
// InstancePublicKey represents the public key of a Versia instance.
|
|
type InstancePublicKey struct {
|
|
// Algorithm can only be `ed25519` for now
|
|
Algorithm string `json:"algorithm"`
|
|
|
|
Key *versiacrypto.SPKIPublicKey `json:"-"`
|
|
RawKey json.RawMessage `json:"key"`
|
|
}
|
|
|
|
func (k *InstancePublicKey) UnmarshalJSON(raw []byte) error {
|
|
type t InstancePublicKey
|
|
k2 := (*t)(k)
|
|
if err := json.Unmarshal(raw, k2); err != nil {
|
|
return nil
|
|
}
|
|
|
|
var err error
|
|
if k2.Key, err = versiacrypto.UnmarshalSPKIPubKey(k2.Algorithm, k2.RawKey); err != nil {
|
|
return nil
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (k InstancePublicKey) MarshalJSON() ([]byte, error) {
|
|
type t InstancePublicKey
|
|
k2 := t(k)
|
|
|
|
var err error
|
|
if k2.RawKey, err = k2.Key.MarshalJSON(); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return json.Marshal(k2)
|
|
}
|