package resolvers import ( "context" "errors" "git.aiterp.net/rpdata/api/graph2/graphcore" "git.aiterp.net/rpdata/api/internal/auth" "git.aiterp.net/rpdata/api/models" "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/models/posts" ) // Queries func (r *queryResolver) Post(ctx context.Context, id string) (*models.Post, error) { post, err := posts.FindID(id) if err != nil { return nil, err } return &post, nil } func (r *queryResolver) 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") } } posts, err := posts.List(filter) if err != nil { return nil, err } posts2 := make([]*models.Post, len(posts)) for i := range posts { posts2[i] = &posts[i] } return posts2, nil } // Mutation func (r *mutationResolver) AddPost(ctx context.Context, input graphcore.PostAddInput) (*models.Post, error) { token := auth.TokenFromContext(ctx) if !token.Authenticated() || !token.Permitted("post.add") { return nil, errors.New("You are not permitted to edit logs") } log, err := logs.FindID(input.LogID) if err != nil { return nil, err } post, err := posts.Add(log, input.Time, input.Kind, input.Nick, input.Text) if err != nil { return nil, err } go logs.UpdateCharacters(log, nil) go changes.Submit("Post", "add", token.UserID, true, changekeys.Many(log, post), post) return &post, nil } func (r *mutationResolver) EditPost(ctx context.Context, input graphcore.PostEditInput) (*models.Post, error) { token := auth.TokenFromContext(ctx) if !token.Authenticated() || !token.Permitted("post.edit") { 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") } if input.Nick != nil { go func() { log, err := logs.FindID(post.LogID) if err != nil { return } logs.UpdateCharacters(log, nil) }() } post, err = posts.Edit(post, input.Time, input.Kind, input.Nick, input.Text) if err != nil { return nil, 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 graphcore.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) }() posts2 := make([]*models.Post, len(posts)) for i := range posts { posts2[i] = &posts[i] } return posts2, nil } func (r *mutationResolver) RemovePost(ctx context.Context, input graphcore.PostRemoveInput) (*models.Post, error) { token := auth.TokenFromContext(ctx) if !token.Authenticated() || !token.Permitted("post.remove") { 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 (before removing, of course)") } post, err = posts.Remove(post) if err != nil { return nil, errors.New("Could not remove post: " + err.Error()) } go func() { log, err := logs.FindID(post.LogID) if err != nil { return } logs.UpdateCharacters(log, nil) changes.Submit("Post", "remove", token.UserID, true, changekeys.Many(log, post), post) }() return &post, nil }