You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
4.1 KiB
162 lines
4.1 KiB
package queries
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"git.aiterp.net/rpdata/api/models/changekeys"
|
|
"git.aiterp.net/rpdata/api/models/changes"
|
|
"git.aiterp.net/rpdata/api/models/logs"
|
|
|
|
"git.aiterp.net/rpdata/api/graph2/input"
|
|
"git.aiterp.net/rpdata/api/internal/auth"
|
|
"git.aiterp.net/rpdata/api/models"
|
|
"git.aiterp.net/rpdata/api/models/posts"
|
|
)
|
|
|
|
// Queries
|
|
|
|
func (r *resolver) Post(ctx context.Context, id string) (models.Post, error) {
|
|
return posts.FindID(id)
|
|
}
|
|
|
|
func (r *resolver) Posts(ctx context.Context, filter *posts.Filter) ([]models.Post, error) {
|
|
// Some sanity checks to avoid querying an insame amount of posts.
|
|
if filter == nil {
|
|
filter = &posts.Filter{Limit: 256}
|
|
} else {
|
|
if (filter.Limit <= 0 || filter.Limit > 256) && filter.LogID == nil {
|
|
return nil, errors.New("a limit of 0 (no limit) or >256 without a logId is not allowed")
|
|
}
|
|
|
|
if len(filter.Kind) > 32 {
|
|
return nil, errors.New("You cannot specify more than 32 kinds")
|
|
}
|
|
|
|
if len(filter.ID) > 32 {
|
|
return nil, errors.New("You cannot specify more than 32 IDs")
|
|
}
|
|
}
|
|
|
|
return posts.List(filter)
|
|
}
|
|
|
|
// Mutation
|
|
|
|
func (r *mutationResolver) AddPost(ctx context.Context, input input.PostAddInput) (models.Post, error) {
|
|
token := auth.TokenFromContext(ctx)
|
|
if !token.Authenticated() || !token.Permitted("post.add") {
|
|
return models.Post{}, errors.New("You are not permitted to edit logs")
|
|
}
|
|
|
|
log, err := logs.FindID(input.LogID)
|
|
if err != nil {
|
|
return models.Post{}, err
|
|
}
|
|
|
|
post, err := posts.Add(log, input.Time, input.Kind, input.Nick, input.Text)
|
|
if err != nil {
|
|
return models.Post{}, err
|
|
}
|
|
|
|
go logs.UpdateCharacters(log, false)
|
|
go changes.Submit("Post", "add", token.UserID, true, changekeys.Many(log, post), post)
|
|
|
|
return post, nil
|
|
}
|
|
|
|
func (r *mutationResolver) EditPost(ctx context.Context, input input.PostEditInput) (models.Post, error) {
|
|
token := auth.TokenFromContext(ctx)
|
|
if !token.Authenticated() || !token.Permitted("post.edit") {
|
|
return models.Post{}, errors.New("You are not permitted to edit logs")
|
|
}
|
|
|
|
post, err := posts.FindID(input.ID)
|
|
if err != nil {
|
|
return models.Post{}, errors.New("Post not found")
|
|
}
|
|
|
|
if input.Nick != nil {
|
|
go func() {
|
|
log, err := logs.FindID(post.LogID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
logs.UpdateCharacters(log, false)
|
|
}()
|
|
}
|
|
|
|
post, err = posts.Edit(post, input.Time, input.Kind, input.Nick, input.Text)
|
|
if err != nil {
|
|
return models.Post{}, errors.New("Adding post failed: " + err.Error())
|
|
}
|
|
|
|
go func() {
|
|
log, err := logs.FindID(post.LogID)
|
|
if err != nil {
|
|
log = models.Log{ID: post.LogID}
|
|
}
|
|
|
|
changes.Submit("Post", "edit", token.UserID, true, changekeys.Many(log, post), post)
|
|
}()
|
|
|
|
return post, nil
|
|
}
|
|
|
|
func (r *mutationResolver) MovePost(ctx context.Context, input input.PostMoveInput) ([]models.Post, error) {
|
|
token := auth.TokenFromContext(ctx)
|
|
if !token.Authenticated() || !token.Permitted("post.move") {
|
|
return nil, errors.New("You are not permitted to edit logs")
|
|
}
|
|
|
|
post, err := posts.FindID(input.ID)
|
|
if err != nil {
|
|
return nil, errors.New("Post not found")
|
|
}
|
|
|
|
posts, err := posts.Move(post, input.ToPosition)
|
|
if err != nil {
|
|
return nil, errors.New("Moving posts failed: " + err.Error())
|
|
}
|
|
|
|
go func() {
|
|
log, err := logs.FindID(post.LogID)
|
|
if err != nil {
|
|
log = models.Log{ID: post.LogID}
|
|
}
|
|
|
|
changes.Submit("Post", "move", token.UserID, true, changekeys.Many(log, posts), posts)
|
|
}()
|
|
|
|
return posts, nil
|
|
}
|
|
|
|
func (r *mutationResolver) RemovePost(ctx context.Context, input input.PostRemoveInput) (models.Post, error) {
|
|
token := auth.TokenFromContext(ctx)
|
|
if !token.Authenticated() || !token.Permitted("post.remove") {
|
|
return models.Post{}, errors.New("You are not permitted to edit logs")
|
|
}
|
|
|
|
post, err := posts.FindID(input.ID)
|
|
if err != nil {
|
|
return models.Post{}, errors.New("Post not found (before removing, of course)")
|
|
}
|
|
|
|
post, err = posts.Remove(post)
|
|
if err != nil {
|
|
return models.Post{}, errors.New("Could not remove post: " + err.Error())
|
|
}
|
|
|
|
go func() {
|
|
log, err := logs.FindID(post.LogID)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
logs.UpdateCharacters(log, false)
|
|
changes.Submit("Post", "remove", token.UserID, true, changekeys.Many(log, post), post)
|
|
}()
|
|
|
|
return post, nil
|
|
}
|