WIP: feat: get remote person's avatar and assign to user #9
1 changed files with 96 additions and 0 deletions
96
services/forgefed/actor.go
Normal file
96
services/forgefed/actor.go
Normal file
|
@ -0,0 +1,96 @@
|
|||
package forgefed
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io"
|
||||
"net/http"
|
||||
|
||||
"code.gitea.io/gitea/models/federation"
|
||||
"code.gitea.io/gitea/models/user"
|
||||
|
||||
ap "github.com/go-ap/activitypub"
|
||||
)
|
||||
|
||||
func GetActor(id string) (*ap.Actor, error) {
|
||||
client := http.Client{}
|
||||
req, err := http.NewRequest("GET", id, nil)
|
||||
if err != nil {
|
||||
//Handle Error
|
||||
}
|
||||
|
||||
req.Header = http.Header{
|
||||
"Content-Type": {"application/activity+json"},
|
||||
}
|
||||
r, err := client.Do(req)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer r.Body.Close()
|
||||
body, err := io.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
actorObj := new(ap.Actor)
|
||||
err = json.Unmarshal(body, &actorObj)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return actorObj, nil
|
||||
}
|
||||
|
||||
func SavePerson(ctx context.Context, person *ap.Person) (*user.User, error) {
|
||||
|
||||
fmt.Println(person.ID.String())
|
||||
hostname, err := GetHostnameFromResource(person.ID.String())
|
||||
|
||||
exists, err := federation.FederatedHostExists(ctx, hostname)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var federatedHost federation.FederatedHost
|
||||
if exists {
|
||||
x, err := federation.GetFederatdHost(ctx, hostname)
|
||||
federatedHost = *x
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
federatedHost := new(federation.FederatedHost)
|
||||
federatedHost.HostFqdn = hostname
|
||||
if err = federatedHost.Save(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
u := new(user.User)
|
||||
u.Name = "@" + person.PreferredUsername.String() + "@" + hostname
|
||||
//panic(u.Name)
|
||||
u.Email = person.PreferredUsername.String() + "@" + hostname
|
||||
u.Website = person.URL.GetID().String()
|
||||
u.KeepEmailPrivate = true
|
||||
|
||||
exist, err := user.GetUser(ctx, u)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if exist {
|
||||
return u, nil // TODO: must also check for federatedUser existence
|
||||
}
|
||||
|
||||
if err = federation.CreatUser(ctx, u); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err = federation.CreateFederatedUser(ctx, u, &federatedHost); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return u, nil
|
||||
}
|
Loading…
Reference in a new issue