From aeb5b2662795e6de22c24a91ed067f322b395cff Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Sun, 30 Sep 2018 17:05:26 +0200 Subject: [PATCH] graph2: Added Log mutations --- graph2/queries/log.go | 57 +++++++++++++++++++++++++++++++++++++ graph2/schema/root.gql | 10 +++++++ graph2/schema/types/Log.gql | 6 ++++ models/logs/add.go | 43 ++++++++++++++++++++++++++++ models/logs/edit.go | 39 +++++++++++++++++++++++++ models/logs/remove.go | 13 +++++++++ 6 files changed, 168 insertions(+) create mode 100644 models/logs/add.go create mode 100644 models/logs/edit.go create mode 100644 models/logs/remove.go diff --git a/graph2/queries/log.go b/graph2/queries/log.go index 9f0fa73..abb4f1b 100644 --- a/graph2/queries/log.go +++ b/graph2/queries/log.go @@ -5,12 +5,16 @@ import ( "errors" "strings" + "git.aiterp.net/rpdata/api/graph2/input" + "git.aiterp.net/rpdata/api/internal/auth" "git.aiterp.net/rpdata/api/internal/loader" "git.aiterp.net/rpdata/api/models" "git.aiterp.net/rpdata/api/models/logs" "github.com/99designs/gqlgen/graphql" ) +// Queries + func (r *resolver) Log(ctx context.Context, id string) (models.Log, error) { return logs.FindID(id) } @@ -44,3 +48,56 @@ func (r *resolver) Logs(ctx context.Context, filter *logs.Filter) ([]models.Log, return logs, nil } + +// Mutations + +func (r *mutationResolver) AddLog(ctx context.Context, input input.LogAddInput) (models.Log, error) { + token := auth.TokenFromContext(ctx) + if !token.Authenticated() || !token.Permitted("log.add") { + return models.Log{}, errors.New("You are not permitted to add logs") + } + + open := input.Open != nil && *input.Open == true + title := "" + if input.Title != nil { + title = *input.Title + } + event := "" + if input.Event != nil { + event = *input.Event + } + description := "" + if input.Description != nil { + description = *input.Description + } + + return logs.Add(input.Date, input.Channel, title, event, description, open) +} + +func (r *mutationResolver) EditLog(ctx context.Context, input input.LogEditInput) (models.Log, error) { + token := auth.TokenFromContext(ctx) + if !token.Authenticated() || !token.Permitted("log.edit") { + return models.Log{}, errors.New("You are not permitted to edit logs") + } + + log, err := logs.FindID(input.ID) + if err != nil { + return models.Log{}, errors.New("Log not found") + } + + return logs.Edit(log, input.Title, input.Event, input.Description, input.Open) +} + +func (r *mutationResolver) RemoveLog(ctx context.Context, input input.LogRemoveInput) (models.Log, error) { + token := auth.TokenFromContext(ctx) + if !token.Authenticated() || !token.Permitted("log.remove") { + return models.Log{}, errors.New("You are not permitted to remove logs") + } + + log, err := logs.FindID(input.ID) + if err != nil { + return models.Log{}, errors.New("Log not found") + } + + return logs.Remove(log) +} diff --git a/graph2/schema/root.gql b/graph2/schema/root.gql index 05ede87..feb88c7 100644 --- a/graph2/schema/root.gql +++ b/graph2/schema/root.gql @@ -85,6 +85,16 @@ type Mutation { removeChapter(input: ChapterRemoveInput!): Chapter! + # Add a new log + addLog(input: LogAddInput!): Log! + + # Edit a log + editLog(input: LogEditInput!): Log! + + # Remove a log + removeLog(input: LogRemoveInput!): Log! + + # Add a post addPost(input: PostAddInput!): Post! diff --git a/graph2/schema/types/Log.gql b/graph2/schema/types/Log.gql index 290415e..bb0c566 100644 --- a/graph2/schema/types/Log.gql +++ b/graph2/schema/types/Log.gql @@ -94,4 +94,10 @@ input LogEditInput { # Open/close the log open: Boolean +} + +# Input for removeLog mutation +input LogRemoveInput { + # The id of the log to remove + id: String! } \ No newline at end of file diff --git a/models/logs/add.go b/models/logs/add.go new file mode 100644 index 0000000..f03d27c --- /dev/null +++ b/models/logs/add.go @@ -0,0 +1,43 @@ +package logs + +import ( + "errors" + "strconv" + "time" + + "git.aiterp.net/rpdata/api/internal/counter" + "git.aiterp.net/rpdata/api/model/channel" + "git.aiterp.net/rpdata/api/models" +) + +// Add creates a new Log +func Add(date time.Time, channelName, title, eventName, description string, open bool) (models.Log, error) { + nextID, err := counter.Next("auto_increment", "Log") + if err != nil { + return models.Log{}, errors.New("Failed to allocate short ID: " + err.Error()) + } + + _, err = channel.Ensure(channelName, open) + if err != nil { + return models.Log{}, errors.New("Failed to ensure channel: " + err.Error()) + } + + log := models.Log{ + ID: makeLogID(date, channelName), + ShortID: "L" + strconv.Itoa(nextID), + Date: date, + ChannelName: channelName, + Title: title, + EventName: eventName, + Description: description, + Open: open, + CharacterIDs: nil, + } + + err = collection.Insert(log) + if err != nil { + return models.Log{}, err + } + + return log, nil +} diff --git a/models/logs/edit.go b/models/logs/edit.go new file mode 100644 index 0000000..1764044 --- /dev/null +++ b/models/logs/edit.go @@ -0,0 +1,39 @@ +package logs + +import ( + "git.aiterp.net/rpdata/api/models" + "github.com/globalsign/mgo/bson" +) + +// Edit sets a log's meta-data. +func Edit(log models.Log, title *string, event *string, description *string, open *bool) (models.Log, error) { + changes := bson.M{} + + if title != nil && *title != log.Title { + changes["title"] = *title + log.Title = *title + } + if event != nil && *event != log.EventName { + changes["event"] = *event + log.EventName = *event + } + if description != nil && *description != log.Description { + changes["description"] = *description + log.Description = *description + } + if open != nil && *open != log.Open { + changes["open"] = *open + log.Open = *open + } + + if len(changes) == 0 { + return log, nil + } + + err := collection.UpdateId(log.ID, bson.M{"$set": changes}) + if err != nil { + return models.Log{}, err + } + + return log, nil +} diff --git a/models/logs/remove.go b/models/logs/remove.go new file mode 100644 index 0000000..a6edffe --- /dev/null +++ b/models/logs/remove.go @@ -0,0 +1,13 @@ +package logs + +import "git.aiterp.net/rpdata/api/models" + +// Remove removes the log. +func Remove(log models.Log) (models.Log, error) { + err := collection.RemoveId(log.ID) + if err != nil { + return models.Log{}, err + } + + return log, nil +}