diff --git a/go.mod b/go.mod index 2949a3c..e31745f 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,7 @@ go 1.23.0 toolchain go1.23.7 require ( - git.mstar.dev/mstar/goutils v1.12.2 + git.mstar.dev/mstar/goutils v1.12.3 github.com/BurntSushi/toml v1.4.0 github.com/dgraph-io/ristretto v0.2.0 github.com/eko/gocache/lib/v4 v4.1.6 diff --git a/go.sum b/go.sum index 7167398..076401e 100644 --- a/go.sum +++ b/go.sum @@ -63,6 +63,8 @@ git.mstar.dev/mstar/goutils v1.12.1 h1:HZKKzMNfx7JKSUi5s8SwwUFEqEX6xvkM6NMf+Pht+ git.mstar.dev/mstar/goutils v1.12.1/go.mod h1:juxY0eZEMnA95fedRp2LVXvUBgEjz66nE8SEdGKcxMA= git.mstar.dev/mstar/goutils v1.12.2 h1:twCnsl+WRgP52mV5D5FRVJK6Yst1/3VtulHd77U++BY= git.mstar.dev/mstar/goutils v1.12.2/go.mod h1:juxY0eZEMnA95fedRp2LVXvUBgEjz66nE8SEdGKcxMA= +git.mstar.dev/mstar/goutils v1.12.3 h1:Wx7i8/a99Cp+Y/XcXgqQr0r9cSsJu7QkWBlKyprTH44= +git.mstar.dev/mstar/goutils v1.12.3/go.mod h1:juxY0eZEMnA95fedRp2LVXvUBgEjz66nE8SEdGKcxMA= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= diff --git a/web/public/api/activitypub/user.go b/web/public/api/activitypub/user.go index f5f8689..5413233 100644 --- a/web/public/api/activitypub/user.go +++ b/web/public/api/activitypub/user.go @@ -8,17 +8,61 @@ import ( "time" webutils "git.mstar.dev/mstar/goutils/http" + "git.mstar.dev/mstar/goutils/other" + "git.mstar.dev/mstar/goutils/sliceutils" "github.com/rs/zerolog/hlog" "git.mstar.dev/mstar/linstrom/config" "git.mstar.dev/mstar/linstrom/storage-new" "git.mstar.dev/mstar/linstrom/storage-new/dbgen" + "git.mstar.dev/mstar/linstrom/storage-new/models" webshared "git.mstar.dev/mstar/linstrom/web/shared" ) var baseLdContext = []any{ "https://www.w3.org/ns/activitystreams", "https://w3id.org/security/v1", + map[string]any{ + "Key": "sec:Key", + "manuallyApprovesFollowers": "as:manuallyApprovesFollowers", + "sensitive": "as:sensitive", + "Hashtag": "as:Hashtag", + "quoteUrl": "as:quoteUrl", + "fedibird": "http://fedibird.com/ns#", + "quoteUri": "fedibird:quoteUri", + "toot": "http://joinmastodon.org/ns#", + "Emoji": "toot:Emoji", + "featured": "toot:featured", + "discoverable": "toot:discoverable", + "indexable": "toot:indexable", + "schema": "http://schema.org#", + "PropertyValue": "schema:PropertyValue", + "value": "schema:value", + "misskey": "https://misskey-hub.net/ns#", + "_misskey_content": "misskey:_misskey_content", + "_misskey_quote": "misskey:_misskey_quote", + "_misskey_reaction": "misskey:_misskey_reaction", + "_misskey_votes": "misskey:_misskey_votes", + "_misskey_summary": "misskey:_misskey_summary", + "_misskey_followedMessage": "misskey:_misskey_followedMessage", + "_misskey_requireSigninToViewContents": "misskey:_misskey_requireSigninToViewContents", + "_misskey_makeNotesFollowersOnlyBefore": "misskey:_misskey_makeNotesFollowersOnlyBefore", + "_misskey_makeNotesHiddenBefore": "misskey:_misskey_makeNotesHiddenBefore", + "_misskey_license": "misskey:_misskey_license", + "freeText": map[string]string{ + "@id": "misskey:freeText", + "@type": "schema:text", + }, + "isCat": "misskey:isCat", + "firefish": "https://joinfirefish.org/ns#", + "speakAsCat": "firefish:speakAsCat", + "sharkey": "https://joinsharkey.org/ns#", + "hideOnlineStatus": "sharkey:hideOnlineStatus", + "backgroundUrl": "sharkey:backgroundUrl", + "listenbrainz": "sharkey:listenbrainz", + "enableRss": "sharkey:enableRss", + "vcard": "http://www.w3.org/2006/vcard/ns#", + }, } func users(w http.ResponseWriter, r *http.Request) { @@ -45,11 +89,18 @@ func users(w http.ResponseWriter, r *http.Request) { PublicUrl string `json:"url"` Icon *OutboundMedia `json:"icon,omitempty"` Banner *OutboundMedia `json:"image,omitempty"` + Discoverable bool `json:"discoverable"` + Location *string `json:"vcard:Address,omitempty"` + Birthday *string `json:"vcard:bday,omitempty"` + SpeakAsCat bool `json:"speakAsCat"` + IsCat bool `json:"isCat"` + RestrictedFollow bool `json:"manuallyApprovesFollowers"` } log := hlog.FromRequest(r) userId := r.PathValue("id") user, err := dbgen.User.Where(dbgen.User.ID.Eq(userId)). Preload(dbgen.User.Icon).Preload(dbgen.User.Banner). + Preload(dbgen.User.BeingTypes). First() if err != nil { webutils.ProblemDetails(w, 500, "/errors/db-failure", "internal database failure", nil, nil) @@ -79,9 +130,11 @@ func users(w http.ResponseWriter, r *http.Request) { Owner: apUrl, Pem: keyBytes, }, - Published: user.CreatedAt, - DisplayName: user.DisplayName, - PublicUrl: config.GlobalConfig.General.GetFullPublicUrl() + "/user/" + user.Username, + Published: user.CreatedAt, + DisplayName: user.DisplayName, + PublicUrl: config.GlobalConfig.General.GetFullPublicUrl() + "/user/" + user.Username, + Discoverable: user.Indexable, + RestrictedFollow: user.RestrictedFollow, } if user.Description != "" { data.Description = &user.Description @@ -102,6 +155,18 @@ func users(w http.ResponseWriter, r *http.Request) { MediaType: user.Banner.Type, } } + if sliceutils.ContainsFunc(user.BeingTypes, func(t models.UserToBeing) bool { + return t.Being == models.BEING_CAT + }) { + data.IsCat = true + // data.SpeakAsCat = true // TODO: Move to check of separate field in db model + } + if user.Location.Valid { + data.Location = &user.Location.String + } + if user.Birthday.Valid { + data.Birthday = other.IntoPointer(user.Birthday.Time.Format("2006-Jan-02")) //YYYY-Month-DD + } encoded, err := json.Marshal(data) w.Header().Add("Content-Type", "application/activity+json")