More cache hint tags for Item etc

Trying to get that Item page fast!

I don't really want to ship this as-is, because I'd really like to get stale-while-revalidate working before shipping a 1-week cache timer… will be tricky though!
This commit is contained in:
Emi Matchu 2021-02-02 17:51:54 -08:00
parent f0b3047112
commit c00df62bdc
4 changed files with 33 additions and 23 deletions

View file

@ -6,7 +6,14 @@ const connectToDb = require("./db");
const buildLoaders = require("./loaders");
const rootTypeDefs = gql`
directive @cacheControl(maxAge: Int!) on FIELD_DEFINITION | OBJECT
enum CacheScope {
PUBLIC
PRIVATE
}
directive @cacheControl(
maxAge: Int
scope: CacheScope
) on FIELD_DEFINITION | OBJECT
type Mutation
type Query

View file

@ -1,8 +1,8 @@
const { gql } = require("apollo-server");
const { getRestrictedZoneIds } = require("../util");
const { getRestrictedZoneIds, oneWeek, oneHour } = require("../util");
const typeDefs = gql`
type Item {
type Item @cacheControl(maxAge: ${oneWeek}) {
id: ID!
name: String!
description: String!
@ -19,26 +19,26 @@ const typeDefs = gql`
# item was added so long ago that we don't have this field!
createdAt: String
currentUserOwnsThis: Boolean!
currentUserWantsThis: Boolean!
currentUserOwnsThis: Boolean! @cacheControl(scope: PRIVATE)
currentUserWantsThis: Boolean! @cacheControl(scope: PRIVATE)
# How many users are offering/seeking this in their public trade lists.
numUsersOfferingThis: Int!
numUsersSeekingThis: Int!
numUsersOfferingThis: Int! @cacheControl(maxAge: ${oneHour})
numUsersSeekingThis: Int! @cacheControl(maxAge: ${oneHour})
# The trades available for this item, grouped by offering vs seeking.
tradesOffering: [ItemTrade!]!
tradesSeeking: [ItemTrade!]!
tradesOffering: [ItemTrade!]! @cacheControl(maxAge: 0)
tradesSeeking: [ItemTrade!]! @cacheControl(maxAge: 0)
# How this item appears on the given species/color combo. If it does not
# fit the pet, we'll return an empty ItemAppearance with no layers.
appearanceOn(speciesId: ID!, colorId: ID!): ItemAppearance!
appearanceOn(speciesId: ID!, colorId: ID!): ItemAppearance! @cacheControl(maxAge: ${oneHour})
# This is set manually by Support users, when the pet is only for e.g.
# Maraquan pets, and our usual auto-detection isn't working. We provide
# this for the Support UI; it's not very helpful for most users, because it
# can be empty even if the item _has_ an auto-detected special color.
manualSpecialColor: Color
manualSpecialColor: Color @cacheControl(maxAge: 0)
# This is set manually by Support users, when the item _seems_ to fit all
# pets the same because of its zones, but it actually doesn't - e.g.,
@ -46,30 +46,30 @@ const typeDefs = gql`
# provide this for the Support UI; it's not very helpful for most users,
# because it's only used at modeling time. This value does not change how
# layer data from this API should be interpreted!
explicitlyBodySpecific: Boolean!
explicitlyBodySpecific: Boolean! @cacheControl(maxAge: 0)
# Get the species that we need modeled for this item for the given color.
#
# NOTE: Most color IDs won't be accepted here. Either pass the ID of a
# major special color like Baby (#6), or leave it blank for standard
# bodies like Blue, Green, Red, etc.
speciesThatNeedModels(colorId: ID): [Species!]!
speciesThatNeedModels(colorId: ID): [Species!]! @cacheControl(maxAge: ${oneHour})
# Return a single ItemAppearance for this item. It'll be for the species
# with the smallest ID for which we have item appearance data. We use this
# on the item page, to initialize the preview section. (You can find out
# which species this is for by going through the body field on
# ItemAppearance!)
canonicalAppearance: ItemAppearance
canonicalAppearance: ItemAppearance @cacheControl(maxAge: ${oneHour})
# All zones that this item occupies, for at least one body. That is, it's
# a union of zones for all of its appearances! We use this for overview
# info about the item.
allOccupiedZones: [Zone!]!
allOccupiedZones: [Zone!]! @cacheControl(maxAge: ${oneHour})
# All bodies that this item is compatible with. Note that this might return
# the special representsAllPets body, e.g. if this is just a Background!
compatibleBodies: [Body!]!
compatibleBodies: [Body!]! @cacheControl(maxAge: ${oneHour})
}
type ItemAppearance {

View file

@ -3,18 +3,17 @@ const {
capitalize,
getPoseFromPetState,
getRestrictedZoneIds,
oneWeek,
} = require("../util");
const typeDefs = gql`
# Cache for 1 week (unlikely to change)
type Color @cacheControl(maxAge: 604800) {
type Color @cacheControl(maxAge: ${oneWeek}) {
id: ID!
name: String!
isStandard: Boolean!
}
# Cache for 1 week (unlikely to change)
type Species @cacheControl(maxAge: 604800) {
type Species @cacheControl(maxAge: ${oneWeek}) {
id: ID!
name: String!
@ -38,7 +37,7 @@ const typeDefs = gql`
UNKNOWN # for when we have the data, but we don't know what it is
}
type Body {
type Body @cacheControl(maxAge: ${oneWeek}) {
id: ID!
species: Species!
@ -49,8 +48,7 @@ const typeDefs = gql`
representsAllBodies: Boolean!
}
# Cache for 1 week (unlikely to change)
type PetAppearance @cacheControl(maxAge: 604800) {
type PetAppearance @cacheControl(maxAge: ${oneWeek}) {
id: ID!
species: Species!
color: Color!

View file

@ -148,4 +148,9 @@ module.exports = {
loadBodyName,
logToDiscord,
normalizeRow,
// For Apollo's @cacheControl maxAge: time in seconds.
oneWeek: 604800,
oneDay: 86400,
oneHour: 3600,
};