Answersheet to 'GraphQL: Retrieving data from Masterdata'

// node/index.ts
import {
  LRUCache,
  Service,
  ServiceContext,
  ParamsContext,
  RecorderState,
  method,
} from '@vtex/api'
import { Clients } from './clients'
import { productList } from './resolvers/products'
import { updateLiveUsers } from './event/liveUsersUpdate'
import { analytics } from './handlers/analytics'

const TREE_SECONDS_MS = 3 * 1000
const CONCURRENCY = 10

// Create a LRU memory cache for the Status client.
// The @vtex/api HttpClient respects Cache-Control headers and uses the provided cache.
const memoryCache = new LRUCache<string, any>({ max: 5000 })
metrics.trackCache('status', memoryCache)

declare global {
  type Context = ServiceContext<Clients, State>

  interface State extends RecorderState {
    code: number
  }
}

export default new Service<Clients, State, ParamsContext>({
  clients: {
    implementation: Clients,
    options: {
      default: {
        retries: 2,
        timeout: 10000,
      },
      events: {
        exponentialTimeoutCoefficient: 2,
        exponentialBackoffCoefficient: 2,
        initialBackoffDelay: 50,
        retries: 1,
        timeout: TREE_SECONDS_MS,
        concurrency: CONCURRENCY,
      },
    },
  },
  events: {
    liveUsersUpdate: updateLiveUsers,
  },
  graphql: {
    resolvers: {
      Query: {
        productList,
      },
    },
  },
  routes: {
    analytics: method({
      GET: [analytics],
    }),
  },
})
{
  "name": "backend-course",
  "vendor": "vtex",
  "version": "0.0.2",
  "title": "Backend Course",
  "description": "Reference app for the Backend Course",
  "builders": {
    "graphql": "1.x",
    "docs": "0.x",
    "node": "6.x"
  },
  "scripts": {
    "prereleasy": "bash lint.sh"
  },
  "credentialType": "absolute",
  "policies": [
    {
      "name": "ADMIN_DS"
    },
    {
      "name": "outbound-access",
      "attrs": {
        "host": "api.vtex.com",
        "path": "/dataentities/*"
      }
    }
  ],
  "dependencies": {
    "vtex.events-example": "0.x"
  },
  "$schema": "https://raw.githubusercontent.com/vtex/node-vtex-api/master/gen/manifest.schema"
}
// node/resolvers/product.ts
import { COURSE_ENTITY } from '../utils/constants'

export const productList = async (
  _: any,
  { topN }: { topN: number },
  { clients: { masterdata } }: Context
) =>
  masterdata
    .scrollDocuments({
      dataEntity: COURSE_ENTITY,
      fields: ['count', 'slug'],
      schema: 'v1',
      size: topN,
      sort: `count DESC`,
    })
    .then(({ data }) => data)
# graphql/types/productList.graphql
type ProductList {
  slug: String
  count: Int
}
# graphql/schema.graphql
type Query {
  productList(topN: Int): [ProductView]
}

Help us make this content better!

VTEX IO courses are open source. If you see something wrong, you can open a pull request!

Make a contribution

or open an issue