Skip to content

GraphQL

The server exposes an async-graphql Federation v2 subgraph with resource CRUD, folder organization, and assessment bundle management.

QueryArgumentsReturnsPurpose
resourceid: ID!ResourceFetch single resource with snapshot
resourcesids: [ID!]![Resource!]!Fetch multiple resources
resourceConnectionpagination argsResourceConnection!Paginated resource list
resourceSnapshotid: ID!BytesRaw snapshot bytes only
forksOfid: ID![Resource!]!List forks of a resource
sharePermissionsid: ID!ResourceSharePermissionsGet sharing permissions
QueryArgumentsReturnsPurpose
folderid: ID!FolderFetch single folder
rootFolders[Folder!]!List top-level folders
subfoldersfolderId: ID![Folder!]!List child folders
QueryArgumentsReturnsPurpose
assessmentBundlenetworkIndex, curriculumIndexAssessmentBundleFetch bundle data
assessmentBundles[AssessmentBundleSummary!]!List all bundles (metadata only)
assessmentBundleVersionnetworkIndex, curriculumIndexIntCheck bundle version

The server implements the _entities resolver for Resource, enabling federation with other subgraphs.

MutationArgumentsPurpose
createResourceinput: CreateResourceInput!Create new resource
pushUpdateid, snapshotPush snapshot bytes
forkResourceidFork a resource
deleteResourceidDelete single resource
deleteResourcesidsBatch delete
duplicateResourcesidsBatch duplicate
toggleVisibilityidToggle public/private
toggleReplicabilityidToggle fork permission
shareResourceid, userId, permissionShare with user
MutationArgumentsPurpose
createFolderinput: CreateFolderInput!Create folder
renameFolderid, nameRename folder
deleteFolderid, keepChildren?Delete folder (optionally reparent children)
moveFolderid, targetFolderIdMove folder (with cycle detection)
moveFolderToParentidMove folder up one level
moveFolderToRootidMove folder to root
moveResourceToFolderresourceId, folderIdMove resource into folder
moveResourcesToFolderresourceIds, folderIdBatch move
moveResourceToParentresourceIdMove resource up one level
moveResourceToRootresourceIdMove resource to root
MutationArgumentsPurpose
refreshAssessmentBundlenetworkIndex, curriculumIndexRefresh via gRPC from diagnostics service
seedAssessmentBundlenetworkIndex, curriculumIndex, dataManual JSON seed
deleteAssessmentBundlenetworkIndex, curriculumIndexDelete bundle
enum Modality {
WHITEBOARD
WORKSHEET
LESSON_PLAN
ASSESSMENT
}
type Resource @key(fields: "id") {
id: ID!
name: String!
description: String
modality: Modality!
snapshot: Bytes
folderId: ID
coverImageUrl: String
isPublic: Boolean!
isReplicable: Boolean!
createdAt: DateTime!
updatedAt: DateTime!
lastViewedAt: DateTime
createdBy: ID!
}
type Folder {
id: ID!
name: String!
parentId: ID
path: [Folder!]! # recursive ancestors
hasSubfolders: Boolean!
createdAt: DateTime!
updatedAt: DateTime!
}

Resource listing uses cursor-based keyset pagination:

type ResourceConnection {
edges: [ResourceEdge!]!
pageInfo: PageInfo!
totalCount: Int!
}
input ResourceFilterInput {
modality: Modality
folderId: ID
search: String
}
SortDescription
CREATED_AT_ASC / CREATED_AT_DESCBy creation time
UPDATED_AT_ASC / UPDATED_AT_DESCBy last update
NAME_ASC / NAME_DESCAlphabetical
LAST_VIEWED_ASC / LAST_VIEWED_DESCBy last viewed
MODALITY_ASC / MODALITY_DESCBy modality type

Cursors encode a CursorPayload with the sort field value and ID for stable keyset pagination. The server fetches N+1 rows to determine hasNextPage.

  • Auth — permission guards on resolvers
  • Resources — resource repository layer
  • Folders — folder repository layer
  • Overview — server architecture