Bird
Raised Fist0
GraphQLquery~10 mins

Schema visibility control in GraphQL - Step-by-Step Execution

Choose your learning style10 modes available
Concept Flow - Schema visibility control
Define full schema
↓
Apply visibility rules
↓
Filter schema elements
↓
Expose filtered schema to client
↓
Client queries visible schema only
Start with the full schema, apply rules to hide or show parts, then expose only visible parts to clients.
Execution Sample
GraphQL
type Query {
  publicData: String
  privateData: String @private
}

schemaVisibility: {
  privateData: false
}
This schema hides 'privateData' field from clients by marking it private and setting visibility to false.
Execution Table
StepSchema ElementVisibility RuleVisible to ClientReason
1Query typeNo ruleYesRoot type always visible
2publicData fieldNo ruleYesNo visibility restriction
3privateData field@private directiveNoMarked private, visibility false
4Expose schemaFilteredOnly publicData visibleprivateData filtered out
5Client querySees only publicDataYesprivateData hidden
💡 All schema elements processed; privateData hidden due to visibility rule
Variable Tracker
Schema ElementInitial VisibilityAfter Rule AppliedFinal Visibility
Query typeVisibleVisibleVisible
publicDataVisibleVisibleVisible
privateDataVisibleHiddenHidden
Key Moments - 2 Insights
Why is 'privateData' not visible to the client even though it is defined in the schema?
Because the visibility rule '@private' and schemaVisibility setting false hide it, as shown in execution_table step 3 and 4.
Does the root Query type ever get hidden by visibility rules?
No, the root Query type remains visible to allow clients to query public fields, as shown in execution_table step 1.
Visual Quiz - 3 Questions
Test your understanding
Look at the execution table, which schema element is hidden from the client?
AQuery type
BprivateData field
CpublicData field
DNone
💡 Hint
Check execution_table row 3 where privateData is marked not visible
At which step does the schema get filtered to hide private fields?
AStep 4
BStep 3
CStep 1
DStep 5
💡 Hint
Look at execution_table step 4 where schema is exposed filtered
If the '@private' directive is removed from 'privateData', what happens to its visibility?
AIt remains hidden
BQuery type becomes hidden
CIt becomes visible
DpublicData becomes hidden
💡 Hint
Refer to variable_tracker where visibility changes after rule applied
Concept Snapshot
Schema visibility control in GraphQL:
- Define full schema with all fields
- Use directives like @private to mark hidden fields
- Apply visibility rules to filter schema
- Expose only visible parts to clients
- Clients can query only visible schema elements
Full Transcript
Schema visibility control means starting with a full GraphQL schema and then applying rules to hide some parts from clients. For example, fields marked with a @private directive can be hidden by setting their visibility to false. The system filters out these hidden fields before sending the schema to clients. This way, clients only see and can query the parts of the schema that are allowed. The root Query type always stays visible so clients have an entry point. This process ensures sensitive or internal data is not exposed unintentionally.

Practice

(1/5)
1. What is the main purpose of schema visibility control in GraphQL?
easy
A. To limit what parts of the schema users can see or access
B. To speed up query execution by caching results
C. To automatically generate schema documentation
D. To convert GraphQL queries into SQL queries

Solution

  1. Step 1: Understand schema visibility control concept

    Schema visibility control is about restricting access to parts of the GraphQL schema based on user roles or permissions.
  2. Step 2: Identify the main goal

    The goal is to protect sensitive data and tailor the API by limiting what users can see or use.
  3. Final Answer:

    To limit what parts of the schema users can see or access -> Option A
  4. Quick Check:

    Schema visibility control = limit schema access [OK]
Hint: Focus on access limits, not performance or docs [OK]
Common Mistakes:
  • Confusing visibility control with caching
  • Thinking it auto-generates docs
  • Assuming it converts queries to SQL
2. Which of the following is a correct way to hide a field in a GraphQL schema using a directive?
easy
A. @deprecated(reason: "hidden") on the field
B. @private on the query operation
C. @skip(if: false) on the schema type
D. @hide(if: true) on the field definition

Solution

  1. Step 1: Understand directive usage for visibility

    Directives like @hide(if: true) can be used on fields to conditionally hide them based on logic.
  2. Step 2: Evaluate options

    @private is not a standard directive; @skip(if: false) means do not skip (show field); @deprecated marks fields as deprecated but does not hide them.
  3. Final Answer:

    @hide(if: true) on the field definition -> Option D
  4. Quick Check:

    Use conditional directives like @hide to control visibility [OK]
Hint: Look for conditional directive on field, not operation [OK]
Common Mistakes:
  • Using @deprecated to hide fields
  • Applying directives on queries instead of fields
  • Misunderstanding @skip logic
3. Given this schema snippet with a visibility directive:
type User {
id: ID!
email: String @hide(if: $isGuest)
name: String
}

What fields will a guest user see if $isGuest is true?
medium
A. id and name only
B. id, email, and name
C. email and name only
D. id and email only

Solution

  1. Step 1: Analyze the directive condition

    The @hide(if: $isGuest) directive hides the email field when $isGuest is true.
  2. Step 2: Determine visible fields for guest

    Since $isGuest is true, email is hidden. The visible fields are id and name.
  3. Final Answer:

    id and name only -> Option A
  4. Quick Check:

    @hide(if: true) hides field = id and name visible [OK]
Hint: True condition hides field, so exclude it [OK]
Common Mistakes:
  • Including hidden fields in output
  • Confusing @hide with @skip
  • Ignoring variable values in directives
4. You wrote this directive to hide a field:
email: String @hide(if: isGuest)

But the field is always visible. What is the likely error?
medium
A. Using @hide on a field is not supported
B. Missing $ before variable name in directive condition
C. The field type String cannot have directives
D. The directive should be @skip, not @hide

Solution

  1. Step 1: Check variable usage in directive

    GraphQL variables in directives must be prefixed with $. Here, isGuest is missing $.
  2. Step 2: Understand impact of missing $

    Without $, the directive condition is invalid or always false, so the field is never hidden.
  3. Final Answer:

    Missing $ before variable name in directive condition -> Option B
  4. Quick Check:

    Variables need $ prefix in directives [OK]
Hint: Always prefix variables with $ in directives [OK]
Common Mistakes:
  • Forgetting $ before variable in directive
  • Assuming @hide is unsupported
  • Thinking directives can't be on scalar fields
5. You want to create a GraphQL API that shows users' email only to admins and hides it from regular users. Which approach best implements this schema visibility control?
hard
A. Return null for email in resolver for regular users without schema changes
B. Remove the email field from the schema entirely
C. Use @hide(if: $isNotAdmin) on the email field and pass $isNotAdmin from server context
D. Use @deprecated directive on email field for regular users

Solution

  1. Step 1: Identify requirement for conditional visibility

    The email field should be visible only to admins, so visibility depends on user role.
  2. Step 2: Evaluate options for controlling visibility

    Use a directive like @hide(if: $isNotAdmin) on the email field and pass $isNotAdmin from server context. This uses a directive with a variable from server context to hide email for non-admins, which is the correct schema visibility control method.
  3. Step 3: Understand why other options fail

    Removing the field removes it for all users; @deprecated only marks as outdated; returning null hides data but not schema field.
  4. Final Answer:

    Use @hide(if: $isNotAdmin) on the email field and pass $isNotAdmin from server context -> Option C
  5. Quick Check:

    Use conditional directives with server variables for visibility [OK]
Hint: Use directives with server variables for role-based hiding [OK]
Common Mistakes:
  • Removing fields instead of hiding conditionally
  • Using @deprecated to hide fields
  • Returning null but not hiding schema field
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard