package queries import ( "context" "errors" "time" "git.aiterp.net/rpdata/api/models/characters" "git.aiterp.net/rpdata/api/models/changekeys" "git.aiterp.net/rpdata/api/models/changes" "git.aiterp.net/rpdata/api/graph2/input" "git.aiterp.net/rpdata/api/internal/auth" "git.aiterp.net/rpdata/api/models/chapters" "git.aiterp.net/rpdata/api/models/comments" "git.aiterp.net/rpdata/api/models" ) // Queries func (r *resolver) Comment(ctx context.Context, id string) (models.Comment, error) { return comments.Find(id) } // Mutations func (r *mutationResolver) AddComment(ctx context.Context, input input.CommentAddInput) (models.Comment, error) { chapter, err := chapters.FindID(input.ChapterID) if err != nil { return models.Comment{}, errors.New("Chapter not found") } token := auth.TokenFromContext(ctx) if !token.Permitted("member", "story.edit") { return models.Comment{}, errors.New("Unauthorized") } if !chapter.CanComment() { return models.Comment{}, errors.New("Comments are disabled or locked") } var characterPtr *models.Character if input.CharacterID != nil { character, err := characters.FindID(*input.CharacterID) if err != nil { return models.Comment{}, errors.New("Character not found") } else if character.Author != token.UserID { return models.Comment{}, errors.New("That is not your character") } characterPtr = &character } fictionalDate := time.Time{} if input.FictionalDate != nil { fictionalDate = *input.FictionalDate } subject := "" if input.Subject != nil { subject = *input.Subject } comment, err := comments.Add(chapter, subject, token.UserID, input.Source, input.CharacterName, characterPtr, time.Now(), fictionalDate) if err != nil { return models.Comment{}, errors.New("Failed to add comment: " + err.Error()) } go changes.Submit("Comment", "add", token.UserID, true, changekeys.Many(comment, chapter, models.Story{ID: chapter.StoryID}), comment, chapter) return comment, nil } func (r *mutationResolver) EditComment(ctx context.Context, input input.CommentEditInput) (models.Comment, error) { comment, err := comments.Find(input.CommentID) if err != nil { return models.Comment{}, errors.New("Comment not found") } token := auth.TokenFromContext(ctx) if !token.PermittedUser(comment.Author, "member", "story.edit") { return models.Comment{}, errors.New("You cannot edit this comment") } chapter, err := chapters.FindID(comment.ChapterID) if err != nil { return models.Comment{}, errors.New("Comment's chapter not found") } if !chapter.CanComment() { return models.Comment{}, errors.New("Comments are disabled or locked") } if input.ClearFictionalDate != nil && *input.ClearFictionalDate == true { input.FictionalDate = &time.Time{} } if input.CharacterID != nil && *input.CharacterID != "" { character, err := characters.FindID(*input.CharacterID) if err != nil { return models.Comment{}, errors.New("Character not found") } else if character.Author != token.UserID { return models.Comment{}, errors.New("That is not your character") } } comment, err = comments.Edit(comment, input.Source, input.CharacterName, input.CharacterID, input.Subject, input.FictionalDate) if err != nil { return models.Comment{}, errors.New("Could not post comment: " + err.Error()) } go changes.Submit("Comment", "edit", token.UserID, true, changekeys.Many(comment, chapter, models.Story{ID: chapter.StoryID}), comment, chapter) return comment, nil } func (r *mutationResolver) RemoveComment(ctx context.Context, input input.CommentRemoveInput) (models.Comment, error) { comment, err := comments.Find(input.CommentID) if err != nil { return models.Comment{}, errors.New("Comment not found") } token := auth.TokenFromContext(ctx) if !token.PermittedUser(comment.Author, "member", "story.edit") { return models.Comment{}, errors.New("You cannot remove this comment") } chapter, err := chapters.FindID(comment.ChapterID) if err != nil { return models.Comment{}, errors.New("Comment's chapter not found") } if !chapter.CanComment() { return models.Comment{}, errors.New("Comments are disabled or locked") } err = comments.Remove(comment) if err != nil { return models.Comment{}, errors.New("Failed to remove comment: " + err.Error()) } return comment, nil }