diff --git a/resolver/story.go b/resolver/story.go index d356a7b..6f6eab9 100644 --- a/resolver/story.go +++ b/resolver/story.go @@ -1 +1,96 @@ package resolver + +import ( + "context" + "time" + + "git.aiterp.net/rpdata/api/model/story" +) + +// StoryResolver for the Story graphql type +type StoryResolver struct{ S story.Story } + +// StoryArgs is args for channel query +type StoryArgs struct { + ID string +} + +// Story implements the channel query +func (r *QueryResolver) Story(ctx context.Context, args *StoryArgs) (*StoryResolver, error) { + story, err := story.FindID(args.ID) + if err != nil { + return nil, err + } + + return &StoryResolver{S: story}, nil +} + +// ID resolves Story.id +func (r *StoryResolver) ID() string { + return r.S.ID +} + +// Author resolves Story.author +func (r *StoryResolver) Author() string { + return r.S.Author +} + +// Name resolves Story.name +func (r *StoryResolver) Name() string { + return r.S.Name +} + +// Category resolves Story.category +func (r *StoryResolver) Category() string { + return r.S.Category +} + +// Open resolves Story.open +func (r *StoryResolver) Open() bool { + return r.S.Open +} + +// Listed resolves Story.listed +func (r *StoryResolver) Listed() bool { + return r.S.Listed +} + +// Tags resolves Story.tags +func (r *StoryResolver) Tags() []*TagResolver { + resolvers := make([]*TagResolver, len(r.S.Tags)) + for i, tag := range r.S.Tags { + resolvers[i] = &TagResolver{T: tag} + } + + return resolvers +} + +// Chapters resolves Story.chapters +func (r *StoryResolver) Chapters() ([]*ChapterResolver, error) { + chapters, err := r.S.Chapters() + if err != nil { + return nil, err + } + + resolvers := make([]*ChapterResolver, len(chapters)) + for i, chapter := range chapters { + resolvers[i] = &ChapterResolver{C: chapter} + } + + return resolvers, nil +} + +// CreatedDate resolves Story.createdDate +func (r *StoryResolver) CreatedDate() string { + return r.S.CreatedDate.Format(time.RFC3339Nano) +} + +// FictionalDate resolves Story.fictionalDate +func (r *StoryResolver) FictionalDate() string { + return r.S.FictionalDate.Format(time.RFC3339Nano) +} + +// UpdatedDate resolves Story.updatedDate +func (r *StoryResolver) UpdatedDate() string { + return r.S.UpdatedDate.Format(time.RFC3339Nano) +} diff --git a/resolver/tag.go b/resolver/tag.go new file mode 100644 index 0000000..bf38f40 --- /dev/null +++ b/resolver/tag.go @@ -0,0 +1,16 @@ +package resolver + +import "git.aiterp.net/rpdata/api/model/story" + +// TagResolver for the Tag graphql type +type TagResolver struct{ T story.Tag } + +// Kind resolves Tag.kind +func (r *TagResolver) Kind() string { + return r.T.Kind +} + +// Name resolves Tag.name +func (r *TagResolver) Name() string { + return r.T.Name +} diff --git a/schema/root.graphql b/schema/root.graphql index 8ac238c..4fe7461 100644 --- a/schema/root.graphql +++ b/schema/root.graphql @@ -36,6 +36,10 @@ type Query { files(includePublic: Boolean, mimeTypes: [String!]): [File!]! + # Find story by ID + story(id: String!): Story + + # Find story chapter by ID chapter(id: String!): Chapter diff --git a/schema/types/story.graphql b/schema/types/story.graphql index 13b3819..719ade8 100644 --- a/schema/types/story.graphql +++ b/schema/types/story.graphql @@ -22,6 +22,9 @@ type Story { # The tags for this tory tags: [Tag!]! + # The chapters of this story + chapters: [Chapter!]! + # The date the story was created (RFC3339 format). createdDate: String! diff --git a/schema/types/tag.graphql b/schema/types/tag.graphql index 860dd47..98cb578 100644 --- a/schema/types/tag.graphql +++ b/schema/types/tag.graphql @@ -7,6 +7,15 @@ type Tag { name: String! } +# A Tag is a means of associating stories that have details in common with one another. +input TagInput { + # The tag's kind + kind: TagKind! + + # The tag's name + name: String! +} + # Allowed values for Tag.kind enum TagKind { # An organization is a catch all term for in-universe corporations, teams, groups, cults, forces, etc...