Browse Source

Changed characters graphql query to use the filter format, changed description for files query to match the others'

1.0 0.5.1
Gisle Aune 6 years ago
parent
commit
ba1c1e0a4b
  1. 63
      graphql/resolver/queries/characters.go
  2. 6
      graphql/schema/root.graphql
  3. 18
      graphql/schema/types/character.graphql
  4. 29
      model/character/character.go

63
graphql/resolver/queries/characters.go

@ -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
Nicks *[]string
Author *string
Filter *struct {
IDs *[]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)
if loader == nil {
return nil, errors.New("no loader")
}
filter := args.Filter
if filter != nil {
var ids []string
var nicks []string
var names []string
switch {
case args.IDs != nil:
chars, err = character.ListIDs(*args.IDs...)
case args.Nicks != nil:
chars, err = character.ListNicks(*args.Nicks...)
case args.Author != nil:
chars, err = character.ListAuthor(*args.Author)
default:
chars, err = character.List()
}
if err != nil {
return nil, err
}
if filter.IDs != nil {
ids = *filter.IDs
}
if filter.Nicks != nil {
nicks = *filter.Nicks
}
if filter.Names != nil {
names = *filter.Names
}
resolvers := make([]*types.CharacterResolver, 0, len(chars))
for i := range chars {
if chars[i].ID == "" {
continue
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 = append(resolvers, &types.CharacterResolver{C: chars[i]})
resolvers := make([]*types.CharacterResolver, 0, len(characters))
for _, character := range characters {
resolvers = append(resolvers, &types.CharacterResolver{C: character})
} }
return resolvers, nil return resolvers, nil

6
graphql/schema/root.graphql

@ -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
characters(ids: [String!], nicks: [String!], author: String): [Character!]!
# Find characters
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!]!

18
graphql/schema/types/character.graphql

@ -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

29
model/character/character.go

@ -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)
}
}) })
} }
Loading…
Cancel
Save