package queries import ( "context" "time" "git.aiterp.net/rpdata/api/graphql/resolver/types" "git.aiterp.net/rpdata/api/internal/session" "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) { filter := args.Filter author := "" if filter != nil && filter.Author != nil { author = *filter.Author } category := "" if filter != nil && filter.Category != nil { category = *filter.Category } tags := make([]story.Tag, 0, 8) if filter != nil && filter.Tags != nil { for _, tagInput := range *filter.Tags { tags = append(tags, story.Tag{ Kind: tagInput.Kind, Name: tagInput.Name, }) } } earliest := time.Time{} err := error(nil) if filter != nil && filter.EarliestFictionalDate != nil { earliest, err = time.Parse(time.RFC3339Nano, *filter.EarliestFictionalDate) if err != nil { return nil, err } } latest := time.Time{} if filter != nil && filter.LatestFictionalDate != nil { latest, err = time.Parse(time.RFC3339Nano, *filter.LatestFictionalDate) if err != nil { return nil, err } } unlisted := filter.Unlisted != nil && *filter.Unlisted == true if unlisted { user := session.FromContext(ctx).User() if user == nil { return nil, ErrUnauthorized } if author != "" && author != user.ID && !user.Permitted("story.unlisted") { return nil, ErrPermissionDenied } author = user.ID } open := filter.Open limit := 30 if filter != nil && filter.Limit != nil { limit = int(*filter.Limit) } 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 }