|
|
package queries
import ( "context" "time"
"git.aiterp.net/rpdata/api/graphql/resolver/types" "git.aiterp.net/rpdata/api/internal/auth" "git.aiterp.net/rpdata/api/model/story" )
// StoriesArg is args for stories query
type StoriesArg struct { Filter *struct { Author *string Tags *[]struct { Kind string Name string } EarliestFictionalDate *string LatestFictionalDate *string Category *string Limit *int32 Open *bool Unlisted *bool } }
// Stories resolves the stories query
func (r *QueryResolver) Stories(ctx context.Context, args *StoriesArg) ([]*types.StoryResolver, error) { var err error
token := auth.TokenFromContext(ctx)
filter := args.Filter
author := "" category := "" tags := make([]story.Tag, 0, 8) earliest := time.Time{} latest := time.Time{} unlisted := false open := (*bool)(nil) limit := 0
if filter != nil { if filter.Author != nil { author = *filter.Author }
if filter.Category != nil { category = *filter.Category }
if filter.Tags != nil { for _, tagInput := range *filter.Tags { tags = append(tags, story.Tag{ Kind: tagInput.Kind, Name: tagInput.Name, }) } }
if filter.EarliestFictionalDate != nil { earliest, err = time.Parse(time.RFC3339Nano, *filter.EarliestFictionalDate) if err != nil { return nil, err } }
if filter.LatestFictionalDate != nil { latest, err = time.Parse(time.RFC3339Nano, *filter.LatestFictionalDate) if err != nil { return nil, err } }
if filter.Limit != nil { limit = int(*filter.Limit) }
unlisted = filter.Unlisted != nil && *filter.Unlisted == true if unlisted { if token == nil { return nil, ErrUnauthorized }
if author != "" && author != token.UserID && !token.Permitted("story.unlisted") { return nil, ErrPermissionDenied }
author = token.UserID }
open = filter.Open }
stories, err := story.List(author, category, tags, earliest, latest, unlisted, open, limit) if err != nil { return nil, err }
resolvers := make([]*types.StoryResolver, len(stories)) for i, story := range stories { resolvers[i] = &types.StoryResolver{S: story} }
return resolvers, nil }
|