From 0ec923d68692452d9d47e9027adf57a53ae4e265 Mon Sep 17 00:00:00 2001 From: Gisle Aune Date: Wed, 18 Jul 2018 00:13:19 +0200 Subject: [PATCH] Added logged filter to characters query: character appears in logs. --- graphql/resolver/queries/characters.go | 3 ++- graphql/schema/types/character.graphql | 3 +++ model/character/character.go | 28 +++++++++++++++++++++++++- 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/graphql/resolver/queries/characters.go b/graphql/resolver/queries/characters.go index 0305be4..ad6fb2a 100644 --- a/graphql/resolver/queries/characters.go +++ b/graphql/resolver/queries/characters.go @@ -15,6 +15,7 @@ type CharactersArgs struct { Names *[]string Author *string Search *string + Logged *bool } } @@ -39,7 +40,7 @@ func (r *QueryResolver) Characters(ctx context.Context, args *CharactersArgs) ([ names = *filter.Names } - characters, err = character.ListFilter(ids, nicks, names, filter.Author, filter.Search) + characters, err = character.ListFilter(ids, nicks, names, filter.Author, filter.Search, filter.Logged) if err != nil { return nil, err } diff --git a/graphql/schema/types/character.graphql b/graphql/schema/types/character.graphql index a35918e..e89d605 100644 --- a/graphql/schema/types/character.graphql +++ b/graphql/schema/types/character.graphql @@ -38,6 +38,9 @@ input CharactersFilter { # Filter by text search matching against the character's description search: String + + # Filter by whether they've been part of a log. + logged: Boolean } # Input for adding characters diff --git a/model/character/character.go b/model/character/character.go index 6f7e4c6..7085d6b 100644 --- a/model/character/character.go +++ b/model/character/character.go @@ -14,6 +14,8 @@ import ( var collection *mgo.Collection +var logsCollection *mgo.Collection + // Character is a common data model representing an RP character or NPC. type Character struct { ID string `json:"id" bson:"_id"` @@ -155,9 +157,31 @@ func ListIDs(ids ...string) ([]Character, error) { } // ListFilter lists all logs matching the filters. -func ListFilter(ids []string, nicks []string, names []string, author *string, search *string) ([]Character, error) { +func ListFilter(ids []string, nicks []string, names []string, author *string, search *string, logged *bool) ([]Character, error) { query := bson.M{} + if logged != nil { + loggedIDs := make([]string, 0, 64) + err := logsCollection.Find(bson.M{"characterIds": bson.M{"$ne": nil}}).Distinct("characterIds", &loggedIDs) + if err != nil { + return nil, err + } + + if len(ids) > 0 { + newIds := make([]string, 0, len(ids)) + for _, id := range ids { + for _, loggedID := range loggedIDs { + if id == loggedID { + newIds = append(newIds, id) + break + } + } + } + ids = newIds + } else { + ids = loggedIDs + } + } if len(ids) > 0 { query["_id"] = bson.M{"$in": ids} } @@ -256,5 +280,7 @@ func init() { if err != nil { log.Fatalln("init common.characters:", err) } + + logsCollection = db.C("logbot3.logs") }) }