GraphQL API and utilities for the rpdata project
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.

53 lines
1.2 KiB

  1. package mutations
  2. import (
  3. "context"
  4. "git.aiterp.net/rpdata/api/graphql/resolver/types"
  5. "git.aiterp.net/rpdata/api/internal/auth"
  6. "git.aiterp.net/rpdata/api/model/change"
  7. "git.aiterp.net/rpdata/api/model/story"
  8. )
  9. // StoryTagAddArgs is args for the addStoryTag mutation
  10. type StoryTagAddArgs struct {
  11. Input *struct {
  12. ID string
  13. Tag struct {
  14. Kind string
  15. Name string
  16. }
  17. }
  18. }
  19. // AddStoryTag resolves the addStoryTag mutation
  20. func (r *MutationResolver) AddStoryTag(ctx context.Context, args *StoryTagAddArgs) (*types.StoryResolver, error) {
  21. input := args.Input
  22. tag := story.Tag{Kind: input.Tag.Kind, Name: input.Tag.Name}
  23. token := auth.TokenFromContext(ctx)
  24. if !token.Permitted("member", "story.edit") {
  25. return nil, ErrUnauthorized
  26. }
  27. story, err := story.FindID(input.ID)
  28. if err != nil {
  29. return nil, err
  30. }
  31. if story.Author != token.UserID && !token.Permitted("story.edit") {
  32. return nil, ErrPermissionDenied
  33. }
  34. err = story.AddTag(tag)
  35. if err != nil {
  36. return nil, err
  37. }
  38. go change.Submit("Story", "add.tag", token.UserID, story.ID, map[string]interface{}{
  39. "kind": tag.Kind,
  40. "name": tag.Name,
  41. })
  42. return &types.StoryResolver{S: story}, nil
  43. }