slogan3

Help me een GraphQL-schema te maken met aangepaste directives voor veldniveau transformaties

description

Door het implementeren van aangepaste directives kun je gegevens gemakkelijk transformeren op query-niveau, wat de flexibiliteit en bruikbaarheid van je API verbetert zonder de onderliggende gegevensstructuur te wijzigen.

prompt

try_prompt

Help me bij het ontwerpen van een GraphQL-schema dat aangepaste directives bevat voor het transformeren van velden tijdens de query. Ik wil de volgende details opnemen: - Directive Namen: {{directive_namen}} (bijv. @uppercase, @trim) - Doelvelden: {{ ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een voorbeeld van een GraphQL-schema dat aangepaste directives bevat voor het transformeren van velden tijdens het queryproces. In dit schema definieer ik de directives @uppercase en @trim, en pas ik ze toe op specifieke velden zoals gebruikersnaam en beschrijving. ### 1. Definieer de directives ```graphql directive @uppercase on FIELD_DEFINITION directive @trim on FIELD_DEFINITION ``` ### 2. Voorbeeld van een type met getransformeerde velden ```graphql type Gebruiker { id: ID! gebruikersnaam: String! @uppercase beschrijving: String @trim } ``` ### 3. Het volledige schema inclusief een query ```graphql schema { query: Query } type Query { gebruiker(id: ID!): Gebruiker } type Gebruiker { id: ID! gebruikersnaam: String! @uppercase beschrijving: String @trim } ``` ### 4. Toelichting - **@uppercase**: Transformeert de waarde van het veld naar hoofdletters. - **@trim**: Verwijdert witruimtes aan het begin en einde van de string. ### 5. Implementatie Om deze directives daadwerkelijk te laten werken, moet je de logica implementeren in je GraphQL-server (bijvoorbeeld Apollo Server of GraphQL.js). Dit doe je door middel van schema-transformers of custom resolvers die de directives interpreteren en de waarden aanpassen vóór ze worden geretourneerd. ### 6. Voorbeeld van resolver logica (conceptueel) In JavaScript (bijvoorbeeld Apollo Server): ```javascript const { defaultFieldResolver } = require('graphql'); const schemaDirectives = { uppercase: { resolve: (resolverData, ...args) => { const result = resolverData; if (typeof result === 'string') { return result.toUpperCase(); } return result; } }, trim: { resolve: (resolverData, ...args) => { const result = resolverData; if (typeof result === 'string') { return result.trim(); } return result; } } }; ``` --- **Kort samengevat:** Je schema bevat nu directives `@uppercase` en `@trim`, die je in je server-implementatie moet interpreteren en toepassen tijdens het ophalen van gegevens. Hiermee verbeter je de flexibiliteit van gegevenspresentatie via declaratieve directives in je GraphQL-schema.
provider: deepseek
model: deepseek-chat
Hier is een voorbeeld van een GraphQL-schema met aangepaste directives voor veldtransformatie: ```graphql # Schema Definitie type User { id: ID! gebruikersnaam: String @uppercase beschrijving: String @trim email: String } type Query { getUser(id: ID!): User getAllUsers: [User] } # Directive Definities directive @uppercase on FIELD_DEFINITION directive @trim on FIELD_DEFINITION ``` **Implementatie-voorbeeld (Apollo Server):** ```javascript const { ApolloServer, gql, SchemaDirectiveVisitor } = require('apollo-server'); const { defaultFieldResolver } = require('graphql'); // Uppercase Directive class UppercaseDirective extends SchemaDirectiveVisitor { visitFieldDefinition(field) { const { resolve = defaultFieldResolver } = field; field.resolve = async function (...args) { const result = await resolve.apply(this, args); if (typeof result === 'string') { return result.toUpperCase(); } return result; }; } } // Trim Directive class TrimDirective extends SchemaDirectiveVisitor { visitFieldDefinition(field) { const { resolve = defaultFieldResolver } = field; field.resolve = async function (...args) { const result = await resolve.apply(this, args); if (typeof result === 'string') { return result.trim(); } return result; }; } } const server = new ApolloServer({ typeDefs: gql` # ... bovenstaand schema hier invoegen ... `, resolvers: { Query: { getUser: (_, { id }) => ({ id, gebruikersnaam: 'jan jansen', beschrijving: ' Een test gebruiker ' }), getAllUsers: () => [ { id: '1', gebruikersnaam: 'marie', beschrijving: ' Eerste gebruiker ' }, { id: '2', gebruikersnaam: 'peter', beschrijving: ' Tweede gebruiker ' } ] } }, schemaDirectives: { uppercase: UppercaseDirective, trim: TrimDirective } }); ``` **Gebruiksvoorbeeld query:** ```graphql query { getUser(id: "1") { gebruikersnaam # Wordt "JAN JANSEN" beschrijving # Wordt "Een test gebruiker" (zit spaties) } getAllUsers { gebruikersnaam # Wordt "MARIE", "PETER" beschrijving # Spaties worden verwijderd } } ``` **Belangrijke kenmerken:** - Directives worden toegepast op veldniveau in het schema - Transformatie gebeurt automatisch tijdens query-executie - Behoudt originele data in de database - Eenvoudig uit te breiden met nieuwe directives - Werkt zowel voor enkele objecten als lijsten Je kunt deze directives eenvoudig uitbreiden met extra functionaliteit zoals: - @lowercase - @capitalize - @replace - @maskEmail - Of elke andere gewenste stringtransformatie