enum AccessReviewCampaignStatus @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatus" ) { DRAFT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatusDraft" ) IN_PROGRESS @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatusInProgress" ) PENDING_ACTIONS @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatusPendingActions" ) FAILED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatusFailed" ) COMPLETED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatusCompleted" ) CANCELLED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignStatusCancelled" ) } enum AccessSourceCategory @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessSourceCategory" ) { SAAS @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessSourceCategorySaaS" ) CLOUD_INFRA @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessSourceCategoryCloudInfra" ) SOURCE_CODE @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessSourceCategorySourceCode" ) OTHER @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessSourceCategoryOther" ) } enum AccessReviewCampaignSourceFetchStatus @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignSourceFetchStatus" ) { QUEUED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignSourceFetchStatusQueued" ) FETCHING @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignSourceFetchStatusFetching" ) SUCCESS @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignSourceFetchStatusSuccess" ) FAILED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignSourceFetchStatusFailed" ) } enum AccessEntryFlag @goModel(model: "go.probo.inc/probo/pkg/coredata.AccessEntryFlag") { NONE @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagNone" ) ORPHANED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagOrphaned" ) INACTIVE @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagInactive" ) EXCESSIVE @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagExcessive" ) ROLE_MISMATCH @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagRoleMismatch" ) NEW @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagNew" ) DORMANT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagDormant" ) TERMINATED_USER @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagTerminatedUser" ) CONTRACTOR_EXPIRED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagContractorExpired" ) SOD_CONFLICT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagSoDConflict" ) PRIVILEGED_ACCESS @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagPrivilegedAccess" ) ROLE_CREEP @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagRoleCreep" ) NO_BUSINESS_JUSTIFICATION @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagNoBusinessJustification" ) OUT_OF_DEPARTMENT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagOutOfDepartment" ) SHARED_ACCOUNT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryFlagSharedAccount" ) } enum AccessEntryDecision @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessEntryDecision" ) { PENDING @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryDecisionPending" ) APPROVED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryDecisionApproved" ) REVOKE @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryDecisionRevoke" ) DEFER @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryDecisionDefer" ) ESCALATE @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryDecisionEscalate" ) } enum AccessEntryIncrementalTag @goModel(model: "go.probo.inc/probo/pkg/coredata.AccessEntryIncrementalTag") { NEW @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryIncrementalTagNew" ) REMOVED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryIncrementalTagRemoved" ) UNCHANGED @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryIncrementalTagUnchanged" ) } enum MfaStatus @goModel(model: "go.probo.inc/probo/pkg/coredata.MFAStatus") { ENABLED @goEnum( value: "go.probo.inc/probo/pkg/coredata.MFAStatusEnabled" ) DISABLED @goEnum( value: "go.probo.inc/probo/pkg/coredata.MFAStatusDisabled" ) UNKNOWN @goEnum( value: "go.probo.inc/probo/pkg/coredata.MFAStatusUnknown" ) } enum AccessEntryAuthMethod @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessEntryAuthMethod" ) { SSO @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAuthMethodSSO" ) PASSWORD @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAuthMethodPassword" ) API_KEY @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAuthMethodAPIKey" ) SERVICE_ACCOUNT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAuthMethodServiceAccount" ) UNKNOWN @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAuthMethodUnknown" ) } enum AccessEntryAccountType @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessEntryAccountType" ) { USER @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAccountTypeUser" ) SERVICE_ACCOUNT @goEnum( value: "go.probo.inc/probo/pkg/coredata.AccessEntryAccountTypeServiceAccount" ) } enum AccessSourceOrderField @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessSourceOrderField" ) { CREATED_AT } enum AccessReviewCampaignOrderField @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessReviewCampaignOrderField" ) { CREATED_AT } enum AccessEntryOrderField @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessEntryOrderField" ) { CREATED_AT } enum AccessSourceConnectionStatus { CONNECTED DISCONNECTED NOT_APPLICABLE } input AccessSourceOrder { direction: OrderDirection! field: AccessSourceOrderField! } input AccessReviewCampaignOrder { direction: OrderDirection! field: AccessReviewCampaignOrderField! } input AccessEntryOrder { direction: OrderDirection! field: AccessEntryOrderField! } input AccessEntryFilter @goModel( model: "go.probo.inc/probo/pkg/coredata.AccessEntryFilter" ) { decision: AccessEntryDecision flag: AccessEntryFlag incrementalTag: AccessEntryIncrementalTag isAdmin: Boolean authMethod: AccessEntryAuthMethod accountType: AccessEntryAccountType } type AccessReview implements Node { id: ID! organization: Organization! @goField(forceResolver: true) identitySource: AccessSource @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! accessSources( first: Int after: CursorKey last: Int before: CursorKey orderBy: AccessSourceOrder ): AccessSourceConnection! @goField(forceResolver: true) campaigns( first: Int after: CursorKey last: Int before: CursorKey orderBy: AccessReviewCampaignOrder ): AccessReviewCampaignConnection! @goField(forceResolver: true) permission(action: String!): Boolean! @goField(forceResolver: true) } type ProviderOrganization { slug: String! displayName: String! } type AccessSource implements Node { id: ID! organization: Organization! @goField(forceResolver: true) connectorId: ID connector: Connector @goField(forceResolver: true) name: String! csvData: String providerOrganizations: [ProviderOrganization!]! @goField(forceResolver: true) needsConfiguration: Boolean! @goField(forceResolver: true) connectionStatus: AccessSourceConnectionStatus! @goField(forceResolver: true) selectedOrganization: String @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! permission(action: String!): Boolean! @goField(forceResolver: true) } type AccessReviewCampaignScopeSource @goModel( model: "go.probo.inc/probo/pkg/server/api/console/v1/types.AccessReviewCampaignScopeSource" ) { id: ID! source: AccessSource! name: String! fetchStatus: AccessReviewCampaignSourceFetchStatus! fetchedAccountsCount: Int! attemptCount: Int! lastError: String fetchStartedAt: Datetime fetchCompletedAt: Datetime entries( first: Int after: CursorKey last: Int before: CursorKey orderBy: AccessEntryOrder filter: AccessEntryFilter ): AccessEntryConnection! @goField(forceResolver: true) statistics: AccessReviewCampaignStatistics! @goField(forceResolver: true) } type AccessReviewCampaign implements Node { id: ID! organization: Organization! @goField(forceResolver: true) name: String! description: String! status: AccessReviewCampaignStatus! startedAt: Datetime completedAt: Datetime frameworkControls: [String!] createdAt: Datetime! updatedAt: Datetime! scopeSources: [AccessReviewCampaignScopeSource!]! @goField(forceResolver: true) entries( first: Int after: CursorKey last: Int before: CursorKey orderBy: AccessEntryOrder accessSourceId: ID filter: AccessEntryFilter ): AccessEntryConnection! @goField(forceResolver: true) pendingEntryCount: Int! @goField(forceResolver: true) statistics: AccessReviewCampaignStatistics! @goField(forceResolver: true) permission(action: String!): Boolean! @goField(forceResolver: true) } type AccessEntry implements Node { id: ID! campaign: AccessReviewCampaign! @goField(forceResolver: true) accessSource: AccessSource! @goField(forceResolver: true) email: String! fullName: String! role: String! jobTitle: String! isAdmin: Boolean! mfaStatus: MfaStatus! authMethod: AccessEntryAuthMethod! accountType: AccessEntryAccountType! lastLogin: Datetime accountCreatedAt: Datetime externalId: String! incrementalTag: AccessEntryIncrementalTag! flags: [AccessEntryFlag!]! flagReasons: [String!]! decision: AccessEntryDecision! decisionNote: String decidedBy: ID decidedAt: Datetime decisionHistory: [AccessEntryDecisionHistoryEntry!]! @goField(forceResolver: true) createdAt: Datetime! updatedAt: Datetime! permission(action: String!): Boolean! @goField(forceResolver: true) } type AccessEntryDecisionHistoryEntry { id: ID! decision: AccessEntryDecision! decisionNote: String decidedBy: ID decidedAt: Datetime! createdAt: Datetime! } type AccessSourceConnection @goModel( model: "go.probo.inc/probo/pkg/server/api/console/v1/types.AccessSourceConnection" ) { totalCount: Int! @goField(forceResolver: true) edges: [AccessSourceEdge!]! pageInfo: PageInfo! } type AccessSourceEdge { cursor: CursorKey! node: AccessSource! } type AccessReviewCampaignConnection @goModel( model: "go.probo.inc/probo/pkg/server/api/console/v1/types.AccessReviewCampaignConnection" ) { totalCount: Int! @goField(forceResolver: true) edges: [AccessReviewCampaignEdge!]! pageInfo: PageInfo! } type AccessReviewCampaignEdge { cursor: CursorKey! node: AccessReviewCampaign! } type AccessEntryConnection @goModel( model: "go.probo.inc/probo/pkg/server/api/console/v1/types.AccessEntryConnection" ) { totalCount: Int! @goField(forceResolver: true) edges: [AccessEntryEdge!]! pageInfo: PageInfo! } type AccessEntryEdge { cursor: CursorKey! node: AccessEntry! } type AccessReviewCampaignStatistics { totalCount: Int! decisionCounts: [AccessEntryDecisionCount!]! flagCounts: [AccessEntryFlagCount!]! incrementalTagCounts: [AccessEntryIncrementalTagCount!]! } type AccessEntryDecisionCount { decision: AccessEntryDecision! count: Int! } type AccessEntryFlagCount { flag: AccessEntryFlag! count: Int! } type AccessEntryIncrementalTagCount { incrementalTag: AccessEntryIncrementalTag! count: Int! } extend type Mutation { createAccessSource( input: CreateAccessSourceInput! ): CreateAccessSourcePayload! updateAccessSource( input: UpdateAccessSourceInput! ): UpdateAccessSourcePayload! deleteAccessSource( input: DeleteAccessSourceInput! ): DeleteAccessSourcePayload! configureAccessSource( input: ConfigureAccessSourceInput! ): ConfigureAccessSourcePayload! createAccessReviewCampaign( input: CreateAccessReviewCampaignInput! ): CreateAccessReviewCampaignPayload! updateAccessReviewCampaign( input: UpdateAccessReviewCampaignInput! ): UpdateAccessReviewCampaignPayload! deleteAccessReviewCampaign( input: DeleteAccessReviewCampaignInput! ): DeleteAccessReviewCampaignPayload! startAccessReviewCampaign( input: StartAccessReviewCampaignInput! ): StartAccessReviewCampaignPayload! closeAccessReviewCampaign( input: CloseAccessReviewCampaignInput! ): CloseAccessReviewCampaignPayload! cancelAccessReviewCampaign( input: CancelAccessReviewCampaignInput! ): CancelAccessReviewCampaignPayload! addAccessReviewCampaignScopeSource( input: AddAccessReviewCampaignScopeSourceInput! ): AddAccessReviewCampaignScopeSourcePayload! removeAccessReviewCampaignScopeSource( input: RemoveAccessReviewCampaignScopeSourceInput! ): RemoveAccessReviewCampaignScopeSourcePayload! recordAccessEntryDecision( input: RecordAccessEntryDecisionInput! ): RecordAccessEntryDecisionPayload! recordAccessEntryDecisions( input: RecordAccessEntryDecisionsInput! ): RecordAccessEntryDecisionsPayload! flagAccessEntry( input: FlagAccessEntryInput! ): FlagAccessEntryPayload! } input CreateAccessSourceInput { organizationId: ID! connectorId: ID name: String! csvData: String } type CreateAccessSourcePayload { accessSourceEdge: AccessSourceEdge! } input UpdateAccessSourceInput { accessSourceId: ID! name: String @goField(omittable: true) connectorId: ID @goField(omittable: true) csvData: String @goField(omittable: true) } type UpdateAccessSourcePayload { accessSource: AccessSource! } input DeleteAccessSourceInput { accessSourceId: ID! } type DeleteAccessSourcePayload { deletedAccessSourceId: ID! } input ConfigureAccessSourceInput { accessSourceId: ID! organizationSlug: String! } type ConfigureAccessSourcePayload { accessSource: AccessSource! } input CreateAccessReviewCampaignInput { organizationId: ID! name: String! description: String frameworkControls: [String!] accessSourceIds: [ID!] } type CreateAccessReviewCampaignPayload { accessReviewCampaignEdge: AccessReviewCampaignEdge! } input UpdateAccessReviewCampaignInput { accessReviewCampaignId: ID! name: String @goField(omittable: true) description: String @goField(omittable: true) frameworkControls: [String!] @goField(omittable: true) } type UpdateAccessReviewCampaignPayload { accessReviewCampaign: AccessReviewCampaign! } input DeleteAccessReviewCampaignInput { accessReviewCampaignId: ID! } type DeleteAccessReviewCampaignPayload { deletedAccessReviewCampaignId: ID! } input StartAccessReviewCampaignInput { accessReviewCampaignId: ID! } type StartAccessReviewCampaignPayload { accessReviewCampaign: AccessReviewCampaign! } input CloseAccessReviewCampaignInput { accessReviewCampaignId: ID! } type CloseAccessReviewCampaignPayload { accessReviewCampaign: AccessReviewCampaign! } input CancelAccessReviewCampaignInput { accessReviewCampaignId: ID! } type CancelAccessReviewCampaignPayload { accessReviewCampaign: AccessReviewCampaign! } input AddAccessReviewCampaignScopeSourceInput { accessReviewCampaignId: ID! accessSourceId: ID! } type AddAccessReviewCampaignScopeSourcePayload { accessReviewCampaign: AccessReviewCampaign! } input RemoveAccessReviewCampaignScopeSourceInput { accessReviewCampaignId: ID! accessSourceId: ID! } type RemoveAccessReviewCampaignScopeSourcePayload { accessReviewCampaign: AccessReviewCampaign! } input RecordAccessEntryDecisionInput { accessEntryId: ID! decision: AccessEntryDecision! decisionNote: String } type RecordAccessEntryDecisionPayload { accessEntry: AccessEntry! } input RecordAccessEntryDecisionsInput { decisions: [AccessEntryDecisionInput!]! } input AccessEntryDecisionInput { accessEntryId: ID! decision: AccessEntryDecision! decisionNote: String } type RecordAccessEntryDecisionsPayload { accessEntries: [AccessEntry!]! } input FlagAccessEntryInput { accessEntryId: ID! flags: [AccessEntryFlag!]! flagReasons: [String!] } type FlagAccessEntryPayload { accessEntry: AccessEntry! }