Browse Source

graph2: Added Chapter type and queries, moved loader out of old graphql pkg.

1.0
Gisle Aune 6 years ago
parent
commit
875dac9ecb
  1. 5
      graph2/gqlgen.yml
  2. 4
      graph2/graph.go
  3. 12
      graph2/queries/chapter.go
  4. 4
      graph2/schema/root.gql
  5. 59
      graph2/schema/types/Chapter.gql
  6. 21
      graph2/types/chapter.go
  7. 15
      models/chapter.go
  8. 36
      models/chapters/db.go
  9. 11
      models/chapters/find.go
  10. 11
      models/chapters/list.go

5
graph2/gqlgen.yml

@ -29,5 +29,10 @@ models:
model: git.aiterp.net/rpdata/api/models.Log model: git.aiterp.net/rpdata/api/models.Log
LogsFilter: LogsFilter:
model: git.aiterp.net/rpdata/api/models/logs.Filter model: git.aiterp.net/rpdata/api/models/logs.Filter
Chapter:
model: git.aiterp.net/rpdata/api/models.Chapter
fields:
fictionalDate:
resolver: true
Date: Date:
model: git.aiterp.net/rpdata/api/models/scalars.Date model: git.aiterp.net/rpdata/api/models/scalars.Date

4
graph2/graph.go

@ -25,3 +25,7 @@ func (r *rootResolver) Query() QueryResolver {
func (r *rootResolver) Log() LogResolver { func (r *rootResolver) Log() LogResolver {
return &types.LogResolver return &types.LogResolver
} }
func (r *rootResolver) Chapter() ChapterResolver {
return &types.ChapterResolver
}

12
graph2/queries/chapter.go

@ -0,0 +1,12 @@
package queries
import (
"context"
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/chapters"
)
func (r *resolver) Chapter(ctx context.Context, id string) (models.Chapter, error) {
return chapters.FindID(id)
}

4
graph2/schema/root.gql

@ -31,6 +31,10 @@ type Query {
logs(filter: LogsFilter): [Log!]! logs(filter: LogsFilter): [Log!]!
# Find story chapter by ID
chapter(id: String!): Chapter!
# Find all distinct tags used in stories # Find all distinct tags used in stories
tags: [Tag!]! tags: [Tag!]!
} }

59
graph2/schema/types/Chapter.gql

@ -0,0 +1,59 @@
# A Chapter is the main content body of a story.
type Chapter {
# The chapter's ID
id: String!
# The chapter's title
title: String!
# The chapter's author
author: String!
# The chapter's source
source: String!
# When the chapter was posted initialy
createdDate: Date!
# The in-universe date and time of the chapter
fictionalDate: Date
# The date of edit.
editedDate: Date!
}
# Input for addChapter mutation
input ChapterAddInput {
# The story to add a chapter to
storyId: String!
# The title to give the chapter. It can not be left empty
title: String!
# The author to set for the chapter. It will use the logged in user ID, and only
# users with appropriate permissions can post as another author. Even then, it's only
# for importing/moving content. This author name will not be used when logging the
# submission
author: String
# The markdown source for the content
source: String!
# Optionally, assign a fictional date for the chapter
fictionalDate: Date
}
# Input for editChapter mutation
input ChapterEditInput {
# The chapter to edit
id: String!
# Change the chapter's title
title: String
# Change the source
source: String
# Set the fictional date for a chapter
fictionalDate: Date
}

21
graph2/types/chapter.go

@ -0,0 +1,21 @@
package types
import (
"context"
"time"
"git.aiterp.net/rpdata/api/models"
)
type chapterResolver struct{}
func (r *chapterResolver) FictionalDate(ctx context.Context, chapter *models.Chapter) (*time.Time, error) {
if chapter.FictionalDate.IsZero() {
return nil, nil
}
return &chapter.FictionalDate, nil
}
// ChapterResolver is a resolver
var ChapterResolver chapterResolver

15
models/chapter.go

@ -0,0 +1,15 @@
package models
import "time"
// A Chapter is a part of a story.
type Chapter struct {
ID string `bson:"_id"`
StoryID string `bson:"storyId"`
Title string `bson:"title"`
Author string `bson:"author"`
Source string `bson:"source"`
CreatedDate time.Time `bson:"createdDate"`
FictionalDate time.Time `bson:"fictionalDate,omitempty"`
EditedDate time.Time `bson:"editedDate"`
}

36
models/chapters/db.go

@ -0,0 +1,36 @@
package chapters
import (
"git.aiterp.net/rpdata/api/internal/store"
"git.aiterp.net/rpdata/api/models"
"github.com/globalsign/mgo"
)
var collection *mgo.Collection
func find(query interface{}) (models.Chapter, error) {
chapter := models.Chapter{}
err := collection.Find(query).One(&chapter)
return chapter, err
}
func list(query interface{}) ([]models.Chapter, error) {
chapters := make([]models.Chapter, 0, 8)
err := collection.Find(query).Sort("createdDate").All(&chapters)
if err != nil {
return nil, err
}
return chapters, nil
}
func init() {
store.HandleInit(func(db *mgo.Database) {
collection = db.C("story.chapters")
collection.EnsureIndexKey("storyId")
collection.EnsureIndexKey("author")
collection.EnsureIndexKey("createdDate")
})
}

11
models/chapters/find.go

@ -0,0 +1,11 @@
package chapters
import (
"git.aiterp.net/rpdata/api/models"
"github.com/globalsign/mgo/bson"
)
// FindID finds a chapter by ID
func FindID(id string) (models.Chapter, error) {
return find(bson.M{"_id": id})
}

11
models/chapters/list.go

@ -0,0 +1,11 @@
package chapters
import (
"git.aiterp.net/rpdata/api/models"
"github.com/globalsign/mgo/bson"
)
// ListStoryID lists all chapters for the story ID
func ListStoryID(storyID string) ([]models.Chapter, error) {
return list(bson.M{"storyId": storyID})
}
Loading…
Cancel
Save