Added character service and such.
the build was successful

This commit is contained in:
2019-06-10 17:03:52 +02:00
parent 7b253748fe
commit 2a1423d28f
32 changed files with 1551 additions and 277 deletions
+2 -2
View File
@@ -2,9 +2,9 @@ package graph2
import (
"git.aiterp.net/rpdata/api/graph2/graphcore"
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/changes"
"git.aiterp.net/rpdata/api/models/channels"
"git.aiterp.net/rpdata/api/models/characters"
"git.aiterp.net/rpdata/api/models/files"
"git.aiterp.net/rpdata/api/models/logs"
"git.aiterp.net/rpdata/api/models/posts"
@@ -22,7 +22,7 @@ func complexity() (cr graphcore.ComplexityRoot) {
cr.Query.Character = func(childComplexity int, id *string, nick *string) int {
return childComplexity + findComplexity
}
cr.Query.Characters = func(childComplexity int, filter *characters.Filter) int {
cr.Query.Characters = func(childComplexity int, filter *models.CharacterFilter) int {
return childComplexity + listComplexity
}
cr.Query.Channel = func(childComplexity int, name string) int {
+1 -1
View File
@@ -20,7 +20,7 @@ models:
Character:
model: git.aiterp.net/rpdata/api/models.Character
CharactersFilter:
model: git.aiterp.net/rpdata/api/models/characters.Filter
model: git.aiterp.net/rpdata/api/models.CharacterFilter
Channel:
model: git.aiterp.net/rpdata/api/models.Channel
ChannelsFilter:
+3 -3
View File
@@ -27,15 +27,15 @@ func (r *rootResolver) Query() graphcore.QueryResolver {
}
func (r *rootResolver) Mutation() graphcore.MutationResolver {
return resolvers.MutationResolver
return resolvers.MutationResolver(r.s)
}
func (r *rootResolver) Subscription() graphcore.SubscriptionResolver {
return resolvers.SubscriptionResolver
return resolvers.SubscriptionResolver(r.s)
}
func (r *rootResolver) Log() graphcore.LogResolver {
return &types.LogResolver
return types.LogResolver(r.s)
}
func (r *rootResolver) Comment() graphcore.CommentResolver {
+14 -143
View File
@@ -3,69 +3,41 @@ package resolvers
import (
"context"
"errors"
"strings"
"git.aiterp.net/rpdata/api/graph2/graphcore"
"git.aiterp.net/rpdata/api/internal/auth"
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/changekeys"
"git.aiterp.net/rpdata/api/models/changes"
"git.aiterp.net/rpdata/api/models/characters"
"git.aiterp.net/rpdata/api/models/logs"
)
// Queries
func (r *queryResolver) Character(ctx context.Context, id *string, nick *string) (*models.Character, error) {
if id != nil {
character, err := characters.FindID(*id)
if err != nil {
return nil, err
}
return &character, nil
return r.s.Characters.Find(ctx, *id)
} else if nick != nil {
character, err := characters.FindNick(*nick)
if err != nil {
return nil, err
}
return &character, nil
return r.s.Characters.FindNick(ctx, *nick)
} else {
return nil, errors.New("You must specify either an ID or a nick")
}
}
func (r *queryResolver) Characters(ctx context.Context, filter *characters.Filter) ([]*models.Character, error) {
characters, err := characters.List(filter)
if err != nil {
return nil, err
func (r *queryResolver) Characters(ctx context.Context, filter *models.CharacterFilter) ([]*models.Character, error) {
if filter == nil {
filter = &models.CharacterFilter{}
}
characters2 := make([]*models.Character, len(characters))
for i := range characters {
characters2[i] = &characters[i]
}
return characters2, nil
return r.s.Characters.List(ctx, *filter)
}
// Mutations
func (r *mutationResolver) AddCharacter(ctx context.Context, input graphcore.CharacterAddInput) (*models.Character, error) {
token := auth.TokenFromContext(ctx)
if !token.Permitted("member", "character.add") {
return nil, errors.New("You are not permitted to add characters")
}
if len(input.Name) < 2 || len(input.Nick) < 2 {
return nil, errors.New("You need to provide a name and a nick (min length: 2)")
author := ""
if input.Author != nil {
author = *input.Author
}
shortName := ""
if input.ShortName != nil {
shortName = *input.ShortName
} else {
shortName = strings.SplitN(input.Name, " ", 2)[0]
}
description := ""
@@ -73,122 +45,21 @@ func (r *mutationResolver) AddCharacter(ctx context.Context, input graphcore.Cha
description = *input.Description
}
author := token.UserID
if input.Author != nil && *input.Author != author {
if !token.Permitted("character.add") {
return nil, errors.New("You are only permitted to add your own characters")
}
author = *input.Author
}
logs.ScheduleFullUpdate()
character, err := characters.Add(input.Nick, input.Name, shortName, author, description)
if err != nil {
return nil, errors.New("Adding character failed: " + err.Error())
}
go changes.Submit("Character", "add", token.UserID, true, changekeys.Listed(character), character)
return &character, nil
return r.s.Characters.Create(ctx, input.Nick, input.Name, shortName, author, description)
}
func (r *mutationResolver) AddCharacterNick(ctx context.Context, input graphcore.CharacterNickInput) (*models.Character, error) {
character, err := characters.FindID(input.ID)
if err != nil {
return nil, errors.New("Character not found")
}
if len(input.Nick) < 2 {
return nil, errors.New("You need to provide a valid nick (min length: 2)")
}
token := auth.TokenFromContext(ctx)
if !token.PermittedUser(character.Author, "member", "character.edit") {
return nil, errors.New("You are not permitted to edit this character")
}
logs.ScheduleFullUpdate()
character, err = characters.AddNick(character, input.Nick)
if err != nil {
return nil, errors.New("Failed to add nick: " + err.Error())
}
go logs.ScheduleFullUpdate()
go changes.Submit("Character", "edit", token.UserID, true, changekeys.Listed(character), character)
return &character, nil
return r.s.Characters.AddNick(ctx, input.ID, input.Nick)
}
func (r *mutationResolver) RemoveCharacterNick(ctx context.Context, input graphcore.CharacterNickInput) (*models.Character, error) {
character, err := characters.FindID(input.ID)
if err != nil {
return nil, errors.New("Character not found")
}
token := auth.TokenFromContext(ctx)
if !token.PermittedUser(character.Author, "member", "character.edit") {
return nil, errors.New("You are not permitted to edit this character")
}
character, err = characters.RemoveNick(character, input.Nick)
if err != nil {
return nil, errors.New("Failed to remove nick: " + err.Error())
}
go logs.ScheduleFullUpdate()
go changes.Submit("Character", "edit", token.UserID, true, changekeys.Listed(character), character)
return &character, nil
return r.s.Characters.RemoveNick(ctx, input.ID, input.Nick)
}
func (r *mutationResolver) EditCharacter(ctx context.Context, input graphcore.CharacterEditInput) (*models.Character, error) {
character, err := characters.FindID(input.ID)
if err != nil {
return nil, errors.New("Character not found")
}
if input.Name != nil && len(*input.Name) < 2 {
return nil, errors.New("You need to provide a valid name (min length: 2)")
}
if input.ShortName != nil && len(*input.ShortName) < 2 {
return nil, errors.New("You need to provide a valid short name (min length: 2)")
}
token := auth.TokenFromContext(ctx)
if !token.PermittedUser(character.Author, "member", "character.edit") {
return nil, errors.New("You are not permitted to edit this character")
}
character, err = characters.Edit(character, input.Name, input.ShortName, input.Description)
if err != nil {
return nil, errors.New("Failed to edit character: " + err.Error())
}
go changes.Submit("Character", "edit", token.UserID, true, changekeys.Listed(character), character)
return &character, nil
return r.s.Characters.Update(ctx, input.ID, input.Name, input.ShortName, input.Description)
}
func (r *mutationResolver) RemoveCharacter(ctx context.Context, input graphcore.CharacterRemoveInput) (*models.Character, error) {
character, err := characters.FindID(input.ID)
if err != nil {
return nil, errors.New("Character not found")
}
token := auth.TokenFromContext(ctx)
if !token.PermittedUser(character.Author, "member", "character.remove") {
return nil, errors.New("You are not permitted to remove this character")
}
character, err = characters.Remove(character)
if err != nil {
return nil, errors.New("Failed to remove character: " + err.Error())
}
go changes.Submit("Character", "remove", token.UserID, true, changekeys.Listed(character), character)
return &character, nil
return r.s.Characters.Delete(ctx, input.ID)
}
+9 -5
View File
@@ -6,16 +6,20 @@ import (
)
type queryResolver struct{ s *services.Bundle }
type mutationResolver struct{}
type subscriptionResolver struct{}
type mutationResolver struct{ s *services.Bundle }
type subscriptionResolver struct{ s *services.Bundle }
// QueryResolver has all the queries
func QueryResolver(s *services.Bundle) graphcore.QueryResolver {
return &queryResolver{s: s}
}
// MutationResolver brings the mutagens.
var MutationResolver *mutationResolver
// MutationResolver brings the radioactive goop
func MutationResolver(s *services.Bundle) graphcore.MutationResolver {
return &mutationResolver{s: s}
}
// SubscriptionResolver has the real-time magic.
var SubscriptionResolver *subscriptionResolver
func SubscriptionResolver(s *services.Bundle) graphcore.SubscriptionResolver {
return &subscriptionResolver{s: s}
}
+12 -16
View File
@@ -3,13 +3,16 @@ package types
import (
"context"
"errors"
"git.aiterp.net/rpdata/api/services"
"git.aiterp.net/rpdata/api/internal/loader"
"git.aiterp.net/rpdata/api/models"
"git.aiterp.net/rpdata/api/models/posts"
)
type logResolver struct{}
type logResolver struct {
characters *services.CharacterService
}
func (r *logResolver) Channel(ctx context.Context, log *models.Log) (*models.Channel, error) {
loader := loader.FromContext(ctx)
@@ -21,22 +24,13 @@ func (r *logResolver) Channel(ctx context.Context, log *models.Log) (*models.Cha
}
func (r *logResolver) Characters(ctx context.Context, log *models.Log) ([]*models.Character, error) {
loader := loader.FromContext(ctx)
if loader == nil {
return nil, errors.New("no loader")
if len(log.CharacterIDs) == 0 {
return []*models.Character{}, nil
}
characters, err := loader.Characters("id", log.CharacterIDs...)
if err != nil {
return nil, err
}
characters2 := make([]*models.Character, len(characters))
for i := range characters {
characters2[i] = &characters[i]
}
return characters2, nil
return r.characters.List(ctx, models.CharacterFilter{
IDs: log.CharacterIDs,
})
}
func (r *logResolver) Posts(ctx context.Context, log *models.Log, kinds []string) ([]*models.Post, error) {
@@ -54,4 +48,6 @@ func (r *logResolver) Posts(ctx context.Context, log *models.Log, kinds []string
}
// LogResolver is a resolver
var LogResolver logResolver
func LogResolver(s *services.Bundle) *logResolver {
return &logResolver{characters: s.Characters}
}