Ontwerp een Geavanceerd GraphQL-schema voor Multi-Context Data Modellering
description
Met deze prompt kun je een flexibel en krachtig GraphQL-schema ontwerpen dat meerdere contexten binnen één API ondersteunt. Dit lost problemen op rond het beheren van verschillende dataviews en gebruiksscenario's zonder meerdere schema's te hoeven onderhouden. Het biedt schaalbaarheid en onderhoudbaarheid, en is uniek omdat het zich richt op contextuele modellen, een aspect dat niet in bestaande prompts aan bod komt.
prompt
Help me een geavanceerd GraphQL-schema te ontwerpen dat multi-context data modellering ondersteunt. Mijn domein is: <beschrijf je domein of toepassingsgebied>. Ik wil ondersteuning voor: <specificeer gewenste contextuele schemaregel ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Hier is een voorbeeld van een geavanceerd GraphQL-schema dat multi-context data modellering ondersteunt voor een sociaal mediaplatform met verschillende gebruikersrollen en contentmoderatie. Het schema maakt gebruik van context-specifieke velden en toegangscontroles, en is ontworpen voor schaalbaarheid en onderhoudbaarheid.
### Kernprincipes:
- **Gebruik van interfaces en union types**: voor gedeelde en variabele data.
- **Context-specifieke velden**: door middel van directives of conditional resolvers.
- **Rolgebaseerde toegangscontrole**: via schema-annotaties of middleware.
- **Flexibel ontwerp**: door scheiding van content, gebruikersrollen en moderatie.
---
### Voorbeeldschema
```graphql
# Gebruikersrollen
enum Role {
ADMIN
MODERATOR
USER
GUEST
}
# Content status
enum ContentStatus {
PUBLISHED
PENDING_REVIEW
REJECTED
}
# Content type met context-specifieke velden
type Post {
id: ID!
title: String!
body: String!
author: User!
createdAt: String!
# Velden die zichtbaar zijn voor alle rollen
status: ContentStatus!
# Velden zichtbaar voor moderators en admins
moderationNotes: String @auth(roles: [MODERATOR, ADMIN])
# Velden die alleen voor admins zichtbaar zijn
internalMetadata: String @auth(roles: [ADMIN])
# Velden die afhankelijk zijn van de context
comments: [Comment!]!
}
# User type
type User {
id: ID!
username: String!
email: String! @auth(roles: [ADMIN, MODERATOR]) # alleen zichtbaar voor admins en moderators
role: Role!
profile: UserProfile
}
type UserProfile {
avatarUrl: String
bio: String
# Velden die zichtbaar zijn voor de gebruiker zelf of moderators
privateData: String @auth(roles: [MODERATOR, USER])
}
# Comment type
type Comment {
id: ID!
content: String!
author: User!
createdAt: String!
# Moderatie velden
flagged: Boolean
moderationNotes: String @auth(roles: [MODERATOR, ADMIN])
}
# Query type met context-gevoelige data
type Query {
posts(filter: PostFilter): [Post!]!
user(id: ID!): User
}
# Filters kunnen context-gevoelig zijn
input PostFilter {
status: ContentStatus
authorId: ID
}
# Mutaties met rolgebaseerde toegangscontrole
type Mutation {
createPost(input: CreatePostInput!): Post @auth(roles: [USER, ADMIN, MODERATOR])
updatePost(id: ID!, input: UpdatePostInput!): Post @auth(roles: [ADMIN, MODERATOR])
deletePost(id: ID!): Boolean @auth(roles: [ADMIN])
moderatePost(id: ID!, action: ModerateAction!): Post @auth(roles: [MODERATOR, ADMIN])
}
input CreatePostInput {
title: String!
body: String!
}
input UpdatePostInput {
title: String
body: String
status: ContentStatus
}
enum ModerateAction {
APPROVE
REJECT
REQUEST_CHANGES
}
```
---
### Toelichting en flexibiliteit
1. **Role-gebaseerde velden**: Velden zoals `email`, `internalMetadata`, en `moderationNotes` worden alleen getoond als de gebruiker de juiste rol heeft, door middel van een aangepaste directive `@auth`. Dit maakt het mogelijk om op schema-niveau zichtbaarheid te regelen afhankelijk van de context (bijvoorbeeld, de ingelogde gebruiker).
2. **Context-specifieke resolvers**: De serverimplementatie kan de resolvers aanpassen op basis van de context (bijvoorbeeld, de ingelogde gebruiker en zijn rol) om te bepalen welke velden en data worden getoond.
3. **Gescheiden data modellen**: Door gebruik te maken van union types en interfaces kunnen verschillende content types en moderatie-werelden worden uitgebreid zonder het hele schema te herschrijven.
4. **Schaalbaarheid en onderhoudbaarheid**: Dit schema maakt het mogelijk om nieuwe rollen, velden of content types toe te voegen door gewoon nieuwe velden of types te definiëren, zonder de bestaande structuur te verstoren.
5. **Middleware en directives**: De `@auth` directive is een voorbeeld van hoe je access control kan integreren in het schema. Je kunt deze implementeren met schema-directives en resolvers die controleren op de gebruikersrol.
---
### Samenvatting
Door gebruik te maken van role- en context-gevoelige velden, directives en gescheiden modellen, biedt dit schema een schaalbare en onderhoudbare basis voor multi-rol en multi-context data modellering binnen één API. Het ondersteunt dynamisch zichtbaarheid en toegangscontrole, essentieel voor een platform met diverse gebruikers en contentmoderatie.
Heeft u specifieke wensen voor bijvoorbeeld real-time updates, meer geavanceerde moderatie workflows, of andere contexten?
provider: deepseek
model: deepseek-chat
Zeker, ik help je graag met een geavanceerd GraphQL-schema voor een sociaal media platform met multi-context ondersteuning. Hieronder vind je een uitgebreide implementatie.
## Schema Definitie
```graphql
# Basis types en interfaces
interface Node {
id: ID!
}
interface Timestamps {
createdAt: DateTime!
updatedAt: DateTime!
}
enum UserRole {
ADMIN
MODERATOR
CONTENT_CREATOR
STANDARD_USER
GUEST
}
enum ContentStatus {
DRAFT
PUBLISHED
FLAGGED
REMOVED
UNDER_REVIEW
}
# Context type voor autorisatie
type AuthContext {
userId: ID
role: UserRole!
permissions: [String!]!
}
# Gebruiker type met rol-gebaseerde velden
type User implements Node & Timestamps {
id: ID!
username: String!
email: String! @visible(roles: [ADMIN, MODERATOR])
profile: UserProfile!
role: UserRole! @visible(roles: [ADMIN, MODERATOR])
status: UserStatus! @visible(roles: [ADMIN, MODERATOR])
lastLogin: DateTime @visible(roles: [ADMIN])
createdAt: DateTime!
updatedAt: DateTime!
# Rol-gebaseerde relaties
posts: [Post!]!
moderatedContent: [Post!]! @visible(roles: [ADMIN, MODERATOR])
moderationHistory: [ModerationAction!]! @visible(roles: [ADMIN, MODERATOR])
}
type UserProfile {
displayName: String!
bio: String
avatar: String
location: String
website: String
isPublic: Boolean!
# Alleen zichtbaar voor admins of de gebruiker zelf
privateEmail: String @visible(roles: [ADMIN])
birthDate: DateTime @visible(roles: [ADMIN, USER_SELF])
}
# Content types met moderatie-ondersteuning
type Post implements Node & Timestamps {
id: ID!
title: String!
content: String!
author: User!
status: ContentStatus!
visibility: ContentVisibility!
# Moderatie-gerelateerde velden
flags: [Flag!]! @visible(roles: [ADMIN, MODERATOR])
moderationHistory: [ModerationAction!]! @visible(roles: [ADMIN, MODERATOR])
removalReason: String @visible(roles: [ADMIN, MODERATOR])
# Metadata
likes: Int!
comments: [Comment!]!
tags: [String!]!
# Gevoelige statistieken
viewCount: Int! @visible(roles: [ADMIN, MODERATOR, CONTENT_CREATOR])
engagementRate: Float! @visible(roles: [ADMIN, MODERATOR])
}
type Comment implements Node & Timestamps {
id: ID!
content: String!
author: User!
post: Post!
parentComment: Comment
status: ContentStatus!
# Moderatie velden
flags: [Flag!]! @visible(roles: [ADMIN, MODERATOR])
removalReason: String @visible(roles: [ADMIN, MODERATOR])
}
# Moderatie systeem
type ModerationAction implements Node & Timestamps {
id: ID!
moderator: User!
target: ModerationTarget!
action: ModerationActionType!
reason: String!
notes: String @visible(roles: [ADMIN])
duration: Int # Voor tijdelijke acties
}
type Flag {
id: ID!
reporter: User!
reason: String!
severity: FlagSeverity!
createdAt: DateTime!
}
# Input types voor mutaties
input CreatePostInput {
title: String!
content: String!
tags: [String!]
visibility: ContentVisibility!
}
input ModerationInput {
targetId: ID!
action: ModerationActionType!
reason: String!
notes: String
duration: Int
}
# Enums
enum ModerationActionType {
REMOVE_CONTENT
RESTORE_CONTENT
SUSPEND_USER
WARN_USER
FLAG_CONTENT
}
enum FlagSeverity {
LOW
MEDIUM
HIGH
CRITICAL
}
enum ContentVisibility {
PUBLIC
PRIVATE
FOLLOWERS_ONLY
UNLISTED
}
# Query type met context-aware resolvers
type Query {
# Publieke queries
posts(
first: Int = 20
after: String
tags: [String!]
sortBy: PostSort = NEWEST
): PostConnection!
post(id: ID!): Post
user(username: String!): User
searchPosts(query: String!): [Post!]!
# Beheerder/moderator queries
moderationQueue: [Post!]! @auth(roles: [ADMIN, MODERATOR])
flaggedContent: [Post!]! @auth(roles: [ADMIN, MODERATOR])
userAnalytics(userId: ID!): UserAnalytics! @auth(roles: [ADMIN, MODERATOR])
# Systeem queries
systemHealth: SystemHealth! @auth(roles: [ADMIN])
}
# Mutatie type met autorisatie
type Mutation {
# Content mutaties
createPost(input: CreatePostInput!): Post! @auth
updatePost(id: ID!, input: UpdatePostInput!): Post! @auth
deletePost(id: ID!): Boolean! @auth
# Moderatie mutaties
flagContent(targetId: ID!, reason: String!): Boolean! @auth
moderateContent(input: ModerationInput!): ModerationAction!
@auth(roles: [ADMIN, MODERATOR])
# Gebruiker beheer
updateUserRole(userId: ID!, role: UserRole!): User!
@auth(roles: [ADMIN])
suspendUser(userId: ID!, duration: Int, reason: String!): Boolean!
@auth(roles: [ADMIN, MODERATOR])
}
# Geavanceerde types voor schaalbaarheid
type PostConnection {
edges: [PostEdge!]!
pageInfo: PageInfo!
totalCount: Int!
moderationCount: Int! @visible(roles: [ADMIN, MODERATOR])
}
type PostEdge {
node: Post!
cursor: String!
}
type PageInfo {
hasNextPage: Boolean!
hasPreviousPage: Boolean!
startCursor: String
endCursor: String
}
type UserAnalytics {
userId: ID!
postCount: Int!
totalViews: Int!
engagementRate: Float!
moderationScore: Float!
recentFlags: Int!
}
type SystemHealth {
databaseStatus: String!
cacheStatus: String!
activeUsers: Int!
moderationQueueSize: Int!
}
```
## Implementatie Strategieën
### 1. Context Management
```graphql
# Directives voor autorisatie
directive @auth(roles: [UserRole]) on FIELD_DEFINITION
directive @visible(roles: [UserRole]) on FIELD_DEFINITION
# Context wrapper in resolvers
type Context {
auth: AuthContext!
requestId: String!
timestamp: DateTime!
}
```
### 2. Field-level Security
Implementeer field-level security met custom directives:
```javascript
// Voorbeeld implementatie in Apollo Server
const authDirective = new SchemaDirectiveVisitor({
visitFieldDefinition(field) {
const { resolve = defaultFieldResolver } = field;
field.resolve = async function (source, args, context, info) {
// Valideer autorisatie op basis van context
const requiredRoles = getRolesFromDirective(field);
if (!hasRequiredRole(context.auth, requiredRoles)) {
throw new ForbiddenError('Onvoldoende rechten');
}
return resolve.call(this, source, args, context, info);
};
}
});
```
### 3. DataLoader Pattern voor Performance
```javascript
// Gebruik DataLoaders voor N+1 query probleem
const createLoaders = () => ({
user: new DataLoader(keys => batchGetUsers(keys)),
post: new DataLoader(keys => batchGetPosts(keys)),
moderationActions: new DataLoader(keys => batchGetModerationActions(keys))
});
```
## Schaalbaarheidskenmerken
### 1. Modular Schema Design
```graphql
# Split schema in modules
extend type Query {
admin: AdminQueries! @auth(roles: [ADMIN])
moderation: ModerationQueries! @auth(roles: [ADMIN, MODERATOR])
}
type AdminQueries {
systemMetrics: SystemMetrics!
userManagement: UserManagement!
}
type ModerationQueries {
queue: ModerationQueue!
reports: ModerationReports!
}
```
### 2. Federation Support
```graphql
# Voor microservices architectuur
extend type User @key(fields: "id") {
id: ID! @external
moderatedContent: [Post!]!
}
extend type Post @key(fields: "id") {
id: ID! @external
moderationHistory: [ModerationAction!]!
}
```
## Best Practices voor Onderhoud
1. **Schema Validation Rules**:
- Gebruik linters voor consistentie
- Documenteer alle types met descriptions
- Versioneer schema changes
2. **Performance Monitoring**:
- Query complexity analysis
- Depth limiting
- Query caching strategies
3. **Error Handling**:
- Uniform error responses
- Field-level error handling
- Contextuele error messages
Dit schema biedt:
- **Flexibiliteit**: Rol-gebaseerde toegang op veld- en type-niveau
- **Schaalbaarheid**: Ondersteuning voor federation en modular design
- **Onderhoudbaarheid**: Duidelijke scheiding van concerns
- **Uitbreidbaarheid**: Eenvoudig nieuwe contexten toe te voegen
Het gebruikt GraphQL's sterke punten voor type-veiligheid en introspectie terwijl het complexe autorisatie-logica elegant afhandelt via directives en context management.