This commit is contained in:
@@ -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
|
||||||
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
}
|
||||||
@@ -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!]!
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
@@ -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
|
||||||
@@ -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"`
|
||||||
|
}
|
||||||
@@ -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")
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -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})
|
||||||
|
}
|
||||||
@@ -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})
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user