From 5189d486a520965eac52e800a189040fffb2a72d Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Sat, 7 Jul 2018 15:16:10 +0200 Subject: [PATCH] Added stories query and resolvers --- resolver/story.go | 70 ++++++++++++++++++++++++++++++++++++-- resolver/tag.go | 6 ++++ schema/root.graphql | 5 ++- schema/types/story.graphql | 17 +++++++++ 4 files changed, 95 insertions(+), 3 deletions(-) diff --git a/resolver/story.go b/resolver/story.go index 6f6eab9..bfa25d8 100644 --- a/resolver/story.go +++ b/resolver/story.go @@ -10,12 +10,12 @@ import ( // StoryResolver for the Story graphql type type StoryResolver struct{ S story.Story } -// StoryArgs is args for channel query +// StoryArgs is args for story query type StoryArgs struct { ID string } -// Story implements the channel query +// Story implements the story query func (r *QueryResolver) Story(ctx context.Context, args *StoryArgs) (*StoryResolver, error) { story, err := story.FindID(args.ID) if err != nil { @@ -25,6 +25,72 @@ func (r *QueryResolver) Story(ctx context.Context, args *StoryArgs) (*StoryResol return &StoryResolver{S: story}, nil } +// StoriesArg is args for stories query +type StoriesArg struct { + Input *StoriesInput +} + +// StoriesInput resolves the TagInput input +type StoriesInput struct { + Author *string + Tags *[]TagInput + EarliestFictionalDate *string + LatestFictionalDate *string + Limit *int32 +} + +// Stories implements the stories query +func (r *QueryResolver) Stories(ctx context.Context, args *StoriesArg) ([]*StoryResolver, error) { + author := "" + if args.Input.Author != nil { + author = *args.Input.Author + } + + tags := make([]story.Tag, 0, 8) + if args.Input.Tags != nil { + for _, tagInput := range *args.Input.Tags { + tags = append(tags, story.Tag{ + Kind: tagInput.Kind, + Name: tagInput.Name, + }) + } + } + + earliest := time.Time{} + err := error(nil) + if args.Input.EarliestFictionalDate != nil { + earliest, err = time.Parse(time.RFC3339Nano, *args.Input.EarliestFictionalDate) + if err != nil { + return nil, err + } + } + + latest := time.Time{} + if args.Input.LatestFictionalDate != nil { + latest, err = time.Parse(time.RFC3339Nano, *args.Input.LatestFictionalDate) + if err != nil { + return nil, err + } + } + + limit := 30 + if args.Input.Limit != nil { + limit = int(*args.Input.Limit) + } + + stories, err := story.List(author, tags, earliest, latest, limit) + if err != nil { + return nil, err + } + + resolvers := make([]*StoryResolver, len(stories)) + for i, story := range stories { + resolvers[i] = &StoryResolver{S: story} + } + + return resolvers, nil +} + // ID resolves Story.id func (r *StoryResolver) ID() string { return r.S.ID diff --git a/resolver/tag.go b/resolver/tag.go index bf38f40..383c4c6 100644 --- a/resolver/tag.go +++ b/resolver/tag.go @@ -5,6 +5,12 @@ import "git.aiterp.net/rpdata/api/model/story" // TagResolver for the Tag graphql type type TagResolver struct{ T story.Tag } +// TagInput resolves the TagInput input +type TagInput struct { + Kind string + Name string +} + // Kind resolves Tag.kind func (r *TagResolver) Kind() string { return r.T.Kind diff --git a/schema/root.graphql b/schema/root.graphql index 4fe7461..f3ff249 100644 --- a/schema/root.graphql +++ b/schema/root.graphql @@ -38,7 +38,10 @@ type Query { # Find story by ID story(id: String!): Story - + + # Find stories + stories(input: StoriesQueryInput!): [Story!]! + # Find story chapter by ID chapter(id: String!): Chapter diff --git a/schema/types/story.graphql b/schema/types/story.graphql index 719ade8..b382ed3 100644 --- a/schema/types/story.graphql +++ b/schema/types/story.graphql @@ -35,6 +35,23 @@ type Story { fictionalDate: String! } +input StoriesQueryInput { + # What author to query for + author: String + + # What tags to query for + tags: [TagInput!] + + # The earliest fictionalDate + earliestFictionalDate: String + + # The latest fictionalDate + latestFictionalDate: String + + # The max amount of stories to get (default: 30) + limit: Int +} + # Possible values for Story.category enum StoryCategory { # Description and content of a document or item