|
|
package queries
import ( "context" "errors" "log" "time"
"git.aiterp.net/rpdata/api/models/stories"
"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) { comment, err := comments.Find(id) if err != nil { return nil, err }
return &comment, nil }
// Mutations
func (r *mutationResolver) AddComment(ctx context.Context, input input.CommentAddInput) (*models.Comment, error) { chapter, err := chapters.FindID(input.ChapterID) if err != nil { return nil, errors.New("Chapter not found") }
token := auth.TokenFromContext(ctx) if !token.Permitted("member", "story.edit") { return nil, errors.New("Unauthorized") }
if !chapter.CanComment() { return nil, 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 nil, errors.New("Character not found") } else if character.Author != token.UserID { return nil, 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 nil, errors.New("Failed to add comment: " + err.Error()) }
go func() { story, err := stories.FindID(chapter.StoryID) if err != nil { log.Println("WARNING: Couldn't log comment change:", err) return }
changes.Submit("Comment", "add", token.UserID, true, changekeys.Many(comment, chapter, models.Story{ID: chapter.StoryID}), comment, chapter, story) }()
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 nil, errors.New("Comment not found") }
token := auth.TokenFromContext(ctx) if !token.PermittedUser(comment.Author, "member", "story.edit") { return nil, errors.New("You cannot edit this comment") }
chapter, err := chapters.FindID(comment.ChapterID) if err != nil { return nil, errors.New("Comment's chapter not found") }
if !chapter.CanComment() { return nil, 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 nil, errors.New("Character not found") } else if character.Author != token.UserID { return nil, 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 nil, errors.New("Could not post comment: " + err.Error()) }
go func() { story, err := stories.FindID(chapter.StoryID) if err != nil { log.Println("WARNING: Couldn't log comment change:", err) return }
changes.Submit("Comment", "edit", token.UserID, true, changekeys.Many(comment, chapter, models.Story{ID: chapter.StoryID}), comment, chapter, story) }()
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 nil, errors.New("Comment not found") }
token := auth.TokenFromContext(ctx) if !token.PermittedUser(comment.Author, "member", "story.edit") { return nil, errors.New("You cannot remove this comment") }
chapter, err := chapters.FindID(comment.ChapterID) if err != nil { return nil, errors.New("Comment's chapter not found") }
if !chapter.CanComment() { return nil, errors.New("Comments are disabled or locked") }
err = comments.Remove(comment) if err != nil { return nil, errors.New("Failed to remove comment: " + err.Error()) }
go func() { story, err := stories.FindID(chapter.StoryID) if err != nil { log.Println("WARNING: Couldn't log comment change:", err) return }
changes.Submit("Comment", "remove", token.UserID, true, changekeys.Many(comment, chapter, models.Story{ID: chapter.StoryID}), comment, chapter, story) }()
return &comment, nil }
|