66 lines
1.7 KiB
Go
66 lines
1.7 KiB
Go
package activitypub
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"time"
|
|
|
|
"git.mstar.dev/mstar/goutils/other"
|
|
"gorm.io/gorm"
|
|
|
|
"git.mstar.dev/mstar/linstrom/storage-new/dbgen"
|
|
"git.mstar.dev/mstar/linstrom/storage-new/models"
|
|
webshared "git.mstar.dev/mstar/linstrom/web/shared"
|
|
)
|
|
|
|
func ImportRemoteNote(noteId string, requester *models.User) (string, error) {
|
|
type Note struct {
|
|
Type string
|
|
Id string
|
|
Summary *string
|
|
Content string
|
|
MkContent *string `json:"_misskey_content"`
|
|
Published time.Time
|
|
To []string
|
|
Cc []string
|
|
InReplyTo *string
|
|
Sensitive bool
|
|
AttributedTo string
|
|
}
|
|
res, _, err := webshared.RequestSigned("GET", noteId, nil, requester)
|
|
if err != nil {
|
|
return "", other.Error("activitypub", "failed to request object", err)
|
|
}
|
|
if res.StatusCode != 200 {
|
|
return "", fmt.Errorf("activitypub: invalid status code: %v", res.StatusCode)
|
|
}
|
|
body, _ := io.ReadAll(res.Body)
|
|
res.Body.Close()
|
|
data := Note{}
|
|
err = json.Unmarshal(body, &data)
|
|
if err != nil {
|
|
return "", other.Error("activitypub", "json unmarshalling failed", err)
|
|
}
|
|
if data.Type != "Note" {
|
|
return "", fmt.Errorf("activitypub: invalid object type: %q", data.Type)
|
|
}
|
|
// (Re-)Import account this note belongs to
|
|
_, err = ImportRemoteAccountByAPUrl(data.AttributedTo)
|
|
if err != nil {
|
|
return "", other.Error("activitypub", "failed to import note author", err)
|
|
}
|
|
dbNote, err := dbgen.Note.Where(dbgen.Note.ID.Eq(data.Id)).First()
|
|
switch err {
|
|
case nil:
|
|
case gorm.ErrRecordNotFound:
|
|
dbNote = &models.Note{
|
|
ID: data.Id,
|
|
CreatedAt: data.Published,
|
|
CreatorId: data.AttributedTo,
|
|
}
|
|
default:
|
|
return "", other.Error("activitypub", "failed to check db for note", err)
|
|
}
|
|
return dbNote.ID, nil
|
|
}
|