Documentation
Where GraphQL
Mapper des filtres d'URL vers un objet GraphQL where et inversement.
Les applications doivent souvent alimenter un input GraphQL where depuis des filtres d’URL. Gardez ce mapping explicite: le schema filter-query possede la forme de l’URL, et un petit codec possede la conversion vers et depuis GraphQL.
import {
booleanField,
buildEqFilters,
defineSchema,
enumField,
stringField,
type InferFilters,
} from '@plumile/filter-query';
type ProjectWhere = {
archived?: boolean;
owner?: { id?: string };
status?: 'ACTIVE' | 'PAUSED';
title?: { contains?: string };
};
export const projectFilters = defineSchema({
: stringField(['eq']),
: enumField(['ACTIVE', 'PAUSED'], ['eq']),
: stringField(['contains']),
: booleanField(['eq']),
});
export type ProjectFilters = InferFilters<typeof projectFilters>;
export function toProjectWhere(filters: ProjectFilters): ProjectWhere | null {
const where: ProjectWhere = {};
iffilters.ownerId?.eq != null {
where.owner = {: filters.ownerId.eq };
}
iffilters.status?.eq != null {
where.status = filters.status.eq;
}
iffilters.title?.contains != null {
where.title = {: filters.title.contains };
}
iffilters.archived?.eq != null {
where.archived = filters.archived.eq;
}
return Object.keyswhere.length > 0 ? where : null;
}
export function fromProjectWhere(where: ProjectWhere | null): ProjectFilters {
ifwhere == null {
return buildEqFilters{};
}
return {
...buildEqFilters<typeof projectFilters>{
: where.owner?.id,
: where.status,
: where.archived,
},
...where.title?.contains != null
? {: {: where.title.contains } }
: {},
};
}Utilisez des noms comme ownerId quand l’URL doit rester stable et lisible, meme si l’input GraphQL est imbrique. Gardez les alias et chemins imbriques dans cette couche de mapping plutot que dans l’UI.