Changed characters graphql query to use the filter format, changed description for files query to match the others'
the build was successful
the build was successful
This commit is contained in:
@@ -2,52 +2,57 @@ package queries
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"errors"
|
|
||||||
|
|
||||||
"git.aiterp.net/rpdata/api/graphql/loader"
|
|
||||||
"git.aiterp.net/rpdata/api/graphql/resolver/types"
|
"git.aiterp.net/rpdata/api/graphql/resolver/types"
|
||||||
"git.aiterp.net/rpdata/api/model/character"
|
"git.aiterp.net/rpdata/api/model/character"
|
||||||
)
|
)
|
||||||
|
|
||||||
// CharactersArgs is args for characters query
|
// CharactersArgs is args for characters query
|
||||||
type CharactersArgs struct {
|
type CharactersArgs struct {
|
||||||
IDs *[]string
|
Filter *struct {
|
||||||
Nicks *[]string
|
IDs *[]string
|
||||||
Author *string
|
Nicks *[]string
|
||||||
|
Names *[]string
|
||||||
|
Author *string
|
||||||
|
Search *string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Characters resolves the characters query
|
// Characters resolves the characters query
|
||||||
func (r *QueryResolver) Characters(ctx context.Context, args *CharactersArgs) ([]*types.CharacterResolver, error) {
|
func (r *QueryResolver) Characters(ctx context.Context, args *CharactersArgs) ([]*types.CharacterResolver, error) {
|
||||||
var chars []character.Character
|
var characters []character.Character
|
||||||
var err error
|
var err error
|
||||||
|
|
||||||
loader := loader.FromContext(ctx)
|
filter := args.Filter
|
||||||
if loader == nil {
|
if filter != nil {
|
||||||
return nil, errors.New("no loader")
|
var ids []string
|
||||||
}
|
var nicks []string
|
||||||
|
var names []string
|
||||||
|
|
||||||
switch {
|
if filter.IDs != nil {
|
||||||
case args.IDs != nil:
|
ids = *filter.IDs
|
||||||
chars, err = character.ListIDs(*args.IDs...)
|
}
|
||||||
case args.Nicks != nil:
|
if filter.Nicks != nil {
|
||||||
chars, err = character.ListNicks(*args.Nicks...)
|
nicks = *filter.Nicks
|
||||||
case args.Author != nil:
|
}
|
||||||
chars, err = character.ListAuthor(*args.Author)
|
if filter.Names != nil {
|
||||||
default:
|
names = *filter.Names
|
||||||
chars, err = character.List()
|
|
||||||
}
|
|
||||||
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
resolvers := make([]*types.CharacterResolver, 0, len(chars))
|
|
||||||
for i := range chars {
|
|
||||||
if chars[i].ID == "" {
|
|
||||||
continue
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resolvers = append(resolvers, &types.CharacterResolver{C: chars[i]})
|
characters, err = character.ListFilter(ids, nicks, names, filter.Author, filter.Search)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
characters, err = character.List()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
resolvers := make([]*types.CharacterResolver, 0, len(characters))
|
||||||
|
for _, character := range characters {
|
||||||
|
resolvers = append(resolvers, &types.CharacterResolver{C: character})
|
||||||
}
|
}
|
||||||
|
|
||||||
return resolvers, nil
|
return resolvers, nil
|
||||||
|
|||||||
@@ -3,8 +3,8 @@ type Query {
|
|||||||
# Find character by either an ID or a nick.
|
# Find character by either an ID or a nick.
|
||||||
character(id: String, nick: String): Character
|
character(id: String, nick: String): Character
|
||||||
|
|
||||||
# Find characters by either a list of ids, nicks or an author. Only one parameter at a time
|
# Find characters
|
||||||
characters(ids: [String!], nicks: [String!], author: String): [Character!]!
|
characters(filter: CharactersFilter): [Character!]!
|
||||||
|
|
||||||
|
|
||||||
# Find channel by name
|
# Find channel by name
|
||||||
@@ -32,7 +32,7 @@ type Query {
|
|||||||
# Find file by ID
|
# Find file by ID
|
||||||
file(id: String!): File
|
file(id: String!): File
|
||||||
|
|
||||||
# Files get all available files. If includePublic is set, it will return public files as well
|
# Find files
|
||||||
files(filter: FilesFilter): [File!]!
|
files(filter: FilesFilter): [File!]!
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -22,6 +22,24 @@ type Character {
|
|||||||
description: String!
|
description: String!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Filter for characters query
|
||||||
|
input CharactersFilter {
|
||||||
|
# Filter by character IDs
|
||||||
|
ids: [String!]
|
||||||
|
|
||||||
|
# Filter by nicks
|
||||||
|
nicks: [String!]
|
||||||
|
|
||||||
|
# Filter by names
|
||||||
|
names: [String!]
|
||||||
|
|
||||||
|
# Filter by author
|
||||||
|
author: String
|
||||||
|
|
||||||
|
# Filter by text search matching against the character's description
|
||||||
|
search: String
|
||||||
|
}
|
||||||
|
|
||||||
# Input for adding characters
|
# Input for adding characters
|
||||||
input CharacterAddInput {
|
input CharacterAddInput {
|
||||||
# The primary IRC nick name to recognize this character by
|
# The primary IRC nick name to recognize this character by
|
||||||
|
|||||||
@@ -154,6 +154,29 @@ func ListIDs(ids ...string) ([]Character, error) {
|
|||||||
return list(bson.M{"_id": bson.M{"$in": ids}})
|
return list(bson.M{"_id": bson.M{"$in": ids}})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ListFilter lists all logs matching the filters.
|
||||||
|
func ListFilter(ids []string, nicks []string, names []string, author *string, search *string) ([]Character, error) {
|
||||||
|
query := bson.M{}
|
||||||
|
|
||||||
|
if len(ids) > 0 {
|
||||||
|
query["_id"] = bson.M{"$in": ids}
|
||||||
|
}
|
||||||
|
if len(nicks) > 0 {
|
||||||
|
query["nicks"] = bson.M{"$in": nicks}
|
||||||
|
}
|
||||||
|
if len(names) > 0 {
|
||||||
|
query["name"] = bson.M{"$in": names}
|
||||||
|
}
|
||||||
|
if author != nil {
|
||||||
|
query["author"] = *author
|
||||||
|
}
|
||||||
|
if search != nil {
|
||||||
|
query["$text"] = bson.M{"$search": *search}
|
||||||
|
}
|
||||||
|
|
||||||
|
return list(query)
|
||||||
|
}
|
||||||
|
|
||||||
// New creates a Character and pushes it to the database. It does some validation
|
// New creates a Character and pushes it to the database. It does some validation
|
||||||
// on nick, name, shortName and author. Leave the shortname blank to have it be the
|
// on nick, name, shortName and author. Leave the shortname blank to have it be the
|
||||||
// first name.
|
// first name.
|
||||||
@@ -227,5 +250,11 @@ func init() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("init common.characters:", err)
|
log.Fatalln("init common.characters:", err)
|
||||||
}
|
}
|
||||||
|
err = collection.EnsureIndex(mgo.Index{
|
||||||
|
Key: []string{"$text:description"},
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln("init common.characters:", err)
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user