Add func to add ap links to local users (untested)
All checks were successful
/ docker (push) Successful in 4m27s
All checks were successful
/ docker (push) Successful in 4m27s
This commit is contained in:
parent
e69f53bbd7
commit
f991a1f353
7 changed files with 84 additions and 22 deletions
|
@ -1,6 +1,11 @@
|
||||||
package activitypub
|
package activitypub
|
||||||
|
|
||||||
import "strings"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.mstar.dev/mstar/linstrom/config"
|
||||||
|
)
|
||||||
|
|
||||||
type InvalidFullHandleError struct {
|
type InvalidFullHandleError struct {
|
||||||
Raw string
|
Raw string
|
||||||
|
@ -17,3 +22,11 @@ func SplitFullHandle(full string) (string, string, error) {
|
||||||
}
|
}
|
||||||
return splits[0], splits[1], nil
|
return splits[0], splits[1], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func UserIdToApUrl(id string) string {
|
||||||
|
return fmt.Sprintf(
|
||||||
|
"%s/api/activitypub/user/%s",
|
||||||
|
config.GlobalConfig.General.GetFullPublicUrl(),
|
||||||
|
id,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
55
storage-new/genLinksForUser.go
Normal file
55
storage-new/genLinksForUser.go
Normal file
|
@ -0,0 +1,55 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"git.mstar.dev/mstar/goutils/other"
|
||||||
|
"gorm.io/gorm"
|
||||||
|
|
||||||
|
"git.mstar.dev/mstar/linstrom/activitypub"
|
||||||
|
"git.mstar.dev/mstar/linstrom/config"
|
||||||
|
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
||||||
|
"git.mstar.dev/mstar/linstrom/storage-new/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
func EnsureLocalUserIdHasLinks(id string) error {
|
||||||
|
if strings.HasPrefix(id, "http") {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
u := dbgen.User
|
||||||
|
user, err := u.Where(u.ID.Eq(id)).Preload(u.RemoteInfo).First()
|
||||||
|
switch err {
|
||||||
|
case gorm.ErrRecordNotFound:
|
||||||
|
return nil
|
||||||
|
case nil:
|
||||||
|
default:
|
||||||
|
return other.Error("storage", "Failed to get user by id", err)
|
||||||
|
}
|
||||||
|
if user.RemoteInfo != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
apId := activitypub.UserIdToApUrl(id)
|
||||||
|
info := models.UserRemoteLinks{
|
||||||
|
UserId: id,
|
||||||
|
ApLink: apId,
|
||||||
|
InboxLink: apId + "/inbox",
|
||||||
|
ViewLink: sql.NullString{
|
||||||
|
Valid: true,
|
||||||
|
String: config.GlobalConfig.General.GetFullPublicUrl() + "/user/" + user.Username,
|
||||||
|
},
|
||||||
|
FollowersLink: sql.NullString{
|
||||||
|
Valid: true,
|
||||||
|
String: apId + "/followers",
|
||||||
|
},
|
||||||
|
FollowingLink: sql.NullString{
|
||||||
|
Valid: true,
|
||||||
|
String: apId + "/following",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
err = dbgen.UserRemoteLinks.Create(&info)
|
||||||
|
if err != nil {
|
||||||
|
return other.Error("storage", "Failed to store links for account", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
|
@ -33,6 +33,9 @@ func InsertSelf() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return other.Error("storage", "failed to save/update self user", err)
|
return other.Error("storage", "failed to save/update self user", err)
|
||||||
}
|
}
|
||||||
|
if err = EnsureLocalUserIdHasLinks(user.ID); err != nil {
|
||||||
|
return other.Error("storage", "failed to create ap links for self", err)
|
||||||
|
}
|
||||||
ServerActorId = user.ID
|
ServerActorId = user.ID
|
||||||
if err = insertUserPronoun(user); err != nil {
|
if err = insertUserPronoun(user); err != nil {
|
||||||
return other.Error("storage", "failed to save/update self user pronoun", err)
|
return other.Error("storage", "failed to save/update self user pronoun", err)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
|
|
||||||
"git.mstar.dev/mstar/linstrom/activitypub"
|
"git.mstar.dev/mstar/linstrom/activitypub"
|
||||||
"git.mstar.dev/mstar/linstrom/shared"
|
"git.mstar.dev/mstar/linstrom/shared"
|
||||||
|
"git.mstar.dev/mstar/linstrom/storage-new"
|
||||||
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
||||||
"git.mstar.dev/mstar/linstrom/storage-new/models"
|
"git.mstar.dev/mstar/linstrom/storage-new/models"
|
||||||
webshared "git.mstar.dev/mstar/linstrom/web/shared"
|
webshared "git.mstar.dev/mstar/linstrom/web/shared"
|
||||||
|
@ -175,6 +176,10 @@ func createLocalUser(w http.ResponseWriter, r *http.Request) {
|
||||||
log.Error().Err(err).Msg("failed to create new local user")
|
log.Error().Err(err).Msg("failed to create new local user")
|
||||||
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
|
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
|
||||||
}
|
}
|
||||||
|
if err = storage.EnsureLocalUserIdHasLinks(user.ID); err != nil {
|
||||||
|
log.Error().Err(err).Msg("Failed to add links to new user")
|
||||||
|
webutils.ProblemDetailsStatusOnly(w, http.StatusInternalServerError)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteUser(w http.ResponseWriter, r *http.Request) {
|
func deleteUser(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
|
@ -84,12 +84,12 @@ func FollowFromStorage(ctx context.Context, id string) (*ActivityFollowOut, erro
|
||||||
if follower.RemoteInfo != nil {
|
if follower.RemoteInfo != nil {
|
||||||
out.Actor = follower.RemoteInfo.ApLink
|
out.Actor = follower.RemoteInfo.ApLink
|
||||||
} else {
|
} else {
|
||||||
out.Actor = userIdToApUrl(follower.ID)
|
out.Actor = activitypub.UserIdToApUrl(follower.ID)
|
||||||
}
|
}
|
||||||
if followed.RemoteInfo != nil {
|
if followed.RemoteInfo != nil {
|
||||||
out.Object = followed.RemoteInfo.ApLink
|
out.Object = followed.RemoteInfo.ApLink
|
||||||
} else {
|
} else {
|
||||||
out.Object = userIdToApUrl(followed.ID)
|
out.Object = activitypub.UserIdToApUrl(followed.ID)
|
||||||
}
|
}
|
||||||
return &out, nil
|
return &out, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ func users(w http.ResponseWriter, r *http.Request) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
apUrl := userIdToApUrl(user.ID)
|
apUrl := activitypub.UserIdToApUrl(user.ID)
|
||||||
var keyBytes string
|
var keyBytes string
|
||||||
if config.GlobalConfig.Experimental.UseEd25519Keys {
|
if config.GlobalConfig.Experimental.UseEd25519Keys {
|
||||||
keyBytes = shared.KeyBytesToPem(user.PublicKeyEd, true)
|
keyBytes = shared.KeyBytesToPem(user.PublicKeyEd, true)
|
||||||
|
@ -160,7 +160,7 @@ func userFollowing(w http.ResponseWriter, r *http.Request) {
|
||||||
webutils.ProblemDetailsStatusOnly(w, http.StatusNotFound)
|
webutils.ProblemDetailsStatusOnly(w, http.StatusNotFound)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
apUrl := userIdToApUrl(userId)
|
apUrl := activitypub.UserIdToApUrl(userId)
|
||||||
var data []byte
|
var data []byte
|
||||||
followingCount, err := dbgen.UserToUserRelation.CountFollowingForId(userId)
|
followingCount, err := dbgen.UserToUserRelation.CountFollowingForId(userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -212,7 +212,7 @@ func userFollowing(w http.ResponseWriter, r *http.Request) {
|
||||||
Context: "https://www.w3.org/ns/activitystreams",
|
Context: "https://www.w3.org/ns/activitystreams",
|
||||||
Type: "OrderedCollectionPage",
|
Type: "OrderedCollectionPage",
|
||||||
Id: fmt.Sprintf("%s/following?page=%d", apUrl, pageNr),
|
Id: fmt.Sprintf("%s/following?page=%d", apUrl, pageNr),
|
||||||
PartOf: userIdToApUrl(userId) + "/following",
|
PartOf: activitypub.UserIdToApUrl(userId) + "/following",
|
||||||
Items: sliceutils.Map(links, func(t string) any { return t }),
|
Items: sliceutils.Map(links, func(t string) any { return t }),
|
||||||
}
|
}
|
||||||
if hasNextPage {
|
if hasNextPage {
|
||||||
|
@ -247,7 +247,7 @@ func userFollowers(w http.ResponseWriter, r *http.Request) {
|
||||||
webutils.ProblemDetailsStatusOnly(w, http.StatusNotFound)
|
webutils.ProblemDetailsStatusOnly(w, http.StatusNotFound)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
apUrl := userIdToApUrl(userId)
|
apUrl := activitypub.UserIdToApUrl(userId)
|
||||||
var data []byte
|
var data []byte
|
||||||
followersCount, err := dbgen.UserToUserRelation.CountFollowersForId(userId)
|
followersCount, err := dbgen.UserToUserRelation.CountFollowersForId(userId)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -300,7 +300,7 @@ func userFollowers(w http.ResponseWriter, r *http.Request) {
|
||||||
Context: activitypub.BaseLdContext,
|
Context: activitypub.BaseLdContext,
|
||||||
Type: "OrderedCollectionPage",
|
Type: "OrderedCollectionPage",
|
||||||
Id: fmt.Sprintf("%s/followers?page=%d", apUrl, pageNr),
|
Id: fmt.Sprintf("%s/followers?page=%d", apUrl, pageNr),
|
||||||
PartOf: userIdToApUrl(userId) + "/followers",
|
PartOf: activitypub.UserIdToApUrl(userId) + "/followers",
|
||||||
Items: sliceutils.Map(links, func(t string) any { return t }),
|
Items: sliceutils.Map(links, func(t string) any { return t }),
|
||||||
}
|
}
|
||||||
if hasNextPage {
|
if hasNextPage {
|
||||||
|
|
|
@ -1,15 +1 @@
|
||||||
package activitypub
|
package activitypub
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"git.mstar.dev/mstar/linstrom/config"
|
|
||||||
)
|
|
||||||
|
|
||||||
func userIdToApUrl(id string) string {
|
|
||||||
return fmt.Sprintf(
|
|
||||||
"%s/api/activitypub/user/%s",
|
|
||||||
config.GlobalConfig.General.GetFullPublicUrl(),
|
|
||||||
id,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in a new issue