# Directives directive @goField( forceResolver: Boolean name: String omittable: Boolean ) on INPUT_FIELD_DEFINITION | FIELD_DEFINITION directive @goModel( model: String models: [String!] ) on OBJECT | INPUT_OBJECT | SCALAR | ENUM | INTERFACE | UNION directive @goEnum(value: String) on ENUM_VALUE # Scalars scalar CursorKey scalar Void scalar Datetime scalar Upload scalar Duration # Interfaces interface Node { id: ID! } # Pagination type PageInfo { hasNextPage: Boolean! hasPreviousPage: Boolean! startCursor: CursorKey endCursor: CursorKey } # Enums enum OrderDirection @goModel(model: "github.com/getprobo/probo/pkg/page.OrderDirection") { ASC @goEnum(value: "github.com/getprobo/probo/pkg/page.OrderDirectionAsc") DESC @goEnum(value: "github.com/getprobo/probo/pkg/page.OrderDirectionDesc") } enum MitigationState @goModel(model: "github.com/getprobo/probo/pkg/coredata.MitigationState") { NOT_STARTED @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationStateNotStarted" ) IN_PROGRESS @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationStateInProgress" ) NOT_APPLICABLE @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationStateNotApplicable" ) IMPLEMENTED @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationStateImplemented" ) } enum TaskState @goModel(model: "github.com/getprobo/probo/pkg/coredata.TaskState") { TODO @goEnum(value: "github.com/getprobo/probo/pkg/coredata.TaskStateTodo") DONE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.TaskStateDone") } enum EvidenceState @goModel(model: "github.com/getprobo/probo/pkg/coredata.EvidenceState") { VALID @goEnum(value: "github.com/getprobo/probo/pkg/coredata.EvidenceStateValid") INVALID @goEnum( value: "github.com/getprobo/probo/pkg/coredata.EvidenceStateInvalid" ) EXPIRED @goEnum( value: "github.com/getprobo/probo/pkg/coredata.EvidenceStateExpired" ) } enum PeopleKind @goModel(model: "github.com/getprobo/probo/pkg/coredata.PeopleKind") { EMPLOYEE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.PeopleKindEmployee") CONTRACTOR @goEnum( value: "github.com/getprobo/probo/pkg/coredata.PeopleKindContractor" ) SERVICE_ACCOUNT @goEnum( value: "github.com/getprobo/probo/pkg/coredata.PeopleKindServiceAccount" ) } enum MitigationImportance @goModel( model: "github.com/getprobo/probo/pkg/coredata.MitigationImportance" ) { MANDATORY @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationImportanceMandatory" ) PREFERRED @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationImportancePreferred" ) ADVANCED @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationImportanceAdvanced" ) } enum ServiceCriticality @goModel(model: "github.com/getprobo/probo/pkg/coredata.ServiceCriticality") { LOW @goEnum( value: "github.com/getprobo/probo/pkg/coredata.ServiceCriticalityLow" ) MEDIUM @goEnum( value: "github.com/getprobo/probo/pkg/coredata.ServiceCriticalityMedium" ) HIGH @goEnum( value: "github.com/getprobo/probo/pkg/coredata.ServiceCriticalityHigh" ) } enum RiskTier @goModel(model: "github.com/getprobo/probo/pkg/coredata.RiskTier") { CRITICAL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.RiskTierCritical") SIGNIFICANT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.RiskTierSignificant") GENERAL @goEnum(value: "github.com/getprobo/probo/pkg/coredata.RiskTierGeneral") } enum PolicyStatus @goModel(model: "github.com/getprobo/probo/pkg/coredata.PolicyStatus") { DRAFT @goEnum(value: "github.com/getprobo/probo/pkg/coredata.PolicyStatusDraft") ACTIVE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.PolicyStatusActive") } enum EvidenceType @goModel(model: "github.com/getprobo/probo/pkg/coredata.EvidenceType") { FILE @goEnum(value: "github.com/getprobo/probo/pkg/coredata.EvidenceTypeFile") LINK @goEnum(value: "github.com/getprobo/probo/pkg/coredata.EvidenceTypeLink") } # Order Field Enums enum UserOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.UserOrderField") { CREATED_AT @goEnum( value: "github.com/getprobo/probo/pkg/coredata.UserOrderFieldCreatedAt" ) } enum PeopleOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.PeopleOrderField") { FULL_NAME @goEnum( value: "github.com/getprobo/probo/pkg/coredata.PeopleOrderFieldFullName" ) CREATED_AT @goEnum( value: "github.com/getprobo/probo/pkg/coredata.PeopleOrderFieldCreatedAt" ) } enum VendorOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.VendorOrderField") { NAME } enum FrameworkOrderField @goModel( model: "github.com/getprobo/probo/pkg/coredata.FrameworkOrderField" ) { CREATED_AT @goEnum( value: "github.com/getprobo/probo/pkg/coredata.FrameworkOrderFieldCreatedAt" ) } enum ControlOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.ControlOrderField") { CREATED_AT @goEnum( value: "github.com/getprobo/probo/pkg/coredata.ControlOrderFieldCreatedAt" ) } enum MitigationOrderField @goModel( model: "github.com/getprobo/probo/pkg/coredata.MitigationOrderField" ) { CREATED_AT @goEnum( value: "github.com/getprobo/probo/pkg/coredata.MitigationOrderFieldCreatedAt" ) } enum TaskOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.TaskOrderField") { CREATED_AT } enum PolicyOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.PolicyOrderField") { NAME } enum EvidenceOrderField @goModel(model: "github.com/getprobo/probo/pkg/coredata.EvidenceOrderField") { CREATED_AT } enum OrganizationOrderField { NAME CREATED_AT UPDATED_AT } # Order Input Types input UserOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.UserOrderBy" ) { direction: OrderDirection! field: UserOrderField! } input PeopleOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.PeopleOrderBy" ) { direction: OrderDirection! field: PeopleOrderField! } input VendorOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.VendorOrderBy" ) { direction: OrderDirection! field: VendorOrderField! } input FrameworkOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.FrameworkOrderBy" ) { direction: OrderDirection! field: FrameworkOrderField! } input ControlOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.ControlOrderBy" ) { direction: OrderDirection! field: ControlOrderField! } input MitigationOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.MitigationOrderBy" ) { direction: OrderDirection! field: MitigationOrderField! } input TaskOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.TaskOrderBy" ) { direction: OrderDirection! field: TaskOrderField! } input PolicyOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.PolicyOrderBy" ) { direction: OrderDirection! field: PolicyOrderField! } input EvidenceOrder @goModel( model: "github.com/getprobo/probo/pkg/server/api/console/v1/types.EvidenceOrderBy" ) { direction: OrderDirection! field: EvidenceOrderField! } input OrganizationOrder { direction: OrderDirection! field: OrganizationOrderField! } # Core Types type Organization implements Node { id: ID! name: String! logoUrl: String @goField(forceResolver: true) users( first: Int after: CursorKey last: Int before: CursorKey orderBy: UserOrder ): UserConnection! @goField(forceResolver: true) frameworks( first: Int after: CursorKey last: Int before: CursorKey orderBy: FrameworkOrder ): FrameworkConnection! @goField(forceResolver: true) vendors( first: Int after: CursorKey last: Int before: CursorKey orderBy: VendorOrder ): VendorConnection! @goField(forceResolver: true) peoples( first: Int after: CursorKey last: Int before: CursorKey orderBy: PeopleOrder ): PeopleConnection! @goField(forceResolver: true) policies( first: Int after: CursorKey last: Int before: CursorKey orderBy: PolicyOrder ): PolicyConnection! @goField(forceResolver: true) mitigations( first: Int after: CursorKey last: Int before: CursorKey orderBy: MitigationOrder ): MitigationConnection! @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! } type User implements Node { id: ID! fullName: String! email: String! createdAt: Datetime! updatedAt: Datetime! } type People implements Node { id: ID! fullName: String! primaryEmailAddress: String! additionalEmailAddresses: [String!]! kind: PeopleKind! createdAt: Datetime! updatedAt: Datetime! } type Vendor implements Node { id: ID! name: String! description: String! serviceStartAt: Datetime! serviceTerminationAt: Datetime serviceCriticality: ServiceCriticality! riskTier: RiskTier! statusPageUrl: String termsOfServiceUrl: String privacyPolicyUrl: String createdAt: Datetime! updatedAt: Datetime! } type Framework implements Node { id: ID! name: String! description: String! controls( first: Int after: CursorKey last: Int before: CursorKey orderBy: ControlOrder ): ControlConnection! @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! } type Control implements Node { id: ID! referenceId: String! name: String! description: String! createdAt: Datetime! updatedAt: Datetime! } type Mitigation implements Node { id: ID! category: String! name: String! description: String! state: MitigationState! importance: MitigationImportance! tasks( first: Int after: CursorKey last: Int before: CursorKey orderBy: TaskOrder ): TaskConnection! @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! } type Task implements Node { id: ID! name: String! description: String! state: TaskState! timeEstimate: Duration assignedTo: People @goField(forceResolver: true) evidences( first: Int after: CursorKey last: Int before: CursorKey orderBy: EvidenceOrder ): EvidenceConnection! @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! } type Evidence implements Node { id: ID! fileUrl: String @goField(forceResolver: true) mimeType: String! size: Int! state: EvidenceState! type: EvidenceType! filename: String! url: String description: String! createdAt: Datetime! updatedAt: Datetime! } type Policy implements Node { id: ID! name: String! status: PolicyStatus! content: String! reviewDate: Datetime owner: People! @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! } type Session { id: ID! expiresAt: Datetime! } type Viewer { id: ID! user: User! organizations( first: Int after: CursorKey last: Int before: CursorKey orderBy: OrganizationOrder ): OrganizationConnection! @goField(forceResolver: true) } # Connection Types type OrganizationConnection { edges: [OrganizationEdge!]! pageInfo: PageInfo! } type OrganizationEdge { cursor: CursorKey! node: Organization! } type UserConnection { edges: [UserEdge!]! pageInfo: PageInfo! } type UserEdge { cursor: CursorKey! node: User! } type PeopleConnection { edges: [PeopleEdge!]! pageInfo: PageInfo! } type PeopleEdge { cursor: CursorKey! node: People! } type VendorConnection { edges: [VendorEdge!]! pageInfo: PageInfo! } type VendorEdge { cursor: CursorKey! node: Vendor! } type FrameworkConnection { edges: [FrameworkEdge!]! pageInfo: PageInfo! } type FrameworkEdge { cursor: CursorKey! node: Framework! } type ControlConnection { edges: [ControlEdge!]! pageInfo: PageInfo! } type ControlEdge { cursor: CursorKey! node: Control! } type MitigationConnection { edges: [MitigationEdge!]! pageInfo: PageInfo! } type MitigationEdge { cursor: CursorKey! node: Mitigation! } type TaskConnection { edges: [TaskEdge!]! pageInfo: PageInfo! } type TaskEdge { cursor: CursorKey! node: Task! } type EvidenceConnection { edges: [EvidenceEdge!]! pageInfo: PageInfo! } type EvidenceEdge { cursor: CursorKey! node: Evidence! } type PolicyConnection { edges: [PolicyEdge!]! pageInfo: PageInfo! } type PolicyEdge { cursor: CursorKey! node: Policy! } # Root Types type Query { node(id: ID!): Node! viewer: Viewer! } type Mutation { # Organization mutations createOrganization( input: CreateOrganizationInput! ): CreateOrganizationPayload! updateOrganization( input: UpdateOrganizationInput! ): UpdateOrganizationPayload! deleteOrganization( input: DeleteOrganizationInput! ): DeleteOrganizationPayload! # User mutations confirmEmail(input: ConfirmEmailInput!): ConfirmEmailPayload! inviteUser(input: InviteUserInput!): InviteUserPayload! removeUser(input: RemoveUserInput!): RemoveUserPayload! # People mutations createPeople(input: CreatePeopleInput!): CreatePeoplePayload! updatePeople(input: UpdatePeopleInput!): UpdatePeoplePayload! deletePeople(input: DeletePeopleInput!): DeletePeoplePayload! # Vendor mutations createVendor(input: CreateVendorInput!): CreateVendorPayload! updateVendor(input: UpdateVendorInput!): UpdateVendorPayload! deleteVendor(input: DeleteVendorInput!): DeleteVendorPayload! # Framework mutations createFramework(input: CreateFrameworkInput!): CreateFrameworkPayload! updateFramework(input: UpdateFrameworkInput!): UpdateFrameworkPayload! importFramework(input: ImportFrameworkInput!): ImportFrameworkPayload! deleteFramework(input: DeleteFrameworkInput!): DeleteFrameworkPayload! # Mitigation mutations createMitigation(input: CreateMitigationInput!): CreateMitigationPayload! updateMitigation(input: UpdateMitigationInput!): UpdateMitigationPayload! importMitigation(input: ImportMitigationInput!): ImportMitigationPayload! # Task mutations createTask(input: CreateTaskInput!): CreateTaskPayload! updateTask(input: UpdateTaskInput!): UpdateTaskPayload! deleteTask(input: DeleteTaskInput!): DeleteTaskPayload! assignTask(input: AssignTaskInput!): AssignTaskPayload! unassignTask(input: UnassignTaskInput!): UnassignTaskPayload! # Evidence mutations uploadEvidence(input: UploadEvidenceInput!): UploadEvidencePayload! deleteEvidence(input: DeleteEvidenceInput!): DeleteEvidencePayload! # Policy mutations createPolicy(input: CreatePolicyInput!): CreatePolicyPayload! updatePolicy(input: UpdatePolicyInput!): UpdatePolicyPayload! deletePolicy(input: DeletePolicyInput!): DeletePolicyPayload! } # Input Types input CreateOrganizationInput { name: String! } input UpdateOrganizationInput { organizationId: ID! name: String logo: Upload } input DeleteOrganizationInput { organizationId: ID! } input CreateVendorInput { organizationId: ID! name: String! description: String! serviceStartAt: Datetime! serviceTerminationAt: Datetime serviceCriticality: ServiceCriticality! riskTier: RiskTier! statusPageUrl: String termsOfServiceUrl: String privacyPolicyUrl: String } input UpdateVendorInput { id: ID! name: String description: String serviceStartAt: Datetime serviceTerminationAt: Datetime serviceCriticality: ServiceCriticality riskTier: RiskTier statusPageUrl: String termsOfServiceUrl: String privacyPolicyUrl: String } input DeleteVendorInput { vendorId: ID! } input CreatePeopleInput { organizationId: ID! fullName: String! primaryEmailAddress: String! additionalEmailAddresses: [String!] kind: PeopleKind! } input UpdatePeopleInput { id: ID! fullName: String primaryEmailAddress: String additionalEmailAddresses: [String!] kind: PeopleKind } input DeletePeopleInput { peopleId: ID! } input CreateFrameworkInput { organizationId: ID! name: String! description: String! } input UpdateFrameworkInput { id: ID! name: String description: String } input ImportFrameworkInput { organizationId: ID! file: Upload! } input DeleteFrameworkInput { frameworkId: ID! } input CreateMitigationInput { organizationId: ID! name: String! description: String! category: String! importance: MitigationImportance! } input UpdateMitigationInput { id: ID! name: String description: String category: String state: MitigationState importance: MitigationImportance } input ImportMitigationInput { organizationId: ID! file: Upload! } input CreateTaskInput { mitigationId: ID! name: String! description: String! timeEstimate: Duration assignedToId: ID } input UpdateTaskInput { taskId: ID! name: String description: String state: TaskState timeEstimate: Duration } input DeleteTaskInput { taskId: ID! } input AssignTaskInput { taskId: ID! assignedToId: ID! } input UnassignTaskInput { taskId: ID! } input UploadEvidenceInput { taskId: ID! name: String! file: Upload type: EvidenceType! url: String description: String! } input DeleteEvidenceInput { evidenceId: ID! } input CreatePolicyInput { organizationId: ID! name: String! content: String! status: PolicyStatus! reviewDate: Datetime ownerId: ID! } input UpdatePolicyInput { id: ID! name: String content: String status: PolicyStatus reviewDate: Datetime ownerId: ID } input DeletePolicyInput { policyId: ID! } input ConfirmEmailInput { token: String! } input InviteUserInput { organizationId: ID! email: String! fullName: String! } input RemoveUserInput { organizationId: ID! userId: ID! } # Payload Types type CreateOrganizationPayload { organizationEdge: OrganizationEdge! } type UpdateOrganizationPayload { organization: Organization! } type DeleteOrganizationPayload { deletedOrganizationId: ID! } type CreateVendorPayload { vendorEdge: VendorEdge! } type UpdateVendorPayload { vendor: Vendor! } type DeleteVendorPayload { deletedVendorId: ID! } type CreatePeoplePayload { peopleEdge: PeopleEdge! } type UpdatePeoplePayload { people: People! } type DeletePeoplePayload { deletedPeopleId: ID! } type CreateFrameworkPayload { frameworkEdge: FrameworkEdge! } type UpdateFrameworkPayload { framework: Framework! } type ImportFrameworkPayload { frameworkEdge: FrameworkEdge! } type DeleteFrameworkPayload { deletedFrameworkId: ID! } type CreateMitigationPayload { mitigationEdge: MitigationEdge! } type UpdateMitigationPayload { mitigation: Mitigation! } type ImportMitigationPayload { mitigationEdges: [MitigationEdge!]! } type CreateTaskPayload { taskEdge: TaskEdge! } type UpdateTaskPayload { task: Task! } type DeleteTaskPayload { deletedTaskId: ID! } type AssignTaskPayload { task: Task! } type UnassignTaskPayload { task: Task! } type UploadEvidencePayload { evidenceEdge: EvidenceEdge! } type DeleteEvidencePayload { deletedEvidenceId: ID! } type CreatePolicyPayload { policyEdge: PolicyEdge! } type UpdatePolicyPayload { policy: Policy! } type DeletePolicyPayload { deletedPolicyId: ID! } type ConfirmEmailPayload { success: Boolean! } type InviteUserPayload { success: Boolean! } type RemoveUserPayload { success: Boolean! }