* initial commit * add lists * update permissions * fix waypoint create * needs_full_sync for activitypub trails * fixes build issues * fix list get * further CSRF protection * update API docs * adds rate limiter * fix tiptap mentions * a bit more cleanup of main.go * Fix migration order * fixes reviewed notes * require context for activitpub server calls * improve hashing for identifier * fix copy paste error * fix sync trail/list issues * fix summit log/comment duplicates * adaptions after trail merge * fix dockerignore --------- Co-authored-by: Christian Beutel <> Co-authored-by: slothful-vassal <89943360+slothful-vassal@users.noreply.github.com>
91 lines
2.7 KiB
Go
91 lines
2.7 KiB
Go
package routes
|
|
|
|
import (
|
|
"net/http"
|
|
"pocketbase/services/trailmerge"
|
|
"pocketbase/util"
|
|
|
|
"github.com/meilisearch/meilisearch-go"
|
|
"github.com/pocketbase/pocketbase/apis"
|
|
"github.com/pocketbase/pocketbase/core"
|
|
)
|
|
|
|
type mergeExecuteRequest struct {
|
|
SourceTrailID string `json:"sourceTrailId"`
|
|
TargetTrailID string `json:"targetTrailId"`
|
|
Settings trailmerge.MergeSettings `json:"settings"`
|
|
}
|
|
|
|
func TrailMergeSuggest(e *core.RequestEvent) error {
|
|
if e.Auth == nil {
|
|
return apis.NewUnauthorizedError("trail_merge_auth_required", nil)
|
|
}
|
|
|
|
userActor, err := e.App.FindFirstRecordByData("activitypub_actors", "user", e.Auth.Id)
|
|
if err != nil {
|
|
return apis.NewBadRequestError("trail_merge_actor_not_found", err)
|
|
}
|
|
|
|
var request trailmerge.SuggestRequest
|
|
if err := e.BindBody(&request); err != nil {
|
|
return apis.NewBadRequestError("trail_merge_invalid_request", err)
|
|
}
|
|
|
|
if request.Mode == trailmerge.SuggestModeMaintenance {
|
|
response, err := trailmerge.SuggestGroups(e.App, userActor.Id, request)
|
|
if err != nil {
|
|
return apis.NewBadRequestError(err.Error(), err)
|
|
}
|
|
|
|
return e.JSON(http.StatusOK, response)
|
|
}
|
|
|
|
response, err := trailmerge.Suggest(e.App, userActor.Id, request)
|
|
if err != nil {
|
|
return apis.NewBadRequestError(err.Error(), err)
|
|
}
|
|
|
|
return e.JSON(http.StatusOK, response)
|
|
}
|
|
|
|
func TrailMerge(client meilisearch.ServiceManager) func(e *core.RequestEvent) error {
|
|
return func(e *core.RequestEvent) error {
|
|
if e.Auth == nil {
|
|
return apis.NewUnauthorizedError("trail_merge_auth_required", nil)
|
|
}
|
|
|
|
userActor, err := e.App.FindFirstRecordByData("activitypub_actors", "user", e.Auth.Id)
|
|
if err != nil {
|
|
return apis.NewBadRequestError("trail_merge_actor_not_found", err)
|
|
}
|
|
|
|
var request mergeExecuteRequest
|
|
if err := e.BindBody(&request); err != nil {
|
|
return apis.NewBadRequestError("trail_merge_invalid_request", err)
|
|
}
|
|
|
|
source, err := e.App.FindRecordById("trails", request.SourceTrailID)
|
|
if err != nil {
|
|
return apis.NewBadRequestError("trail_merge_source_not_found", err)
|
|
}
|
|
target, err := e.App.FindRecordById("trails", request.TargetTrailID)
|
|
if err != nil {
|
|
return apis.NewBadRequestError("trail_merge_target_not_found", err)
|
|
}
|
|
|
|
if !trailmerge.CanMerge(e.App, userActor.Id, source, target, request.Settings.Delete) {
|
|
return apis.NewForbiddenError("trail_merge_not_allowed", nil)
|
|
}
|
|
|
|
ctx, err := util.GetSafeActorContext(e.Request, userActor)
|
|
|
|
if err := trailmerge.Merge(e.App, client, ctx, userActor, request.SourceTrailID, request.TargetTrailID, request.Settings); err != nil {
|
|
return apis.NewBadRequestError(err.Error(), err)
|
|
}
|
|
|
|
return e.JSON(http.StatusOK, map[string]any{
|
|
"acknowledged": true,
|
|
})
|
|
}
|
|
}
|