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
...
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

