Files
traxxx-web/src/web/entities.js

76 lines
1.4 KiB
JavaScript

import { parseResolveInfo } from 'graphql-parse-resolve-info';
import {
fetchEntities,
fetchEntitiesById,
} from '../entities.js';
import { getIdsBySlug } from '../cache.js';
export async function fetchEntitiesApi(req, res) {
const entities = await fetchEntities(req.query);
res.send(entities);
}
export const entitiesSchema = `
extend type Query {
entities(
query: String
type: String
order: [String]
limit: Int! = 30
page: Int! = 1
): EntitiesResult
entity(
slug: String!
): Entity
entitiesBySlug(
slugs: [String]!
): [Entity]
entitiesById(
ids: [Int]!
): [Entity]
}
type EntitiesResult {
nodes: [Entity!]!
}
type Entity {
id: Int!
name: String
slug: String
url: String
type: String
parent: Entity
children: [Entity!]!
}
`;
export async function fetchEntitiesGraphql(query, _req) {
const entities = await fetchEntities(query);
return {
nodes: entities,
};
}
export async function fetchEntitiesByIdGraphql(query, req, info) {
const entityIds = query.ids || await getIdsBySlug([].concat(query.slug, query.slugs).filter(Boolean), 'entities');
const parsedContext = parseResolveInfo(info);
const entities = await fetchEntitiesById(entityIds, {
includeChildren: Object.hasOwn(parsedContext.fieldsByTypeName.Entity, 'children'),
});
if (query.slugs || query.ids) {
return entities;
}
return entities[0];
}