feat: update experiments subgraph to experiments-0.3.0 - #206
Merged
Conversation
diff --git a/tmp/old_sorted.json b/tmp/new_sorted.json
index 99fdafd..7c0aab0 100644
--- a/tmp/old_sorted.json
+++ b/tmp/new_sorted.json
@@ -282,216 +282,6 @@
}
]
},
- {
- "childNodes": [
- {
- "fieldNames": [
- "success",
- "experimentDefinition",
- "errors"
- ],
- "typeName": "CreateExperimentDefinitionResponse"
- },
- {
- "fieldNames": [
- "success",
- "experiments",
- "errors"
- ],
- "typeName": "CreateExperimentsResponse"
- },
- {
- "fieldNames": [
- "edges",
- "pageInfo"
- ],
- "typeName": "ExperimentConnection"
- },
- {
- "fieldNames": [
- "id",
- "name",
- "createdTime",
- "updatedTime",
- "data",
- "dataSchemaUrl",
- "proposalNumber",
- "instrumentSessionNumber",
- "instrumentSession",
- "experiments"
- ],
- "typeName": "ExperimentDefinition"
- },
- {
- "fieldNames": [
- "edges",
- "pageInfo"
- ],
- "typeName": "ExperimentDefinitionConnection"
- },
- {
- "fieldNames": [
- "cursor",
- "node"
- ],
- "typeName": "ExperimentDefinitionEdge"
- },
- {
- "fieldNames": [
- "type",
- "location",
- "message"
- ],
- "typeName": "ExperimentDefinitionErrorDetails"
- },
- {
- "fieldNames": [
- "updateExperimentDefinition",
- "createExperiments"
- ],
- "typeName": "ExperimentDefinitionMutations"
- },
- {
- "fieldNames": [
- "cursor",
- "node"
- ],
- "typeName": "ExperimentEdge"
- },
- {
- "fieldNames": [
- "startCursor",
- "endCursor",
- "hasNextPage",
- "hasPreviousPage"
- ],
- "typeName": "PageInfo"
- },
- {
- "fieldNames": [
- "success",
- "experimentDefinition",
- "errors"
- ],
- "typeName": "UpdateExperimentDefinitionResponse"
- }
- ],
- "customGraphql": {
- "federation": {
- "enabled": true,
- "serviceSdl": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
- },
- "fetch": {
- "baseUrl": {},
- "body": {},
- "method": "POST",
- "path": {},
- "url": {
- "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
- }
- },
- "subscription": {
- "enabled": true,
- "protocol": "GRAPHQL_SUBSCRIPTION_PROTOCOL_WS",
- "url": {
- "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
- },
- "websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
- },
- "upstreamSchema": {
- "key": "205f29cfa96469ebbca12795a6c272d9fca847ee"
- }
- },
- "id": "2",
- "keys": [
- {
- "selectionSet": "id",
- "typeName": "Experiment"
- },
- {
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
- "typeName": "InstrumentSession"
- },
- {
- "selectionSet": "proposalNumber",
- "typeName": "Proposal"
- },
- {
- "selectionSet": "id",
- "typeName": "Sample"
- }
- ],
- "kind": "GRAPHQL",
- "overrideFieldPathFromAlias": true,
- "provides": [
- {
- "fieldName": "sample",
- "selectionSet": "id",
- "typeName": "Experiment"
- },
- {
- "fieldName": "instrumentSession",
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
- "typeName": "ExperimentDefinition"
- }
- ],
- "requestTimeoutSeconds": "10",
- "rootNodes": [
- {
- "fieldNames": [
- "id",
- "name",
- "createdTime",
- "updatedTime",
- "experimentDefinition",
- "sample"
- ],
- "typeName": "Experiment"
- },
- {
- "externalFieldNames": [
- "instrumentSessionNumber",
- "proposal"
- ],
- "fieldNames": [
- "experimentDefinitions",
- "experiments"
- ],
- "typeName": "InstrumentSession"
- },
- {
- "fieldNames": [
- "createExperimentDefinition",
- "experimentDefinition"
- ],
- "typeName": "Mutation"
- },
- {
- "externalFieldNames": [
- "proposalNumber"
- ],
- "typeName": "Proposal"
- },
- {
- "fieldNames": [
- "experimentDefinition",
- "experimentDefinitions",
- "experiment",
- "experiments"
- ],
- "typeName": "Query"
- },
- {
- "externalFieldNames": [
- "id"
- ],
- "fieldNames": [
- "experiments"
- ],
- "typeName": "Sample"
- }
- ]
- },
{
"childNodes": [
{
@@ -727,7 +517,7 @@
"key": "87d4763e6a11a99024dcfdda686cd6b81e7c5665"
}
},
- "id": "3",
+ "id": "2",
"keys": [
{
"selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
@@ -924,7 +714,7 @@
"key": "88826ac63587862b3230559002141c0dc634e5bc"
}
},
- "id": "4",
+ "id": "3",
"keys": [
{
"selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
@@ -1163,7 +953,7 @@
"key": "42f0af102c26cc7df0bfcca4c1e19a298c4f5749"
}
},
- "id": "5",
+ "id": "4",
"keys": [
{
"selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
@@ -1250,6 +1040,248 @@
"typeName": "Query"
}
]
+ },
+ {
+ "childNodes": [
+ {
+ "fieldNames": [
+ "success",
+ "experimentDefinition",
+ "errors"
+ ],
+ "typeName": "CreateExperimentDefinitionResponse"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "experiments",
+ "errors"
+ ],
+ "typeName": "CreateExperimentsResponse"
+ },
+ {
+ "fieldNames": [
+ "type",
+ "location",
+ "message"
+ ],
+ "typeName": "DeleteErrorDetails"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "errors"
+ ],
+ "typeName": "DeleteExperimentResponse"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "errors"
+ ],
+ "typeName": "DeletedExperimentDefinitionResponse"
+ },
+ {
+ "fieldNames": [
+ "edges",
+ "pageInfo"
+ ],
+ "typeName": "ExperimentConnection"
+ },
+ {
+ "fieldNames": [
+ "id",
+ "name",
+ "createdTime",
+ "updatedTime",
+ "data",
+ "dataSchemaUrl",
+ "proposalNumber",
+ "instrumentSessionNumber",
+ "deleted",
+ "createdBy",
+ "modifiedBy",
+ "instrumentSession",
+ "experiments"
+ ],
+ "typeName": "ExperimentDefinition"
+ },
+ {
+ "fieldNames": [
+ "edges",
+ "pageInfo"
+ ],
+ "typeName": "ExperimentDefinitionConnection"
+ },
+ {
+ "fieldNames": [
+ "cursor",
+ "node"
+ ],
+ "typeName": "ExperimentDefinitionEdge"
+ },
+ {
+ "fieldNames": [
+ "type",
+ "location",
+ "message"
+ ],
+ "typeName": "ExperimentDefinitionErrorDetails"
+ },
+ {
+ "fieldNames": [
+ "updateExperimentDefinition",
+ "createExperiments"
+ ],
+ "typeName": "ExperimentDefinitionMutations"
+ },
+ {
+ "fieldNames": [
+ "cursor",
+ "node"
+ ],
+ "typeName": "ExperimentEdge"
+ },
+ {
+ "fieldNames": [
+ "startCursor",
+ "endCursor",
+ "hasNextPage",
+ "hasPreviousPage"
+ ],
+ "typeName": "PageInfo"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "experimentDefinition",
+ "errors"
+ ],
+ "typeName": "UpdateExperimentDefinitionResponse"
+ }
+ ],
+ "customGraphql": {
+ "federation": {
+ "enabled": true,
+ "serviceSdl": "directive @oneOf on INPUT_OBJECT\n\nschema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
+ },
+ "fetch": {
+ "baseUrl": {},
+ "body": {},
+ "method": "POST",
+ "path": {},
+ "url": {
+ "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ }
+ },
+ "subscription": {
+ "enabled": true,
+ "protocol": "GRAPHQL_SUBSCRIPTION_PROTOCOL_WS",
+ "url": {
+ "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ },
+ "websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
+ },
+ "upstreamSchema": {
+ "key": "002a5eb946b470d27322fd7ede391d75321b25b1"
+ }
+ },
+ "id": "5",
+ "keys": [
+ {
+ "selectionSet": "id",
+ "typeName": "Experiment"
+ },
+ {
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "typeName": "InstrumentSession"
+ },
+ {
+ "selectionSet": "proposalNumber",
+ "typeName": "Proposal"
+ },
+ {
+ "selectionSet": "id",
+ "typeName": "Sample"
+ }
+ ],
+ "kind": "GRAPHQL",
+ "overrideFieldPathFromAlias": true,
+ "provides": [
+ {
+ "fieldName": "sample",
+ "selectionSet": "id",
+ "typeName": "Experiment"
+ },
+ {
+ "fieldName": "instrumentSession",
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "typeName": "ExperimentDefinition"
+ }
+ ],
+ "requestTimeoutSeconds": "10",
+ "rootNodes": [
+ {
+ "fieldNames": [
+ "id",
+ "name",
+ "createdTime",
+ "updatedTime",
+ "deleted",
+ "experimentDefinition",
+ "createdBy",
+ "modifiedBy",
+ "sample"
+ ],
+ "typeName": "Experiment"
+ },
+ {
+ "externalFieldNames": [
+ "instrumentSessionNumber",
+ "proposal"
+ ],
+ "fieldNames": [
+ "experimentDefinitions",
+ "experiments"
+ ],
+ "typeName": "InstrumentSession"
+ },
+ {
+ "fieldNames": [
+ "createExperimentDefinition",
+ "experimentDefinition",
+ "deleteExperiment",
+ "restoreExperiment",
+ "deleteExperimentDefinition",
+ "restoreExperimentDefinition"
+ ],
+ "typeName": "Mutation"
+ },
+ {
+ "externalFieldNames": [
+ "proposalNumber"
+ ],
+ "typeName": "Proposal"
+ },
+ {
+ "fieldNames": [
+ "experimentDefinition",
+ "experimentDefinitions",
+ "experiment",
+ "experiments"
+ ],
+ "typeName": "Query"
+ },
+ {
+ "externalFieldNames": [
+ "id"
+ ],
+ "fieldNames": [
+ "experiments"
+ ],
+ "typeName": "Sample"
+ }
+ ]
}
],
"defaultFlushInterval": "500",
@@ -1290,26 +1322,6 @@
"fieldName": "createTrigger",
"typeName": "Mutation"
},
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "createExperimentDefinition",
- "typeName": "Mutation"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "id",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "experimentDefinition",
- "typeName": "Mutation"
- },
{
"argumentsConfiguration": [
{
@@ -1401,26 +1413,22 @@
{
"argumentsConfiguration": [
{
- "name": "id",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "node",
- "typeName": "Query"
+ "fieldName": "createExperimentDefinition",
+ "typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "visit",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "name",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "workflow",
- "typeName": "Query"
+ "fieldName": "experimentDefinition",
+ "typeName": "Mutation"
},
{
"argumentsConfiguration": [
@@ -1429,81 +1437,61 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "workflowById",
- "typeName": "Query"
+ "fieldName": "deleteExperiment",
+ "typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "visit",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "cursor",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "limit",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "filter",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "workflows",
- "typeName": "Query"
+ "fieldName": "restoreExperiment",
+ "typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "name",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "workflowTemplate",
- "typeName": "Query"
+ "fieldName": "deleteExperimentDefinition",
+ "typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "cursor",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "limit",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "filter",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "workflowTemplates",
- "typeName": "Query"
+ "fieldName": "restoreExperimentDefinition",
+ "typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "url",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "jsonSchema",
+ "fieldName": "node",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "type",
+ "name": "visit",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "instrument",
+ "name": "name",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "jsonSchemas",
+ "fieldName": "workflow",
"typeName": "Query"
},
{
@@ -1513,69 +1501,81 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experimentDefinition",
+ "fieldName": "workflowById",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "instrumentSessions",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "first",
+ "name": "visit",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "cursor",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "after",
+ "name": "limit",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "filter",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experimentDefinitions",
+ "fieldName": "workflows",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "id",
+ "name": "name",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experiment",
+ "fieldName": "workflowTemplate",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "instrumentSessions",
+ "name": "cursor",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "first",
+ "name": "limit",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "filter",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "workflowTemplates",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "after",
+ "name": "url",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "jsonSchema",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "type",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "instrument",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experiments",
+ "fieldName": "jsonSchemas",
"typeName": "Query"
},
{
@@ -1854,6 +1854,82 @@
"fieldName": "account",
"typeName": "Query"
},
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experimentDefinition",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "instrumentSessions",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "filter",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "first",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "last",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "after",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "before",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experimentDefinitions",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experiment",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "instrumentSessions",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "first",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "last",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "after",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "before",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experiments",
+ "typeName": "Query"
+ },
{
"argumentsConfiguration": [
{
@@ -1893,8 +1969,8 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "updateExperimentDefinition",
- "typeName": "ExperimentDefinitionMutations"
+ "fieldName": "updateContainer",
+ "typeName": "ContainerMutations"
},
{
"argumentsConfiguration": [
@@ -1903,52 +1979,98 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createExperiments",
- "typeName": "ExperimentDefinitionMutations"
+ "fieldName": "addContainersToContainer",
+ "typeName": "ContainerMutations"
},
{
"argumentsConfiguration": [
{
- "name": "first",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "removeContainersFromContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "last",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "setParentContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "after",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "addSamplesToContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "before",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experimentDefinitions",
- "typeName": "InstrumentSession"
+ "fieldName": "removeSamplesFromContainer",
+ "typeName": "ContainerMutations"
},
{
"argumentsConfiguration": [
{
- "name": "first",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "assignContainerToInstrumentSession",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "last",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "unassignContainerFromInstrumentSession",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "after",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "assignContainerToInstrument",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "before",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experiments",
- "typeName": "InstrumentSession"
+ "fieldName": "unassignContainerFromInstrument",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "updateContainerType",
+ "typeName": "ContainerTypeMutations"
},
{
"argumentsConfiguration": [
@@ -1997,18 +2119,10 @@
{
"name": "before",
"sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "sortBy",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "filterBy",
- "sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSessions",
- "typeName": "Proposal"
+ "fieldName": "experimentDefinitions",
+ "typeName": "InstrumentSession"
},
{
"argumentsConfiguration": [
@@ -2017,7 +2131,7 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -2025,12 +2139,12 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "parents",
- "typeName": "Sample"
+ "fieldName": "experiments",
+ "typeName": "InstrumentSession"
},
{
"argumentsConfiguration": [
@@ -2039,7 +2153,7 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -2047,12 +2161,20 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "before",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "sortBy",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "filterBy",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "children",
- "typeName": "Sample"
+ "fieldName": "instrumentSessions",
+ "typeName": "Proposal"
},
{
"argumentsConfiguration": [
@@ -2073,118 +2195,52 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "events",
+ "fieldName": "parents",
"typeName": "Sample"
},
{
"argumentsConfiguration": [
{
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "updateContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "addContainersToContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "removeContainersFromContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
+ "name": "first",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "setParentContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "addSamplesToContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "after",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "removeSamplesFromContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "assignContainerToInstrumentSession",
- "typeName": "ContainerMutations"
+ "fieldName": "children",
+ "typeName": "Sample"
},
{
"argumentsConfiguration": [
{
- "name": "input",
+ "name": "first",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "unassignContainerFromInstrumentSession",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "assignContainerToInstrument",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "after",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "unassignContainerFromInstrument",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "updateContainerType",
- "typeName": "ContainerTypeMutations"
+ "fieldName": "events",
+ "typeName": "Sample"
},
{
"argumentsConfiguration": [
@@ -2347,11 +2403,31 @@
],
"fieldName": "staff",
"typeName": "Instrument"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "updateExperimentDefinition",
+ "typeName": "ExperimentDefinitionMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "createExperiments",
+ "typeName": "ExperimentDefinitionMutations"
}
],
- "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"The status field for a workflow\"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The name of the workflow template\"\"\"\n template: Template\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype Sample {\n id: UUID!\n experiments: [Experiment!]!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}",
+ "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"The status field for a workflow\"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The name of the workflow template\"\"\"\n template: Template\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\ntype Sample {\n id: UUID!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n experiments: [Experiment!]!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\nscalar UUID\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}",
"stringStorage": {
- "205f29cfa96469ebbca12795a6c272d9fca847ee": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n createdTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
+ "002a5eb946b470d27322fd7ede391d75321b25b1": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\ntype Experiment @key(fields: \"id\") {\n createdBy: String!\n createdTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n modifiedBy: String!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdBy: String!\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n modifiedBy: String!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n stringFilter: StringFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, filter: ExperimentDefinitionFilterInput = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"40f9922fab4b05bbfa98a4bd381e88835018168b": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Artifact {\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"A scalar that can represent any JSON value.\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(name: String, templateRef: String!, visit: VisitInput): Trigger\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, parameters: JSON!, visit: VisitInput!): Workflow!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String @shareable\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean! @shareable\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean! @shareable\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String @shareable\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(name: String!, visit: VisitInput!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, filter: WorkflowTemplatesFilter, limit: Int): WorkflowTemplateConnection!\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(cursor: String, filter: WorkflowFilter, limit: Int, visit: VisitInput!): WorkflowConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(taskId: String!, visit: VisitInput!, workflowName: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(name: String!, visit: VisitInput!): Workflow!\n}\n\ntype Task {\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n}\n\nenum TaskStatus {\n ERROR\n FAILED\n OMITTED\n PENDING\n RUNNING\n SKIPPED\n SUCCEEDED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Session visit Number\"\"\"\n number: Int!\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Session visit Number\"\"\"\n number: Int!\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n}\n\ntype Workflow {\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n}\n\ntype WorkflowConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow! @shareable\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The name of the workflow template\"\"\"\n template: Template\n \"\"\"The status field for a workflow\"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowErroredStatus | WorkflowFailedStatus | WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n error: Boolean! = false\n failed: Boolean! = false\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate! @shareable\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}",
"42f0af102c26cc7df0bfcca4c1e19a298c4f5749": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@key\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Account {\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n emailAddress: String\n familyName: String\n givenName: String\n instrumentSessionRoles: [InstrumentSessionRole!]!\n proposalRoles: [ProposalAccount!]!\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n familyName: StringFilterInput = null\n givenName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n disabled\n enabled\n}\n\nenum AccountType {\n functional\n staff\n user\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n gt: DateTime = null\n gte: DateTime = null\n lt: DateTime = null\n lte: DateTime = null\n neq: DateTime = null\n}\n\ntype Instrument {\n description: String\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n key: String!\n name: String!\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n scienceGroup: String\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(after: String = null, before: String = null, filterBy: AccountFilterInput = null, first: Int = null, last: Int = null, sortBy: [AccountSortInput!] = null): StaffConnection!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal {proposalNumber}\") @key(fields: \"instrumentSessionReference\") {\n endTime: DateTime\n instrument: Instrument!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n proposal: Proposal!\n riskRating: String\n roles: [InstrumentSessionRole!]!\n startTime: DateTime\n state: String\n type: String\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype InstrumentSessionEdge {\n cursor: String! @shareable\n node: InstrumentSession! @shareable\n}\n\ninput InstrumentSessionFilterInput {\n endTime: DateTimeFilterInput = null\n instrumentSessionNumber: IntFilterInput = null\n proposalNumber: IntFilterInput = null\n riskRating: StringFilterInput = null\n startTime: DateTimeFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n type: StringFilterInput = null\n}\n\ntype InstrumentSessionMutations @key(fields: \"instrumentSessionNumber proposalNumber\") {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype InstrumentSessionRole {\n account: Account!\n instrumentSession: InstrumentSession!\n onSite: Boolean!\n role: String!\n}\n\nenum InstrumentSessionSortField {\n endTime\n instrumentSessionNumber\n proposalNumber\n riskRating\n startTime\n state\n type\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n gt: Int = null\n gte: Int = null\n lt: Int = null\n lte: Int = null\n neq: Int = null\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSessionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") @key(fields: \"proposalReference\") {\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n proposalCategory: String\n proposalNumber: Int!\n proposalReference: String\n roles: [ProposalAccount!]!\n state: ProposalState!\n summary: String\n title: String\n}\n\ntype ProposalAccount {\n account: Account!\n proposal: Proposal!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ProposalEdge {\n cursor: String! @shareable\n node: Proposal! @shareable\n}\n\ninput ProposalFilterInput {\n proposalCategory: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n state: ProposalStateFilterInput = null\n title: StringFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n CANCELLED\n CLOSED\n OPEN\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\ntype Query {\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, proposalCategory: String = null, proposalNumber: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n emailAddress: String\n familyName: String\n givenName: String\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype StaffEdge {\n cursor: String! @shareable\n node: Staff! @shareable\n}\n\ninput StringFilterInput {\n contains: String = null\n endsWith: String = null\n eq: String = null\n neq: String = null\n notContains: String = null\n startsWith: String = null\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"87d4763e6a11a99024dcfdda686cd6b81e7c5665": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n success: Boolean!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n errors: [String!]!\n samplePosition: SamplePostion\n success: Boolean!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n errors: [String!]!\n samplePositions: [SamplePostion!]\n success: Boolean!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n \"\"\"The name of the container\"\"\"\n name: String!\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]! @provides(fields: \"sample { id }\")\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ContainerEdge {\n cursor: String! @shareable\n node: Container! @shareable\n}\n\ntype ContainerMutations {\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n}\n\ntype ContainerPosition {\n container: Container\n position: Int\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ContainerTypeEdge {\n cursor: String! @shareable\n node: ContainerType! @shareable\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n}\n\ntype CreateContainerResponse {\n container: Container\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n containerType: ContainerType\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype Mutation {\n \"\"\"Muatations relating to a specific container\"\"\"\n container(barcode: String = null, id: UUID = null): ContainerMutations!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(barcode: String = null, id: UUID = null): Container\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(after: String = null, before: String = null, first: Int = 20, instrumentKeys: [String!]!, last: Int = null): ContainerTypeConnection!\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(after: String = null, before: String = null, first: Int = 20, instrumentKeys: [String!] = null, instrumentSessions: [InstrumentSessionInput!] = null, last: Int = null): ContainerConnection!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\ntype Sample @key(fields: \"id\") {\n \"\"\"The container containing the sample\"\"\"\n container: Container\n id: UUID! @external\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n}\n\ntype SampleMutations @key(fields: \"sampleId\") {\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n sampleId: UUID!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n position: Int = null\n sampleId: UUID!\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n containerPosition: ContainerPosition\n errors: [String!]!\n success: Boolean!\n}\n\nscalar UUID\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n}\n\ntype UpdateContainerResponse {\n container: Container\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n \"\"\"The unique name of the container type\"\"\"\n name: String\n}\n\ntype UpdateContainerTypeResponse {\n containerType: ContainerType\n errors: [String!]!\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
@@ -2372,23 +2448,23 @@
},
{
"id": "2",
- "name": "experiments",
- "routingUrl": "https://api.experiment-definition.diamond.ac.uk/graphql"
- },
- {
- "id": "3",
"name": "containers",
"routingUrl": "https://api.sample-containers.diamond.ac.uk/graphql"
},
{
- "id": "4",
+ "id": "3",
"name": "samples",
"routingUrl": "https://sample-information.diamond.ac.uk/api/graphql"
},
{
- "id": "5",
+ "id": "4",
"name": "instrument_sessions",
"routingUrl": "https://instrument-sessions.diamond.ac.uk/api/graphql"
+ },
+ {
+ "id": "5",
+ "name": "experiments",
+ "routingUrl": "https://api.experiment-definition.diamond.ac.uk/graphql"
}
],
"version": "00000000-0000-0000-0000-000000000000" |
diff --git a/tmp/old_supergraph.graphql b/tmp/new_supergraph.graphql
index 743cb5f..b54c93c 100644
--- a/tmp/old_supergraph.graphql
+++ b/tmp/new_supergraph.graphql
@@ -42,8 +42,6 @@ type Mutation {
"""Create a Trigger from a template"""
createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger
- createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
- experimentDefinition(id: UUID!): ExperimentDefinitionMutations
"""Create a new container type"""
createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!
@@ -60,6 +58,12 @@ type Mutation {
sample(sampleId: UUID!): SampleMutations
createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!
instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations
+ createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
+ experimentDefinition(id: UUID!): ExperimentDefinitionMutations
+ deleteExperiment(id: UUID!): DeleteExperimentResponse
+ restoreExperiment(id: UUID!): DeleteExperimentResponse
+ deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
+ restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
}
"""Represents Relay Node types"""
@@ -106,10 +110,6 @@ type Query {
workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!
jsonSchema(url: String!): JSONSchema
jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!
- experimentDefinition(id: UUID!): ExperimentDefinition
- experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
- experiment(id: UUID!): Experiment
- experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
"""Fetch a single container type, by specifying its name"""
containerType(name: String!): ContainerType
@@ -162,6 +162,10 @@ type Query {
"""Get an account"""
account(username: String!): Account
+ experimentDefinition(id: UUID!): ExperimentDefinition
+ experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
+ experiment(id: UUID!): Experiment
+ experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
}
"""Supported DLS science groups"""
@@ -524,214 +528,6 @@ type JSONSchema {
description: String
}
-"""Values required to create an experiment definition"""
-input CreateExperimentDefinitionInput {
- name: String!
- data: JSON!
- dataSchemaUrl: String!
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-}
-
-"""Return type when creating an experiment definition"""
-type CreateExperimentDefinitionResponse {
- """Whether the operation has succeeded without validation errors"""
- success: Boolean!
-
- """Experiment Definition that has been created"""
- experimentDefinition: ExperimentDefinition
-
- """Errors that occurred during validation"""
- errors: [ExperimentDefinitionErrorDetails!]!
-}
-
-"""Values required for the createExperiments mutation"""
-input CreateExperimentsInput {
- experiments: [ExperimentInput!]!
-}
-
-"""Return type when updating an experiment definition"""
-type CreateExperimentsResponse {
- """Whether the operation has succeeded without errors"""
- success: Boolean!
-
- """Experiments created"""
- experiments: [Experiment!]
-
- """Errors that occurred during experiments creation"""
- errors: [String!]!
-}
-
-type Experiment {
- id: UUID!
- name: String!
- createdTime: DateTime!
- updatedTime: DateTime!
- experimentDefinition: ExperimentDefinition!
-
- """The sample that this experiment is associated with"""
- sample: Sample!
-}
-
-type ExperimentConnection {
- edges: [ExperimentEdge!]!
- pageInfo: PageInfo!
-}
-
-type ExperimentDefinition {
- id: UUID!
- name: String!
- createdTime: DateTime!
- updatedTime: DateTime!
- data: JSON!
- dataSchemaUrl: String!
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-
- """
- The instrument session that this experiment definition is associated with
- """
- instrumentSession: InstrumentSession!
-
- """Experiments associated with this experiment definition"""
- experiments: [Experiment!]!
-}
-
-type ExperimentDefinitionConnection {
- edges: [ExperimentDefinitionEdge!]!
- pageInfo: PageInfo!
-}
-
-type ExperimentDefinitionEdge {
- cursor: String!
- node: ExperimentDefinition!
-}
-
-"""The details of an experiment definition validation error"""
-type ExperimentDefinitionErrorDetails {
- """The type of error that occurred"""
- type: String!
-
- """
- Tuple of strings identifying where in the experiment definition schema the error occurred.
- """
- location: [String!]!
-
- """A human readable error message."""
- message: String!
-}
-
-"""Mutations for a given experiment defintion"""
-type ExperimentDefinitionMutations {
- updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
- createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!
-}
-
-type ExperimentEdge {
- cursor: String!
- node: Experiment!
-}
-
-"""Values required to create an experiment"""
-input ExperimentInput {
- name: String!
- sampleId: UUID!
-}
-
-type InstrumentSession {
- instrumentSessionNumber: Int!
- proposal: Proposal
-
- """Experiment Definitions"""
- experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!
-
- """Experiments associated with this session"""
- experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!
-
- """Samples associated with a given instrument session"""
- samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!
- instrumentSessionId: Int! @deprecated(reason: "instrument_session_id is deprecated and will be removed in a future version.")
- instrumentSessionReference: String
- startTime: DateTime
- endTime: DateTime
- type: String
- state: String
- riskRating: String
- instrument: Instrument!
- roles: [InstrumentSessionRole!]!
-}
-
-"""Values required to uniquely identify an instrument session"""
-input InstrumentSessionInput {
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-}
-
-type Proposal {
- proposalNumber: Int!
- proposalCategory: String
- title: String
- summary: String
- state: ProposalState!
- proposalReference: String
- instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!
- instruments: [Instrument!]!
- roles: [ProposalAccount!]!
-}
-
-type Sample {
- id: UUID!
- experiments: [Experiment!]!
-
- """The container containing the sample"""
- container: Container
-
- """The sample's position within a container"""
- positionInContainer: ContainerPosition
- name: String!
- data: JSON!
- createdTime: DateTime!
- updatedTime: DateTime!
- dataSchemaUrl: String!
-
- """Samples from which this sample is derived"""
- parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
-
- """Samples derived from this sample"""
- children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
-
- """Events linked to this sample"""
- events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!
-
- """The JSON schema that the sample's `data` conforms to"""
- dataSchema: JSON!
-
- """The instrument sessions that this sample is associated with"""
- instrumentSessions: [InstrumentSession!]!
- images: [SampleImage!]!
-}
-
-scalar UUID
-
-"""Values that can be updated on experiment definition"""
-input UpdateExperimentDefinitionInput {
- name: String
- data: JSON
- dataSchemaUrl: String
-}
-
-"""Return type when updating an experiment definition"""
-type UpdateExperimentDefinitionResponse {
- """Whether the operation has succeeded without validation errors"""
- success: Boolean!
-
- """Experiment Definition that has been updated"""
- experimentDefinition: ExperimentDefinition
-
- """Errors that occurred during validation"""
- errors: [ExperimentDefinitionErrorDetails!]!
-}
-
"""Values required to set a container's children"""
input AddContainersToContainerInput {
containerPositions: [ChildContainerPositionInput!]!
@@ -977,6 +773,47 @@ type CreateContainerTypeResponse {
errors: [String!]!
}
+type InstrumentSession {
+ instrumentSessionNumber: Int!
+ proposal: Proposal
+
+ """Samples associated with a given instrument session"""
+ samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!
+ instrumentSessionId: Int! @deprecated(reason: "instrument_session_id is deprecated and will be removed in a future version.")
+ instrumentSessionReference: String
+ startTime: DateTime
+ endTime: DateTime
+ type: String
+ state: String
+ riskRating: String
+ instrument: Instrument!
+ roles: [InstrumentSessionRole!]!
+
+ """Experiment Definitions"""
+ experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!
+
+ """Experiments associated with this session"""
+ experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!
+}
+
+"""Values required to uniquely identify an instrument session"""
+input InstrumentSessionInput {
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+}
+
+type Proposal {
+ proposalNumber: Int!
+ proposalCategory: String
+ title: String
+ summary: String
+ state: ProposalState!
+ proposalReference: String
+ instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!
+ instruments: [Instrument!]!
+ roles: [ProposalAccount!]!
+}
+
"""Values required to remove containers from a container"""
input RemoveContainersFromContainerInput {
containerIds: [UUID!]!
@@ -995,6 +832,38 @@ type RemoveSamplesFromContainerResponse {
success: Boolean!
}
+type Sample {
+ id: UUID!
+
+ """The container containing the sample"""
+ container: Container
+
+ """The sample's position within a container"""
+ positionInContainer: ContainerPosition
+ name: String!
+ data: JSON!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ dataSchemaUrl: String!
+
+ """Samples from which this sample is derived"""
+ parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
+
+ """Samples derived from this sample"""
+ children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
+
+ """Events linked to this sample"""
+ events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!
+
+ """The JSON schema that the sample's `data` conforms to"""
+ dataSchema: JSON!
+
+ """The instrument sessions that this sample is associated with"""
+ instrumentSessions: [InstrumentSession!]!
+ images: [SampleImage!]!
+ experiments: [Experiment!]!
+}
+
type SampleMutations {
sampleId: UUID!
@@ -1028,6 +897,8 @@ type SetParentContainerResponse {
errors: [String!]!
}
+scalar UUID
+
"""Values required to unassign a contianer from an instrument"""
input UnassignContainerFromInstrumentInput {
"""
@@ -1542,4 +1413,258 @@ input StringFilterInput {
notContains: String = null
startsWith: String = null
endsWith: String = null
+}
+
+"""Values required to create an experiment definition"""
+input CreateExperimentDefinitionInput {
+ name: String!
+ data: JSON!
+ dataSchemaUrl: String!
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+}
+
+"""Return type when creating an experiment definition"""
+type CreateExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Experiment Definition that has been created"""
+ experimentDefinition: ExperimentDefinition
+
+ """Errors that occurred during validation"""
+ errors: [ExperimentDefinitionErrorDetails!]!
+}
+
+"""Values required for the createExperiments mutation"""
+input CreateExperimentsInput {
+ experiments: [ExperimentInput!]!
+}
+
+"""Return type when updating an experiment definition"""
+type CreateExperimentsResponse {
+ """Whether the operation has succeeded without errors"""
+ success: Boolean!
+
+ """Experiments created"""
+ experiments: [Experiment!]
+
+ """Errors that occurred during experiments creation"""
+ errors: [String!]!
+}
+
+input DatetimeFilterInputV2 {
+ """
+ Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value
+ """
+ greaterThan: DateTime = null
+
+ """
+ Will filter to items where the `DateTime` field is less than (i.e. before) the provided value
+ """
+ lessThan: DateTime = null
+}
+
+"""The details of an deleted record validation error"""
+type DeleteErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the record schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Return type when marking an record as deleted"""
+type DeleteExperimentResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+"""Return type when marking an record as deleted"""
+type DeletedExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+type Experiment {
+ id: UUID!
+ name: String!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ deleted: Boolean!
+ experimentDefinition: ExperimentDefinition!
+ createdBy: String!
+ modifiedBy: String!
+
+ """The sample that this experiment is associated with"""
+ sample: Sample!
+}
+
+type ExperimentConnection {
+ edges: [ExperimentEdge!]!
+ pageInfo: PageInfo!
+}
+
+type ExperimentDefinition {
+ id: UUID!
+ name: String!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ data: JSON!
+ dataSchemaUrl: String!
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+ deleted: Boolean!
+ createdBy: String!
+ modifiedBy: String!
+
+ """
+ The instrument session that this experiment definition is associated with
+ """
+ instrumentSession: InstrumentSession!
+
+ """Experiments associated with this experiment definition"""
+ experiments: [Experiment!]!
+}
+
+type ExperimentDefinitionConnection {
+ edges: [ExperimentDefinitionEdge!]!
+ pageInfo: PageInfo!
+}
+
+type ExperimentDefinitionEdge {
+ cursor: String!
+ node: ExperimentDefinition!
+}
+
+"""The details of an experiment definition validation error"""
+type ExperimentDefinitionErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the experiment definition schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Values required to filter a list of experiment definitions"""
+input ExperimentDefinitionFilterInput {
+ """Filter by the name of experiment definitions"""
+ name: StringFilterInputV2 = null
+
+ """Filter by the created datetime of experiment definitions"""
+ createdTime: DatetimeFilterInputV2 = null
+
+ """Filter by the update datetime of experiment definitions"""
+ updatedTime: DatetimeFilterInputV2 = null
+
+ """Filter by the data schema URL of experiment definitions"""
+ dataSchemaUrl: StringFilterInputV2 = null
+
+ """Filter within the JSON data of experiment definitions"""
+ data: [JSONFilterInputV2!] = null
+}
+
+"""Mutations for a given experiment defintion"""
+type ExperimentDefinitionMutations {
+ updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
+ createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!
+}
+
+type ExperimentEdge {
+ cursor: String!
+ node: Experiment!
+}
+
+"""Values required to create an experiment"""
+input ExperimentInput {
+ name: String!
+ sampleId: UUID!
+}
+
+input JSONFilterConditionInput @oneOf {
+ stringFilter: StringFilterInputV2 = null
+ datetimeFilter: DatetimeFilterInputV2 = null
+ numericFilter: NumericFilterInputV2 = null
+}
+
+input JSONFilterInputV2 {
+ """The JSON path to the field to filter. Must start with '$.'"""
+ path: String!
+
+ """The filter operation to apply to the field"""
+ condition: JSONFilterConditionInput!
+}
+
+input NumericFilterInputV2 {
+ """
+ Will filter to items where the numeric field is greater than the provided value
+ """
+ greaterThan: Float = null
+
+ """
+ Will filter to items where the numeric field is less than the provided value
+ """
+ lessThan: Float = null
+}
+
+input StringFilterInputV2 {
+ """
+ Will filter to items where the `String` field is a member of the provided value
+ """
+ in: [String!] = null
+
+ """
+ Will filter to items where the `String` field is equal to the provided value
+ """
+ equalTo: String = null
+
+ """
+ Will filter to items where the `String` field is not equal to the provided value
+ """
+ notEqualTo: String = null
+
+ """
+ Will filter to items where the `String` field is not a member of the provided value
+ """
+ notIn: [String!] = null
+
+ """
+ Will filter to items where the `String` field is contains the provided value
+ """
+ contains: String = null
+}
+
+"""Values that can be updated on experiment definition"""
+input UpdateExperimentDefinitionInput {
+ name: String
+ data: JSON
+ dataSchemaUrl: String
+}
+
+"""Return type when updating an experiment definition"""
+type UpdateExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Experiment Definition that has been updated"""
+ experimentDefinition: ExperimentDefinition
+
+ """Errors that occurred during validation"""
+ errors: [ExperimentDefinitionErrorDetails!]!
}
\ No newline at end of file |
TBThomas56
reviewed
Aug 13, 2026
TBThomas56
reviewed
Aug 13, 2026
TBThomas56
previously requested changes
Aug 13, 2026
Collaborator
|
@DiamondLightSource/ulims-team |
diff --git a/tmp/old_sorted.json b/tmp/new_sorted.json
index e17295d..f99e7a9 100644
--- a/tmp/old_sorted.json
+++ b/tmp/new_sorted.json
@@ -301,216 +301,6 @@
}
]
},
- {
- "childNodes": [
- {
- "fieldNames": [
- "success",
- "experimentDefinition",
- "errors"
- ],
- "typeName": "CreateExperimentDefinitionResponse"
- },
- {
- "fieldNames": [
- "success",
- "experiments",
- "errors"
- ],
- "typeName": "CreateExperimentsResponse"
- },
- {
- "fieldNames": [
- "edges",
- "pageInfo"
- ],
- "typeName": "ExperimentConnection"
- },
- {
- "fieldNames": [
- "id",
- "name",
- "createdTime",
- "updatedTime",
- "data",
- "dataSchemaUrl",
- "proposalNumber",
- "instrumentSessionNumber",
- "instrumentSession",
- "experiments"
- ],
- "typeName": "ExperimentDefinition"
- },
- {
- "fieldNames": [
- "edges",
- "pageInfo"
- ],
- "typeName": "ExperimentDefinitionConnection"
- },
- {
- "fieldNames": [
- "cursor",
- "node"
- ],
- "typeName": "ExperimentDefinitionEdge"
- },
- {
- "fieldNames": [
- "type",
- "location",
- "message"
- ],
- "typeName": "ExperimentDefinitionErrorDetails"
- },
- {
- "fieldNames": [
- "updateExperimentDefinition",
- "createExperiments"
- ],
- "typeName": "ExperimentDefinitionMutations"
- },
- {
- "fieldNames": [
- "cursor",
- "node"
- ],
- "typeName": "ExperimentEdge"
- },
- {
- "fieldNames": [
- "startCursor",
- "endCursor",
- "hasNextPage",
- "hasPreviousPage"
- ],
- "typeName": "PageInfo"
- },
- {
- "fieldNames": [
- "success",
- "experimentDefinition",
- "errors"
- ],
- "typeName": "UpdateExperimentDefinitionResponse"
- }
- ],
- "customGraphql": {
- "federation": {
- "enabled": true,
- "serviceSdl": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
- },
- "fetch": {
- "baseUrl": {},
- "body": {},
- "method": "POST",
- "path": {},
- "url": {
- "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
- }
- },
- "subscription": {
- "enabled": true,
- "protocol": "GRAPHQL_SUBSCRIPTION_PROTOCOL_WS",
- "url": {
- "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
- },
- "websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
- },
- "upstreamSchema": {
- "key": "205f29cfa96469ebbca12795a6c272d9fca847ee"
- }
- },
- "id": "2",
- "keys": [
- {
- "selectionSet": "id",
- "typeName": "Experiment"
- },
- {
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
- "typeName": "InstrumentSession"
- },
- {
- "selectionSet": "proposalNumber",
- "typeName": "Proposal"
- },
- {
- "selectionSet": "id",
- "typeName": "Sample"
- }
- ],
- "kind": "GRAPHQL",
- "overrideFieldPathFromAlias": true,
- "provides": [
- {
- "fieldName": "sample",
- "selectionSet": "id",
- "typeName": "Experiment"
- },
- {
- "fieldName": "instrumentSession",
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
- "typeName": "ExperimentDefinition"
- }
- ],
- "requestTimeoutSeconds": "10",
- "rootNodes": [
- {
- "fieldNames": [
- "id",
- "name",
- "createdTime",
- "updatedTime",
- "experimentDefinition",
- "sample"
- ],
- "typeName": "Experiment"
- },
- {
- "externalFieldNames": [
- "instrumentSessionNumber",
- "proposal"
- ],
- "fieldNames": [
- "experimentDefinitions",
- "experiments"
- ],
- "typeName": "InstrumentSession"
- },
- {
- "fieldNames": [
- "createExperimentDefinition",
- "experimentDefinition"
- ],
- "typeName": "Mutation"
- },
- {
- "externalFieldNames": [
- "proposalNumber"
- ],
- "typeName": "Proposal"
- },
- {
- "fieldNames": [
- "experimentDefinition",
- "experimentDefinitions",
- "experiment",
- "experiments"
- ],
- "typeName": "Query"
- },
- {
- "externalFieldNames": [
- "id"
- ],
- "fieldNames": [
- "experiments"
- ],
- "typeName": "Sample"
- }
- ]
- },
{
"childNodes": [
{
@@ -746,7 +536,7 @@
"key": "87d4763e6a11a99024dcfdda686cd6b81e7c5665"
}
},
- "id": "3",
+ "id": "2",
"keys": [
{
"selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
@@ -967,7 +757,7 @@
"key": "42f0af102c26cc7df0bfcca4c1e19a298c4f5749"
}
},
- "id": "4",
+ "id": "3",
"keys": [
{
"selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
@@ -1055,6 +845,248 @@
}
]
},
+ {
+ "childNodes": [
+ {
+ "fieldNames": [
+ "success",
+ "experimentDefinition",
+ "errors"
+ ],
+ "typeName": "CreateExperimentDefinitionResponse"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "experiments",
+ "errors"
+ ],
+ "typeName": "CreateExperimentsResponse"
+ },
+ {
+ "fieldNames": [
+ "type",
+ "location",
+ "message"
+ ],
+ "typeName": "DeleteErrorDetails"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "errors"
+ ],
+ "typeName": "DeleteExperimentResponse"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "errors"
+ ],
+ "typeName": "DeletedExperimentDefinitionResponse"
+ },
+ {
+ "fieldNames": [
+ "edges",
+ "pageInfo"
+ ],
+ "typeName": "ExperimentConnection"
+ },
+ {
+ "fieldNames": [
+ "id",
+ "name",
+ "createdTime",
+ "updatedTime",
+ "data",
+ "dataSchemaUrl",
+ "proposalNumber",
+ "instrumentSessionNumber",
+ "deleted",
+ "createdBy",
+ "modifiedBy",
+ "instrumentSession",
+ "experiments"
+ ],
+ "typeName": "ExperimentDefinition"
+ },
+ {
+ "fieldNames": [
+ "edges",
+ "pageInfo"
+ ],
+ "typeName": "ExperimentDefinitionConnection"
+ },
+ {
+ "fieldNames": [
+ "cursor",
+ "node"
+ ],
+ "typeName": "ExperimentDefinitionEdge"
+ },
+ {
+ "fieldNames": [
+ "type",
+ "location",
+ "message"
+ ],
+ "typeName": "ExperimentDefinitionErrorDetails"
+ },
+ {
+ "fieldNames": [
+ "updateExperimentDefinition",
+ "createExperiments"
+ ],
+ "typeName": "ExperimentDefinitionMutations"
+ },
+ {
+ "fieldNames": [
+ "cursor",
+ "node"
+ ],
+ "typeName": "ExperimentEdge"
+ },
+ {
+ "fieldNames": [
+ "startCursor",
+ "endCursor",
+ "hasNextPage",
+ "hasPreviousPage"
+ ],
+ "typeName": "PageInfo"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "experimentDefinition",
+ "errors"
+ ],
+ "typeName": "UpdateExperimentDefinitionResponse"
+ }
+ ],
+ "customGraphql": {
+ "federation": {
+ "enabled": true,
+ "serviceSdl": "directive @oneOf on INPUT_OBJECT\n\nschema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
+ },
+ "fetch": {
+ "baseUrl": {},
+ "body": {},
+ "method": "POST",
+ "path": {},
+ "url": {
+ "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ }
+ },
+ "subscription": {
+ "enabled": true,
+ "protocol": "GRAPHQL_SUBSCRIPTION_PROTOCOL_WS",
+ "url": {
+ "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ },
+ "websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
+ },
+ "upstreamSchema": {
+ "key": "002a5eb946b470d27322fd7ede391d75321b25b1"
+ }
+ },
+ "id": "4",
+ "keys": [
+ {
+ "selectionSet": "id",
+ "typeName": "Experiment"
+ },
+ {
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "typeName": "InstrumentSession"
+ },
+ {
+ "selectionSet": "proposalNumber",
+ "typeName": "Proposal"
+ },
+ {
+ "selectionSet": "id",
+ "typeName": "Sample"
+ }
+ ],
+ "kind": "GRAPHQL",
+ "overrideFieldPathFromAlias": true,
+ "provides": [
+ {
+ "fieldName": "sample",
+ "selectionSet": "id",
+ "typeName": "Experiment"
+ },
+ {
+ "fieldName": "instrumentSession",
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "typeName": "ExperimentDefinition"
+ }
+ ],
+ "requestTimeoutSeconds": "10",
+ "rootNodes": [
+ {
+ "fieldNames": [
+ "id",
+ "name",
+ "createdTime",
+ "updatedTime",
+ "deleted",
+ "experimentDefinition",
+ "createdBy",
+ "modifiedBy",
+ "sample"
+ ],
+ "typeName": "Experiment"
+ },
+ {
+ "externalFieldNames": [
+ "instrumentSessionNumber",
+ "proposal"
+ ],
+ "fieldNames": [
+ "experimentDefinitions",
+ "experiments"
+ ],
+ "typeName": "InstrumentSession"
+ },
+ {
+ "fieldNames": [
+ "createExperimentDefinition",
+ "experimentDefinition",
+ "deleteExperiment",
+ "restoreExperiment",
+ "deleteExperimentDefinition",
+ "restoreExperimentDefinition"
+ ],
+ "typeName": "Mutation"
+ },
+ {
+ "externalFieldNames": [
+ "proposalNumber"
+ ],
+ "typeName": "Proposal"
+ },
+ {
+ "fieldNames": [
+ "experimentDefinition",
+ "experimentDefinitions",
+ "experiment",
+ "experiments"
+ ],
+ "typeName": "Query"
+ },
+ {
+ "externalFieldNames": [
+ "id"
+ ],
+ "fieldNames": [
+ "experiments"
+ ],
+ "typeName": "Sample"
+ }
+ ]
+ },
{
"childNodes": [
{
@@ -1347,17 +1379,17 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createExperimentDefinition",
+ "fieldName": "createContainerType",
"typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "id",
+ "name": "name",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experimentDefinition",
+ "fieldName": "containerType",
"typeName": "Mutation"
},
{
@@ -1367,17 +1399,21 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createContainerType",
+ "fieldName": "createContainer",
"typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "name",
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "barcode",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "containerType",
+ "fieldName": "container",
"typeName": "Mutation"
},
{
@@ -1387,21 +1423,21 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createContainer",
+ "fieldName": "createInstrumentSession",
"typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "id",
+ "name": "proposalNumber",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "barcode",
+ "name": "instrumentSessionNumber",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "container",
+ "fieldName": "instrumentSession",
"typeName": "Mutation"
},
{
@@ -1411,21 +1447,57 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createInstrumentSession",
+ "fieldName": "createExperimentDefinition",
"typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "proposalNumber",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "experimentDefinition",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "instrumentSessionNumber",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSession",
+ "fieldName": "deleteExperiment",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "restoreExperiment",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "deleteExperimentDefinition",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "restoreExperimentDefinition",
"typeName": "Mutation"
},
{
@@ -1604,78 +1676,6 @@
"fieldName": "jsonSchemas",
"typeName": "Query"
},
- {
- "argumentsConfiguration": [
- {
- "name": "id",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "experimentDefinition",
- "typeName": "Query"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "instrumentSessions",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "first",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "last",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "after",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "before",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "experimentDefinitions",
- "typeName": "Query"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "id",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "experiment",
- "typeName": "Query"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "instrumentSessions",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "first",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "last",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "after",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "before",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "experiments",
- "typeName": "Query"
- },
{
"argumentsConfiguration": [
{
@@ -1908,6 +1908,82 @@
"fieldName": "account",
"typeName": "Query"
},
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experimentDefinition",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "instrumentSessions",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "filter",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "first",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "last",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "after",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "before",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experimentDefinitions",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experiment",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "instrumentSessions",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "first",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "last",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "after",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "before",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experiments",
+ "typeName": "Query"
+ },
{
"argumentsConfiguration": [
{
@@ -1991,8 +2067,8 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "updateExperimentDefinition",
- "typeName": "ExperimentDefinitionMutations"
+ "fieldName": "updateContainer",
+ "typeName": "ContainerMutations"
},
{
"argumentsConfiguration": [
@@ -2001,8 +2077,98 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createExperiments",
- "typeName": "ExperimentDefinitionMutations"
+ "fieldName": "addContainersToContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "removeContainersFromContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "setParentContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "addSamplesToContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "removeSamplesFromContainer",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "assignContainerToInstrumentSession",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "unassignContainerFromInstrumentSession",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "assignContainerToInstrument",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "unassignContainerFromInstrument",
+ "typeName": "ContainerMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "updateContainerType",
+ "typeName": "ContainerTypeMutations"
},
{
"argumentsConfiguration": [
@@ -2174,116 +2340,6 @@
"fieldName": "events",
"typeName": "Sample"
},
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "updateContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "addContainersToContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "removeContainersFromContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "setParentContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "addSamplesToContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "removeSamplesFromContainer",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "assignContainerToInstrumentSession",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "unassignContainerFromInstrumentSession",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "assignContainerToInstrument",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "unassignContainerFromInstrument",
- "typeName": "ContainerMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "updateContainerType",
- "typeName": "ContainerTypeMutations"
- },
{
"argumentsConfiguration": [
{
@@ -2445,11 +2501,31 @@
],
"fieldName": "createOrValidateSamples",
"typeName": "InstrumentSessionMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "updateExperimentDefinition",
+ "typeName": "ExperimentDefinitionMutations"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "createExperiments",
+ "typeName": "ExperimentDefinitionMutations"
}
],
- "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(visit: VisitInput!, manifest: String!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n deleteSample(sampleId: UUID!): DeleteSampleResponse!\n restoreSample(sampleId: UUID!): RestoreSampleResponse!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n}\n\ntype TriggerConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype Sample {\n id: UUID!\n experiments: [Experiment!]!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"Return type when deleting a sample\"\"\"\ntype DeleteSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\n\"\"\"Return type when restoring a deleted sample\"\"\"\ntype RestoreSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating a sample\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void",
+ "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(visit: VisitInput!, manifest: String!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n deleteSample(sampleId: UUID!): DeleteSampleResponse!\n restoreSample(sampleId: UUID!): RestoreSampleResponse!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n}\n\ntype TriggerConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\ntype Sample {\n id: UUID!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n experiments: [Experiment!]!\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\nscalar UUID\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"Return type when deleting a sample\"\"\"\ntype DeleteSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\n\"\"\"Return type when restoring a deleted sample\"\"\"\ntype RestoreSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating a sample\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void",
"stringStorage": {
- "205f29cfa96469ebbca12795a6c272d9fca847ee": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n createdTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
+ "002a5eb946b470d27322fd7ede391d75321b25b1": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\ntype Experiment @key(fields: \"id\") {\n createdBy: String!\n createdTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n modifiedBy: String!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdBy: String!\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n modifiedBy: String!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n stringFilter: StringFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, filter: ExperimentDefinitionFilterInput = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"42f0af102c26cc7df0bfcca4c1e19a298c4f5749": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@key\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Account {\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n emailAddress: String\n familyName: String\n givenName: String\n instrumentSessionRoles: [InstrumentSessionRole!]!\n proposalRoles: [ProposalAccount!]!\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n familyName: StringFilterInput = null\n givenName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n disabled\n enabled\n}\n\nenum AccountType {\n functional\n staff\n user\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n gt: DateTime = null\n gte: DateTime = null\n lt: DateTime = null\n lte: DateTime = null\n neq: DateTime = null\n}\n\ntype Instrument {\n description: String\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n key: String!\n name: String!\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n scienceGroup: String\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(after: String = null, before: String = null, filterBy: AccountFilterInput = null, first: Int = null, last: Int = null, sortBy: [AccountSortInput!] = null): StaffConnection!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal {proposalNumber}\") @key(fields: \"instrumentSessionReference\") {\n endTime: DateTime\n instrument: Instrument!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n proposal: Proposal!\n riskRating: String\n roles: [InstrumentSessionRole!]!\n startTime: DateTime\n state: String\n type: String\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype InstrumentSessionEdge {\n cursor: String! @shareable\n node: InstrumentSession! @shareable\n}\n\ninput InstrumentSessionFilterInput {\n endTime: DateTimeFilterInput = null\n instrumentSessionNumber: IntFilterInput = null\n proposalNumber: IntFilterInput = null\n riskRating: StringFilterInput = null\n startTime: DateTimeFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n type: StringFilterInput = null\n}\n\ntype InstrumentSessionMutations @key(fields: \"instrumentSessionNumber proposalNumber\") {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype InstrumentSessionRole {\n account: Account!\n instrumentSession: InstrumentSession!\n onSite: Boolean!\n role: String!\n}\n\nenum InstrumentSessionSortField {\n endTime\n instrumentSessionNumber\n proposalNumber\n riskRating\n startTime\n state\n type\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n gt: Int = null\n gte: Int = null\n lt: Int = null\n lte: Int = null\n neq: Int = null\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSessionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") @key(fields: \"proposalReference\") {\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n proposalCategory: String\n proposalNumber: Int!\n proposalReference: String\n roles: [ProposalAccount!]!\n state: ProposalState!\n summary: String\n title: String\n}\n\ntype ProposalAccount {\n account: Account!\n proposal: Proposal!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ProposalEdge {\n cursor: String! @shareable\n node: Proposal! @shareable\n}\n\ninput ProposalFilterInput {\n proposalCategory: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n state: ProposalStateFilterInput = null\n title: StringFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n CANCELLED\n CLOSED\n OPEN\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\ntype Query {\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, proposalCategory: String = null, proposalNumber: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n emailAddress: String\n familyName: String\n givenName: String\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype StaffEdge {\n cursor: String! @shareable\n node: Staff! @shareable\n}\n\ninput StringFilterInput {\n contains: String = null\n endsWith: String = null\n eq: String = null\n neq: String = null\n notContains: String = null\n startsWith: String = null\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"87d4763e6a11a99024dcfdda686cd6b81e7c5665": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n success: Boolean!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n errors: [String!]!\n samplePosition: SamplePostion\n success: Boolean!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n errors: [String!]!\n samplePositions: [SamplePostion!]\n success: Boolean!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n \"\"\"The name of the container\"\"\"\n name: String!\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]! @provides(fields: \"sample { id }\")\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ContainerEdge {\n cursor: String! @shareable\n node: Container! @shareable\n}\n\ntype ContainerMutations {\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n}\n\ntype ContainerPosition {\n container: Container\n position: Int\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ContainerTypeEdge {\n cursor: String! @shareable\n node: ContainerType! @shareable\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n}\n\ntype CreateContainerResponse {\n container: Container\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n containerType: ContainerType\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype Mutation {\n \"\"\"Muatations relating to a specific container\"\"\"\n container(barcode: String = null, id: UUID = null): ContainerMutations!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(barcode: String = null, id: UUID = null): Container\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(after: String = null, before: String = null, first: Int = 20, instrumentKeys: [String!]!, last: Int = null): ContainerTypeConnection!\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(after: String = null, before: String = null, first: Int = 20, instrumentKeys: [String!] = null, instrumentSessions: [InstrumentSessionInput!] = null, last: Int = null): ContainerConnection!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\ntype Sample @key(fields: \"id\") {\n \"\"\"The container containing the sample\"\"\"\n container: Container\n id: UUID! @external\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n}\n\ntype SampleMutations @key(fields: \"sampleId\") {\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n sampleId: UUID!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n position: Int = null\n sampleId: UUID!\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n containerPosition: ContainerPosition\n errors: [String!]!\n success: Boolean!\n}\n\nscalar UUID\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n}\n\ntype UpdateContainerResponse {\n container: Container\n errors: [String!]!\n success: Boolean!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n \"\"\"The unique name of the container type\"\"\"\n name: String\n}\n\ntype UpdateContainerTypeResponse {\n containerType: ContainerType\n errors: [String!]!\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"ab9040c814f11559b1e7d93f67b38b284f1bf0d3": "schema {\n query: Query\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The description og the schema\"\"\"\n description: String\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The version of the schema\"\"\"\n version: String\n}\n\ntype Query {\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(instrument: String = null, type: String = null): [JSONSchema!]!\n}",
@@ -2470,19 +2546,19 @@
},
{
"id": "2",
- "name": "experiments",
- "routingUrl": "https://api.experiment-definition.diamond.ac.uk/graphql"
- },
- {
- "id": "3",
"name": "containers",
"routingUrl": "https://api.sample-containers.diamond.ac.uk/graphql"
},
{
- "id": "4",
+ "id": "3",
"name": "instrument_sessions",
"routingUrl": "https://instrument-sessions.diamond.ac.uk/api/graphql"
},
+ {
+ "id": "4",
+ "name": "experiments",
+ "routingUrl": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ },
{
"id": "5",
"name": "samples", |
diff --git a/tmp/old_supergraph.graphql b/tmp/new_supergraph.graphql
index d92706c..397f62d 100644
--- a/tmp/old_supergraph.graphql
+++ b/tmp/new_supergraph.graphql
@@ -66,8 +66,6 @@ type Mutation {
"""Create a Trigger from a template"""
createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger
- createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
- experimentDefinition(id: UUID!): ExperimentDefinitionMutations
"""Create a new container type"""
createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!
@@ -82,6 +80,12 @@ type Mutation {
container(id: UUID = null, barcode: String = null): ContainerMutations!
createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!
instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations
+ createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
+ experimentDefinition(id: UUID!): ExperimentDefinitionMutations
+ deleteExperiment(id: UUID!): DeleteExperimentResponse
+ restoreExperiment(id: UUID!): DeleteExperimentResponse
+ deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
+ restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!
sample(sampleId: UUID!): SampleMutations
deleteSample(sampleId: UUID!): DeleteSampleResponse!
@@ -138,10 +142,6 @@ type Query {
triggers(cursor: String, limit: Int): TriggerConnection!
jsonSchema(url: String!): JSONSchema
jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!
- experimentDefinition(id: UUID!): ExperimentDefinition
- experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
- experiment(id: UUID!): Experiment
- experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
"""Fetch a single container type, by specifying its name"""
containerType(name: String!): ContainerType
@@ -188,6 +188,10 @@ type Query {
"""Get an account"""
account(username: String!): Account
+ experimentDefinition(id: UUID!): ExperimentDefinition
+ experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
+ experiment(id: UUID!): Experiment
+ experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
"""Get a sample by its id"""
sample(sampleId: UUID!): Sample
@@ -609,215 +613,6 @@ type JSONSchema {
description: String
}
-"""Values required to create an experiment definition"""
-input CreateExperimentDefinitionInput {
- name: String!
- data: JSON!
- dataSchemaUrl: String!
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-}
-
-"""Return type when creating an experiment definition"""
-type CreateExperimentDefinitionResponse {
- """Whether the operation has succeeded without validation errors"""
- success: Boolean!
-
- """Experiment Definition that has been created"""
- experimentDefinition: ExperimentDefinition
-
- """Errors that occurred during validation"""
- errors: [ExperimentDefinitionErrorDetails!]!
-}
-
-"""Values required for the createExperiments mutation"""
-input CreateExperimentsInput {
- experiments: [ExperimentInput!]!
-}
-
-"""Return type when updating an experiment definition"""
-type CreateExperimentsResponse {
- """Whether the operation has succeeded without errors"""
- success: Boolean!
-
- """Experiments created"""
- experiments: [Experiment!]
-
- """Errors that occurred during experiments creation"""
- errors: [String!]!
-}
-
-type Experiment {
- id: UUID!
- name: String!
- createdTime: DateTime!
- updatedTime: DateTime!
- experimentDefinition: ExperimentDefinition!
-
- """The sample that this experiment is associated with"""
- sample: Sample!
-}
-
-type ExperimentConnection {
- edges: [ExperimentEdge!]!
- pageInfo: PageInfo!
-}
-
-type ExperimentDefinition {
- id: UUID!
- name: String!
- createdTime: DateTime!
- updatedTime: DateTime!
- data: JSON!
- dataSchemaUrl: String!
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-
- """
- The instrument session that this experiment definition is associated with
- """
- instrumentSession: InstrumentSession!
-
- """Experiments associated with this experiment definition"""
- experiments: [Experiment!]!
-}
-
-type ExperimentDefinitionConnection {
- edges: [ExperimentDefinitionEdge!]!
- pageInfo: PageInfo!
-}
-
-type ExperimentDefinitionEdge {
- cursor: String!
- node: ExperimentDefinition!
-}
-
-"""The details of an experiment definition validation error"""
-type ExperimentDefinitionErrorDetails {
- """The type of error that occurred"""
- type: String!
-
- """
- Tuple of strings identifying where in the experiment definition schema the error occurred.
- """
- location: [String!]!
-
- """A human readable error message."""
- message: String!
-}
-
-"""Mutations for a given experiment defintion"""
-type ExperimentDefinitionMutations {
- updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
- createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!
-}
-
-type ExperimentEdge {
- cursor: String!
- node: Experiment!
-}
-
-"""Values required to create an experiment"""
-input ExperimentInput {
- name: String!
- sampleId: UUID!
-}
-
-type InstrumentSession {
- instrumentSessionNumber: Int!
- proposal: Proposal
-
- """Experiment Definitions"""
- experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!
-
- """Experiments associated with this session"""
- experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!
- instrumentSessionId: Int! @deprecated(reason: "instrument_session_id is deprecated and will be removed in a future version.")
- instrumentSessionReference: String
- startTime: DateTime
- endTime: DateTime
- type: String
- state: String
- riskRating: String
- instrument: Instrument!
- roles: [InstrumentSessionRole!]!
-
- """Samples associated with a given instrument session"""
- samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!
-}
-
-"""Values required to uniquely identify an instrument session"""
-input InstrumentSessionInput {
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-}
-
-type Proposal {
- proposalNumber: Int!
- proposalCategory: String
- title: String
- summary: String
- state: ProposalState!
- proposalReference: String
- instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!
- instruments: [Instrument!]!
- roles: [ProposalAccount!]!
-}
-
-type Sample {
- id: UUID!
- experiments: [Experiment!]!
-
- """The container containing the sample"""
- container: Container
-
- """The sample's position within a container"""
- positionInContainer: ContainerPosition
- name: String!
- data: JSON!
- createdTime: DateTime!
- updatedTime: DateTime!
- dataSchemaUrl: String!
- deleted: Boolean!
-
- """Samples from which this sample is derived"""
- parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
-
- """Samples derived from this sample"""
- children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
-
- """Events linked to this sample"""
- events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!
-
- """The JSON schema that the sample's `data` conforms to"""
- dataSchema: JSON!
-
- """The instrument sessions that this sample is associated with"""
- instrumentSessions: [InstrumentSession!]!
- images: [SampleImage!]!
-}
-
-scalar UUID
-
-"""Values that can be updated on experiment definition"""
-input UpdateExperimentDefinitionInput {
- name: String
- data: JSON
- dataSchemaUrl: String
-}
-
-"""Return type when updating an experiment definition"""
-type UpdateExperimentDefinitionResponse {
- """Whether the operation has succeeded without validation errors"""
- success: Boolean!
-
- """Experiment Definition that has been updated"""
- experimentDefinition: ExperimentDefinition
-
- """Errors that occurred during validation"""
- errors: [ExperimentDefinitionErrorDetails!]!
-}
-
"""Values required to set a container's children"""
input AddContainersToContainerInput {
containerPositions: [ChildContainerPositionInput!]!
@@ -1063,6 +858,47 @@ type CreateContainerTypeResponse {
errors: [String!]!
}
+type InstrumentSession {
+ instrumentSessionNumber: Int!
+ proposal: Proposal
+ instrumentSessionId: Int! @deprecated(reason: "instrument_session_id is deprecated and will be removed in a future version.")
+ instrumentSessionReference: String
+ startTime: DateTime
+ endTime: DateTime
+ type: String
+ state: String
+ riskRating: String
+ instrument: Instrument!
+ roles: [InstrumentSessionRole!]!
+
+ """Experiment Definitions"""
+ experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!
+
+ """Experiments associated with this session"""
+ experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!
+
+ """Samples associated with a given instrument session"""
+ samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!
+}
+
+"""Values required to uniquely identify an instrument session"""
+input InstrumentSessionInput {
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+}
+
+type Proposal {
+ proposalNumber: Int!
+ proposalCategory: String
+ title: String
+ summary: String
+ state: ProposalState!
+ proposalReference: String
+ instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!
+ instruments: [Instrument!]!
+ roles: [ProposalAccount!]!
+}
+
"""Values required to remove containers from a container"""
input RemoveContainersFromContainerInput {
containerIds: [UUID!]!
@@ -1081,6 +917,39 @@ type RemoveSamplesFromContainerResponse {
success: Boolean!
}
+type Sample {
+ id: UUID!
+
+ """The container containing the sample"""
+ container: Container
+
+ """The sample's position within a container"""
+ positionInContainer: ContainerPosition
+ experiments: [Experiment!]!
+ name: String!
+ data: JSON!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ dataSchemaUrl: String!
+ deleted: Boolean!
+
+ """Samples from which this sample is derived"""
+ parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
+
+ """Samples derived from this sample"""
+ children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
+
+ """Events linked to this sample"""
+ events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!
+
+ """The JSON schema that the sample's `data` conforms to"""
+ dataSchema: JSON!
+
+ """The instrument sessions that this sample is associated with"""
+ instrumentSessions: [InstrumentSession!]!
+ images: [SampleImage!]!
+}
+
type SampleMutations {
sampleId: UUID!
@@ -1114,6 +983,8 @@ type SetParentContainerResponse {
errors: [String!]!
}
+scalar UUID
+
"""Values required to unassign a contianer from an instrument"""
input UnassignContainerFromInstrumentInput {
"""
@@ -1398,6 +1269,260 @@ input StringFilterInput {
endsWith: String = null
}
+"""Values required to create an experiment definition"""
+input CreateExperimentDefinitionInput {
+ name: String!
+ data: JSON!
+ dataSchemaUrl: String!
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+}
+
+"""Return type when creating an experiment definition"""
+type CreateExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Experiment Definition that has been created"""
+ experimentDefinition: ExperimentDefinition
+
+ """Errors that occurred during validation"""
+ errors: [ExperimentDefinitionErrorDetails!]!
+}
+
+"""Values required for the createExperiments mutation"""
+input CreateExperimentsInput {
+ experiments: [ExperimentInput!]!
+}
+
+"""Return type when updating an experiment definition"""
+type CreateExperimentsResponse {
+ """Whether the operation has succeeded without errors"""
+ success: Boolean!
+
+ """Experiments created"""
+ experiments: [Experiment!]
+
+ """Errors that occurred during experiments creation"""
+ errors: [String!]!
+}
+
+input DatetimeFilterInputV2 {
+ """
+ Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value
+ """
+ greaterThan: DateTime = null
+
+ """
+ Will filter to items where the `DateTime` field is less than (i.e. before) the provided value
+ """
+ lessThan: DateTime = null
+}
+
+"""The details of an deleted record validation error"""
+type DeleteErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the record schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Return type when marking an record as deleted"""
+type DeleteExperimentResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+"""Return type when marking an record as deleted"""
+type DeletedExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+type Experiment {
+ id: UUID!
+ name: String!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ deleted: Boolean!
+ experimentDefinition: ExperimentDefinition!
+ createdBy: String!
+ modifiedBy: String!
+
+ """The sample that this experiment is associated with"""
+ sample: Sample!
+}
+
+type ExperimentConnection {
+ edges: [ExperimentEdge!]!
+ pageInfo: PageInfo!
+}
+
+type ExperimentDefinition {
+ id: UUID!
+ name: String!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ data: JSON!
+ dataSchemaUrl: String!
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+ deleted: Boolean!
+ createdBy: String!
+ modifiedBy: String!
+
+ """
+ The instrument session that this experiment definition is associated with
+ """
+ instrumentSession: InstrumentSession!
+
+ """Experiments associated with this experiment definition"""
+ experiments: [Experiment!]!
+}
+
+type ExperimentDefinitionConnection {
+ edges: [ExperimentDefinitionEdge!]!
+ pageInfo: PageInfo!
+}
+
+type ExperimentDefinitionEdge {
+ cursor: String!
+ node: ExperimentDefinition!
+}
+
+"""The details of an experiment definition validation error"""
+type ExperimentDefinitionErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the experiment definition schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Values required to filter a list of experiment definitions"""
+input ExperimentDefinitionFilterInput {
+ """Filter by the name of experiment definitions"""
+ name: StringFilterInputV2 = null
+
+ """Filter by the created datetime of experiment definitions"""
+ createdTime: DatetimeFilterInputV2 = null
+
+ """Filter by the update datetime of experiment definitions"""
+ updatedTime: DatetimeFilterInputV2 = null
+
+ """Filter by the data schema URL of experiment definitions"""
+ dataSchemaUrl: StringFilterInputV2 = null
+
+ """Filter within the JSON data of experiment definitions"""
+ data: [JSONFilterInputV2!] = null
+}
+
+"""Mutations for a given experiment defintion"""
+type ExperimentDefinitionMutations {
+ updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
+ createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!
+}
+
+type ExperimentEdge {
+ cursor: String!
+ node: Experiment!
+}
+
+"""Values required to create an experiment"""
+input ExperimentInput {
+ name: String!
+ sampleId: UUID!
+}
+
+input JSONFilterConditionInput @oneOf {
+ stringFilter: StringFilterInputV2 = null
+ datetimeFilter: DatetimeFilterInputV2 = null
+ numericFilter: NumericFilterInputV2 = null
+}
+
+input JSONFilterInputV2 {
+ """The JSON path to the field to filter. Must start with '$.'"""
+ path: String!
+
+ """The filter operation to apply to the field"""
+ condition: JSONFilterConditionInput!
+}
+
+input NumericFilterInputV2 {
+ """
+ Will filter to items where the numeric field is greater than the provided value
+ """
+ greaterThan: Float = null
+
+ """
+ Will filter to items where the numeric field is less than the provided value
+ """
+ lessThan: Float = null
+}
+
+input StringFilterInputV2 {
+ """
+ Will filter to items where the `String` field is a member of the provided value
+ """
+ in: [String!] = null
+
+ """
+ Will filter to items where the `String` field is equal to the provided value
+ """
+ equalTo: String = null
+
+ """
+ Will filter to items where the `String` field is not equal to the provided value
+ """
+ notEqualTo: String = null
+
+ """
+ Will filter to items where the `String` field is not a member of the provided value
+ """
+ notIn: [String!] = null
+
+ """
+ Will filter to items where the `String` field is contains the provided value
+ """
+ contains: String = null
+}
+
+"""Values that can be updated on experiment definition"""
+input UpdateExperimentDefinitionInput {
+ name: String
+ data: JSON
+ dataSchemaUrl: String
+}
+
+"""Return type when updating an experiment definition"""
+type UpdateExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Experiment Definition that has been updated"""
+ experimentDefinition: ExperimentDefinition
+
+ """Errors that occurred during validation"""
+ errors: [ExperimentDefinitionErrorDetails!]!
+}
+
input AddSampleEventInput {
description: String!
} |
VictoriaBeilsten-Edmands
previously approved these changes
Aug 14, 2026
diff --git a/tmp/old_sorted.json b/tmp/new_sorted.json
index 962a55e..0f3173c 100644
--- a/tmp/old_sorted.json
+++ b/tmp/new_sorted.json
@@ -305,100 +305,116 @@
"childNodes": [
{
"fieldNames": [
- "success",
- "experimentDefinition",
- "errors"
+ "username",
+ "emailAddress",
+ "title",
+ "givenName",
+ "familyName",
+ "type",
+ "state",
+ "accountId",
+ "proposalRoles",
+ "instrumentSessionRoles"
],
- "typeName": "CreateExperimentDefinitionResponse"
+ "typeName": "Account"
},
{
"fieldNames": [
- "success",
- "experiments",
- "errors"
+ "name",
+ "key",
+ "scienceGroup",
+ "description",
+ "proposals",
+ "instrumentSessions",
+ "staff"
],
- "typeName": "CreateExperimentsResponse"
+ "typeName": "Instrument"
},
{
"fieldNames": [
"edges",
"pageInfo"
],
- "typeName": "ExperimentConnection"
+ "typeName": "InstrumentSessionConnection"
},
{
"fieldNames": [
- "id",
- "name",
- "createdTime",
- "updatedTime",
- "data",
- "dataSchemaUrl",
- "proposalNumber",
- "instrumentSessionNumber",
- "instrumentSession",
- "experiments"
+ "cursor",
+ "node"
],
- "typeName": "ExperimentDefinition"
+ "typeName": "InstrumentSessionEdge"
},
{
"fieldNames": [
- "edges",
- "pageInfo"
+ "instrumentSession",
+ "account",
+ "role",
+ "onSite"
],
- "typeName": "ExperimentDefinitionConnection"
+ "typeName": "InstrumentSessionRole"
},
{
"fieldNames": [
- "cursor",
- "node"
+ "startCursor",
+ "endCursor",
+ "hasNextPage",
+ "hasPreviousPage"
],
- "typeName": "ExperimentDefinitionEdge"
+ "typeName": "PageInfo"
},
{
"fieldNames": [
- "type",
- "location",
- "message"
+ "proposal",
+ "account",
+ "role"
],
- "typeName": "ExperimentDefinitionErrorDetails"
+ "typeName": "ProposalAccount"
},
{
"fieldNames": [
- "updateExperimentDefinition",
- "createExperiments"
+ "edges",
+ "pageInfo"
],
- "typeName": "ExperimentDefinitionMutations"
+ "typeName": "ProposalConnection"
},
{
"fieldNames": [
"cursor",
"node"
],
- "typeName": "ExperimentEdge"
+ "typeName": "ProposalEdge"
},
{
"fieldNames": [
- "startCursor",
- "endCursor",
- "hasNextPage",
- "hasPreviousPage"
+ "username",
+ "emailAddress",
+ "title",
+ "givenName",
+ "familyName",
+ "type",
+ "state"
],
- "typeName": "PageInfo"
+ "typeName": "Staff"
},
{
"fieldNames": [
- "success",
- "experimentDefinition",
- "errors"
+ "edges",
+ "pageInfo"
],
- "typeName": "UpdateExperimentDefinitionResponse"
+ "typeName": "StaffConnection"
+ },
+ {
+ "fieldNames": [
+ "cursor",
+ "node"
+ ],
+ "typeName": "StaffEdge"
}
],
"customGraphql": {
"federation": {
"enabled": true,
- "serviceSdl": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
+ "serviceSdl": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@key\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal {proposalNumber}\") @key(fields: \"instrumentSessionReference\") {\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n proposal: Proposal!\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n}\n\ntype InstrumentSessionConnection @shareable {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge @shareable {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations @key(fields: \"instrumentSessionNumber proposalNumber\") {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") @key(fields: \"proposalReference\") {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection @shareable {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge @shareable {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection @shareable {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge @shareable {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\nscalar _Any\n\nunion _Entity = InstrumentSession | InstrumentSessionMutations | Proposal\n\ntype _Service {\n sdl: String!\n}\n"
},
"fetch": {
"baseUrl": {},
@@ -406,108 +422,106 @@
"method": "POST",
"path": {},
"url": {
- "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ "staticVariableContent": "https://instrument-sessions.diamond.ac.uk/api/graphql"
}
},
"subscription": {
"enabled": true,
"protocol": "GRAPHQL_SUBSCRIPTION_PROTOCOL_WS",
"url": {
- "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ "staticVariableContent": "https://instrument-sessions.diamond.ac.uk/api/graphql"
},
"websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
},
"upstreamSchema": {
- "key": "205f29cfa96469ebbca12795a6c272d9fca847ee"
+ "key": "42f0af102c26cc7df0bfcca4c1e19a298c4f5749"
}
},
"id": "2",
"keys": [
{
- "selectionSet": "id",
- "typeName": "Experiment"
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "typeName": "InstrumentSession"
},
{
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "selectionSet": "instrumentSessionReference",
"typeName": "InstrumentSession"
},
+ {
+ "selectionSet": "instrumentSessionNumber proposalNumber",
+ "typeName": "InstrumentSessionMutations"
+ },
{
"selectionSet": "proposalNumber",
"typeName": "Proposal"
},
{
- "selectionSet": "id",
- "typeName": "Sample"
+ "selectionSet": "proposalReference",
+ "typeName": "Proposal"
}
],
"kind": "GRAPHQL",
"overrideFieldPathFromAlias": true,
- "provides": [
- {
- "fieldName": "sample",
- "selectionSet": "id",
- "typeName": "Experiment"
- },
- {
- "fieldName": "instrumentSession",
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
- "typeName": "ExperimentDefinition"
- }
- ],
"requestTimeoutSeconds": "10",
"rootNodes": [
{
"fieldNames": [
- "id",
- "name",
- "createdTime",
- "updatedTime",
- "experimentDefinition",
- "sample"
+ "instrumentSessionId",
+ "instrumentSessionNumber",
+ "instrumentSessionReference",
+ "startTime",
+ "endTime",
+ "type",
+ "state",
+ "riskRating",
+ "proposal",
+ "instrument",
+ "roles"
],
- "typeName": "Experiment"
+ "typeName": "InstrumentSession"
},
{
- "externalFieldNames": [
- "instrumentSessionNumber",
- "proposal"
- ],
"fieldNames": [
- "experimentDefinitions",
- "experiments"
+ "instrumentSessionNumber",
+ "proposalNumber"
],
- "typeName": "InstrumentSession"
+ "typeName": "InstrumentSessionMutations"
},
{
"fieldNames": [
- "createExperimentDefinition",
- "experimentDefinition"
+ "createInstrumentSession",
+ "instrumentSession"
],
"typeName": "Mutation"
},
{
- "externalFieldNames": [
- "proposalNumber"
+ "fieldNames": [
+ "proposalNumber",
+ "proposalCategory",
+ "title",
+ "summary",
+ "state",
+ "proposalReference",
+ "instrumentSessions",
+ "instruments",
+ "roles"
],
"typeName": "Proposal"
},
{
"fieldNames": [
- "experimentDefinition",
- "experimentDefinitions",
- "experiment",
- "experiments"
+ "proposal",
+ "proposals",
+ "proposalByReference",
+ "instrumentSession",
+ "instrumentSessionByReference",
+ "instrumentSessions",
+ "instrumentByName",
+ "instrumentByKey",
+ "instruments",
+ "account"
],
"typeName": "Query"
- },
- {
- "externalFieldNames": [
- "id"
- ],
- "fieldNames": [
- "experiments"
- ],
- "typeName": "Sample"
}
]
},
@@ -515,116 +529,125 @@
"childNodes": [
{
"fieldNames": [
- "username",
- "emailAddress",
- "title",
- "givenName",
- "familyName",
- "type",
- "state",
- "accountId",
- "proposalRoles",
- "instrumentSessionRoles"
+ "success",
+ "experimentDefinition",
+ "errors"
],
- "typeName": "Account"
+ "typeName": "CreateExperimentDefinitionResponse"
},
{
"fieldNames": [
- "name",
- "key",
- "scienceGroup",
- "description",
- "proposals",
- "instrumentSessions",
- "staff"
+ "success",
+ "experiments",
+ "errors"
],
- "typeName": "Instrument"
+ "typeName": "CreateExperimentsResponse"
},
{
"fieldNames": [
- "edges",
- "pageInfo"
+ "type",
+ "location",
+ "message"
],
- "typeName": "InstrumentSessionConnection"
+ "typeName": "DeleteErrorDetails"
},
{
"fieldNames": [
- "cursor",
- "node"
+ "success",
+ "errors"
],
- "typeName": "InstrumentSessionEdge"
+ "typeName": "DeleteExperimentResponse"
},
{
"fieldNames": [
- "instrumentSession",
- "account",
- "role",
- "onSite"
+ "success",
+ "errors"
],
- "typeName": "InstrumentSessionRole"
+ "typeName": "DeletedExperimentDefinitionResponse"
},
{
"fieldNames": [
- "startCursor",
- "endCursor",
- "hasNextPage",
- "hasPreviousPage"
+ "edges",
+ "pageInfo"
],
- "typeName": "PageInfo"
+ "typeName": "ExperimentConnection"
},
{
"fieldNames": [
- "proposal",
- "account",
- "role"
+ "id",
+ "name",
+ "createdTime",
+ "updatedTime",
+ "data",
+ "dataSchemaUrl",
+ "proposalNumber",
+ "instrumentSessionNumber",
+ "deleted",
+ "createdBy",
+ "modifiedBy",
+ "instrumentSession",
+ "experiments"
],
- "typeName": "ProposalAccount"
+ "typeName": "ExperimentDefinition"
},
{
"fieldNames": [
"edges",
"pageInfo"
],
- "typeName": "ProposalConnection"
+ "typeName": "ExperimentDefinitionConnection"
},
{
"fieldNames": [
"cursor",
"node"
],
- "typeName": "ProposalEdge"
+ "typeName": "ExperimentDefinitionEdge"
},
{
"fieldNames": [
- "username",
- "emailAddress",
- "title",
- "givenName",
- "familyName",
"type",
- "state"
+ "location",
+ "message"
],
- "typeName": "Staff"
+ "typeName": "ExperimentDefinitionErrorDetails"
},
{
"fieldNames": [
- "edges",
- "pageInfo"
+ "updateExperimentDefinition",
+ "createExperiments"
],
- "typeName": "StaffConnection"
+ "typeName": "ExperimentDefinitionMutations"
},
{
"fieldNames": [
"cursor",
"node"
],
- "typeName": "StaffEdge"
+ "typeName": "ExperimentEdge"
+ },
+ {
+ "fieldNames": [
+ "startCursor",
+ "endCursor",
+ "hasNextPage",
+ "hasPreviousPage"
+ ],
+ "typeName": "PageInfo"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "experimentDefinition",
+ "errors"
+ ],
+ "typeName": "UpdateExperimentDefinitionResponse"
}
],
"customGraphql": {
"federation": {
"enabled": true,
- "serviceSdl": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@key\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal {proposalNumber}\") @key(fields: \"instrumentSessionReference\") {\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n proposal: Proposal!\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n}\n\ntype InstrumentSessionConnection @shareable {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge @shareable {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations @key(fields: \"instrumentSessionNumber proposalNumber\") {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") @key(fields: \"proposalReference\") {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection @shareable {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge @shareable {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection @shareable {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge @shareable {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\nscalar _Any\n\nunion _Entity = InstrumentSession | InstrumentSessionMutations | Proposal\n\ntype _Service {\n sdl: String!\n}\n"
+ "serviceSdl": "directive @oneOf on INPUT_OBJECT\n\nschema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
},
"fetch": {
"baseUrl": {},
@@ -632,106 +655,115 @@
"method": "POST",
"path": {},
"url": {
- "staticVariableContent": "https://instrument-sessions.diamond.ac.uk/api/graphql"
+ "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
}
},
"subscription": {
"enabled": true,
"protocol": "GRAPHQL_SUBSCRIPTION_PROTOCOL_WS",
"url": {
- "staticVariableContent": "https://instrument-sessions.diamond.ac.uk/api/graphql"
+ "staticVariableContent": "https://api.experiment-definition.diamond.ac.uk/graphql"
},
"websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
},
"upstreamSchema": {
- "key": "42f0af102c26cc7df0bfcca4c1e19a298c4f5749"
+ "key": "002a5eb946b470d27322fd7ede391d75321b25b1"
}
},
"id": "3",
"keys": [
{
- "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
- "typeName": "InstrumentSession"
+ "selectionSet": "id",
+ "typeName": "Experiment"
},
{
- "selectionSet": "instrumentSessionReference",
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
"typeName": "InstrumentSession"
},
- {
- "selectionSet": "instrumentSessionNumber proposalNumber",
- "typeName": "InstrumentSessionMutations"
- },
{
"selectionSet": "proposalNumber",
"typeName": "Proposal"
},
{
- "selectionSet": "proposalReference",
- "typeName": "Proposal"
+ "selectionSet": "id",
+ "typeName": "Sample"
}
],
"kind": "GRAPHQL",
"overrideFieldPathFromAlias": true,
+ "provides": [
+ {
+ "fieldName": "sample",
+ "selectionSet": "id",
+ "typeName": "Experiment"
+ },
+ {
+ "fieldName": "instrumentSession",
+ "selectionSet": "instrumentSessionNumber proposal { proposalNumber }",
+ "typeName": "ExperimentDefinition"
+ }
+ ],
"requestTimeoutSeconds": "10",
"rootNodes": [
{
"fieldNames": [
- "instrumentSessionId",
- "instrumentSessionNumber",
- "instrumentSessionReference",
- "startTime",
- "endTime",
- "type",
- "state",
- "riskRating",
- "proposal",
- "instrument",
- "roles"
+ "id",
+ "name",
+ "createdTime",
+ "updatedTime",
+ "deleted",
+ "experimentDefinition",
+ "createdBy",
+ "modifiedBy",
+ "sample"
],
- "typeName": "InstrumentSession"
+ "typeName": "Experiment"
},
{
- "fieldNames": [
+ "externalFieldNames": [
"instrumentSessionNumber",
- "proposalNumber"
+ "proposal"
],
- "typeName": "InstrumentSessionMutations"
+ "fieldNames": [
+ "experimentDefinitions",
+ "experiments"
+ ],
+ "typeName": "InstrumentSession"
},
{
"fieldNames": [
- "createInstrumentSession",
- "instrumentSession"
+ "createExperimentDefinition",
+ "experimentDefinition",
+ "deleteExperiment",
+ "restoreExperiment",
+ "deleteExperimentDefinition",
+ "restoreExperimentDefinition"
],
"typeName": "Mutation"
},
{
- "fieldNames": [
- "proposalNumber",
- "proposalCategory",
- "title",
- "summary",
- "state",
- "proposalReference",
- "instrumentSessions",
- "instruments",
- "roles"
+ "externalFieldNames": [
+ "proposalNumber"
],
"typeName": "Proposal"
},
{
"fieldNames": [
- "proposal",
- "proposals",
- "proposalByReference",
- "instrumentSession",
- "instrumentSessionByReference",
- "instrumentSessions",
- "instrumentByName",
- "instrumentByKey",
- "instruments",
- "account"
+ "experimentDefinition",
+ "experimentDefinitions",
+ "experiment",
+ "experiments"
],
"typeName": "Query"
+ },
+ {
+ "externalFieldNames": [
+ "id"
+ ],
+ "fieldNames": [
+ "experiments"
+ ],
+ "typeName": "Sample"
}
]
},
@@ -1344,6 +1376,30 @@
"fieldName": "createTrigger",
"typeName": "Mutation"
},
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "createInstrumentSession",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "proposalNumber",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "instrumentSessionNumber",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "instrumentSession",
+ "typeName": "Mutation"
+ },
{
"argumentsConfiguration": [
{
@@ -1367,25 +1423,41 @@
{
"argumentsConfiguration": [
{
- "name": "input",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createInstrumentSession",
+ "fieldName": "deleteExperiment",
"typeName": "Mutation"
},
{
"argumentsConfiguration": [
{
- "name": "proposalNumber",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "restoreExperiment",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "instrumentSessionNumber",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSession",
+ "fieldName": "deleteExperimentDefinition",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "restoreExperimentDefinition",
"typeName": "Mutation"
},
{
@@ -1611,19 +1683,15 @@
{
"argumentsConfiguration": [
{
- "name": "id",
+ "name": "proposalNumber",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experimentDefinition",
+ "fieldName": "proposal",
"typeName": "Query"
},
{
"argumentsConfiguration": [
- {
- "name": "instrumentSessions",
- "sourceType": "FIELD_ARGUMENT"
- },
{
"name": "first",
"sourceType": "FIELD_ARGUMENT"
@@ -1639,59 +1707,63 @@
{
"name": "before",
"sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "sortBy",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "filterBy",
+ "sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experimentDefinitions",
+ "fieldName": "proposals",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "id",
+ "name": "reference",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experiment",
+ "fieldName": "proposalByReference",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "instrumentSessions",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "first",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "last",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "after",
+ "name": "proposalNumber",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "instrumentSessionNumber",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experiments",
+ "fieldName": "instrumentSession",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "proposalNumber",
+ "name": "reference",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "proposal",
+ "fieldName": "instrumentSessionByReference",
"typeName": "Query"
},
{
"argumentsConfiguration": [
+ {
+ "name": "proposalNumber",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "proposalCategory",
+ "sourceType": "FIELD_ARGUMENT"
+ },
{
"name": "first",
"sourceType": "FIELD_ARGUMENT"
@@ -1717,51 +1789,67 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "proposals",
+ "fieldName": "instrumentSessions",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "reference",
+ "name": "name",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "proposalByReference",
+ "fieldName": "instrumentByName",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "proposalNumber",
+ "name": "key",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "instrumentByKey",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "instrumentSessionNumber",
+ "name": "scienceGroup",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSession",
+ "fieldName": "instruments",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "reference",
+ "name": "username",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSessionByReference",
+ "fieldName": "account",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "proposalNumber",
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "experimentDefinition",
+ "typeName": "Query"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "instrumentSessions",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "proposalCategory",
+ "name": "filter",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -1779,57 +1867,45 @@
{
"name": "before",
"sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "sortBy",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "filterBy",
- "sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSessions",
+ "fieldName": "experimentDefinitions",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "name",
+ "name": "id",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentByName",
+ "fieldName": "experiment",
"typeName": "Query"
},
{
"argumentsConfiguration": [
{
- "name": "key",
+ "name": "instrumentSessions",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "instrumentByKey",
- "typeName": "Query"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "scienceGroup",
+ "name": "first",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "instruments",
- "typeName": "Query"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "username",
+ "name": "last",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "after",
+ "sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "account",
+ "fieldName": "experiments",
"typeName": "Query"
},
{
@@ -1992,26 +2068,6 @@
"fieldName": "workflow",
"typeName": "Subscription"
},
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "updateExperimentDefinition",
- "typeName": "ExperimentDefinitionMutations"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "input",
- "sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "createExperiments",
- "typeName": "ExperimentDefinitionMutations"
- },
{
"argumentsConfiguration": [
{
@@ -2029,32 +2085,18 @@
{
"name": "before",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "experimentDefinitions",
- "typeName": "InstrumentSession"
- },
- {
- "argumentsConfiguration": [
- {
- "name": "first",
- "sourceType": "FIELD_ARGUMENT"
- },
- {
- "name": "last",
- "sourceType": "FIELD_ARGUMENT"
},
{
- "name": "after",
+ "name": "sortBy",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "filterBy",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "experiments",
- "typeName": "InstrumentSession"
+ "fieldName": "proposals",
+ "typeName": "Instrument"
},
{
"argumentsConfiguration": [
@@ -2063,28 +2105,28 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "filter",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "after",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "after",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "sortBy",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "orderBy",
+ "name": "filterBy",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "samples",
- "typeName": "InstrumentSession"
+ "fieldName": "instrumentSessions",
+ "typeName": "Instrument"
},
{
"argumentsConfiguration": [
@@ -2113,8 +2155,8 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSessions",
- "typeName": "Proposal"
+ "fieldName": "staff",
+ "typeName": "Instrument"
},
{
"argumentsConfiguration": [
@@ -2123,7 +2165,7 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -2131,12 +2173,12 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "parents",
- "typeName": "Sample"
+ "fieldName": "experimentDefinitions",
+ "typeName": "InstrumentSession"
},
{
"argumentsConfiguration": [
@@ -2145,7 +2187,7 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -2153,12 +2195,12 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "children",
- "typeName": "Sample"
+ "fieldName": "experiments",
+ "typeName": "InstrumentSession"
},
{
"argumentsConfiguration": [
@@ -2166,6 +2208,10 @@
"name": "first",
"sourceType": "FIELD_ARGUMENT"
},
+ {
+ "name": "filter",
+ "sourceType": "FIELD_ARGUMENT"
+ },
{
"name": "before",
"sourceType": "FIELD_ARGUMENT"
@@ -2177,10 +2223,24 @@
{
"name": "last",
"sourceType": "FIELD_ARGUMENT"
+ },
+ {
+ "name": "orderBy",
+ "sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "events",
- "typeName": "Sample"
+ "fieldName": "samples",
+ "typeName": "InstrumentSession"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "input",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "createOrValidateSamples",
+ "typeName": "InstrumentSessionMutations"
},
{
"argumentsConfiguration": [
@@ -2209,21 +2269,33 @@
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "proposals",
- "typeName": "Instrument"
+ "fieldName": "instrumentSessions",
+ "typeName": "Proposal"
},
{
"argumentsConfiguration": [
{
- "name": "first",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "updateExperimentDefinition",
+ "typeName": "ExperimentDefinitionMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "last",
+ "name": "input",
"sourceType": "FIELD_ARGUMENT"
- },
+ }
+ ],
+ "fieldName": "createExperiments",
+ "typeName": "ExperimentDefinitionMutations"
+ },
+ {
+ "argumentsConfiguration": [
{
- "name": "after",
+ "name": "first",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -2231,16 +2303,16 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "sortBy",
+ "name": "after",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "filterBy",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "instrumentSessions",
- "typeName": "Instrument"
+ "fieldName": "parents",
+ "typeName": "Sample"
},
{
"argumentsConfiguration": [
@@ -2249,7 +2321,7 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "last",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
},
{
@@ -2257,30 +2329,34 @@
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "before",
+ "name": "last",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "children",
+ "typeName": "Sample"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "first",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "sortBy",
+ "name": "before",
"sourceType": "FIELD_ARGUMENT"
},
{
- "name": "filterBy",
+ "name": "after",
"sourceType": "FIELD_ARGUMENT"
- }
- ],
- "fieldName": "staff",
- "typeName": "Instrument"
- },
- {
- "argumentsConfiguration": [
+ },
{
- "name": "input",
+ "name": "last",
"sourceType": "FIELD_ARGUMENT"
}
],
- "fieldName": "createOrValidateSamples",
- "typeName": "InstrumentSessionMutations"
+ "fieldName": "events",
+ "typeName": "Sample"
},
{
"argumentsConfiguration": [
@@ -2455,9 +2531,9 @@
"typeName": "ContainerTypeMutations"
}
],
- "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(visit: VisitInput!, manifest: String!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n deleteSample(sampleId: UUID!): DeleteSampleResponse!\n restoreSample(sampleId: UUID!): RestoreSampleResponse!\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, filter: ContainerFilterInput = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n}\n\ntype TriggerConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype Sample {\n id: UUID!\n experiments: [Experiment!]!\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"Return type when deleting a sample\"\"\"\ntype DeleteSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\n\"\"\"Return type when restoring a deleted sample\"\"\"\ntype RestoreSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating a sample\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"The user that created the container\"\"\"\n createdBy: String!\n \"\"\"The user that last modified the container\"\"\"\n modifiedBy: String!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\n\"\"\"Values required to filter a list of containers\"\"\"\ninput ContainerFilterInput {\n \"\"\"Filter using the id of the container's parent\"\"\"\n parentId: UUIDFilterInputV2 = null\n \"\"\"Filter using the of the container's children\"\"\"\n childId: UUIDFilterInputV2 = null\n \"\"\"Include/exclude 'deleted' containers\"\"\"\n includeDeleted: Boolean! = false\n \"\"\"Filter to containers with/without child containers\"\"\"\n hasChildren: Boolean = null\n \"\"\"Filter to containers with/without a parent\"\"\"\n hasParent: Boolean = null\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The user that created the container type\"\"\"\n createdBy: String!\n \"\"\"The user user that last modified the container type\"\"\"\n modifiedBy: String!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\ninput UUIDFilterInputV2 {\n \"\"\"\n Will filter to items where the `UUID` field is a member of the provided value\n \"\"\"\n in: [UUID!] = null\n \"\"\"\n Will filter to items where the `UUID` field is equal to the provided value\n \"\"\"\n equalTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not equal to the provided value\n \"\"\"\n notEqualTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not a member of the provided value\n \"\"\"\n notIn: [UUID!] = null\n}\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}",
+ "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(visit: VisitInput!, manifest: String!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n deleteSample(sampleId: UUID!): DeleteSampleResponse!\n restoreSample(sampleId: UUID!): RestoreSampleResponse!\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, filter: ContainerFilterInput = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n}\n\ntype TriggerConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSession {\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n proposal: Proposal\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype Sample {\n id: UUID!\n experiments: [Experiment!]!\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"Return type when deleting a sample\"\"\"\ntype DeleteSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\n\"\"\"Return type when restoring a deleted sample\"\"\"\ntype RestoreSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating a sample\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"The user that created the container\"\"\"\n createdBy: String!\n \"\"\"The user that last modified the container\"\"\"\n modifiedBy: String!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\n\"\"\"Values required to filter a list of containers\"\"\"\ninput ContainerFilterInput {\n \"\"\"Filter using the id of the container's parent\"\"\"\n parentId: UUIDFilterInputV2 = null\n \"\"\"Filter using the of the container's children\"\"\"\n childId: UUIDFilterInputV2 = null\n \"\"\"Include/exclude 'deleted' containers\"\"\"\n includeDeleted: Boolean! = false\n \"\"\"Filter to containers with/without child containers\"\"\"\n hasChildren: Boolean = null\n \"\"\"Filter to containers with/without a parent\"\"\"\n hasParent: Boolean = null\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The user that created the container type\"\"\"\n createdBy: String!\n \"\"\"The user user that last modified the container type\"\"\"\n modifiedBy: String!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\ninput UUIDFilterInputV2 {\n \"\"\"\n Will filter to items where the `UUID` field is a member of the provided value\n \"\"\"\n in: [UUID!] = null\n \"\"\"\n Will filter to items where the `UUID` field is equal to the provided value\n \"\"\"\n equalTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not equal to the provided value\n \"\"\"\n notEqualTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not a member of the provided value\n \"\"\"\n notIn: [UUID!] = null\n}\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}",
"stringStorage": {
- "205f29cfa96469ebbca12795a6c272d9fca847ee": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n createdTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
+ "002a5eb946b470d27322fd7ede391d75321b25b1": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\ntype Experiment @key(fields: \"id\") {\n createdBy: String!\n createdTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n modifiedBy: String!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdBy: String!\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n modifiedBy: String!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n stringFilter: StringFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, filter: ExperimentDefinitionFilterInput = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"42f0af102c26cc7df0bfcca4c1e19a298c4f5749": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@key\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Account {\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n emailAddress: String\n familyName: String\n givenName: String\n instrumentSessionRoles: [InstrumentSessionRole!]!\n proposalRoles: [ProposalAccount!]!\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n familyName: StringFilterInput = null\n givenName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n disabled\n enabled\n}\n\nenum AccountType {\n functional\n staff\n user\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n gt: DateTime = null\n gte: DateTime = null\n lt: DateTime = null\n lte: DateTime = null\n neq: DateTime = null\n}\n\ntype Instrument {\n description: String\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n key: String!\n name: String!\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n scienceGroup: String\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(after: String = null, before: String = null, filterBy: AccountFilterInput = null, first: Int = null, last: Int = null, sortBy: [AccountSortInput!] = null): StaffConnection!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal {proposalNumber}\") @key(fields: \"instrumentSessionReference\") {\n endTime: DateTime\n instrument: Instrument!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n proposal: Proposal!\n riskRating: String\n roles: [InstrumentSessionRole!]!\n startTime: DateTime\n state: String\n type: String\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype InstrumentSessionEdge {\n cursor: String! @shareable\n node: InstrumentSession! @shareable\n}\n\ninput InstrumentSessionFilterInput {\n endTime: DateTimeFilterInput = null\n instrumentSessionNumber: IntFilterInput = null\n proposalNumber: IntFilterInput = null\n riskRating: StringFilterInput = null\n startTime: DateTimeFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n type: StringFilterInput = null\n}\n\ntype InstrumentSessionMutations @key(fields: \"instrumentSessionNumber proposalNumber\") {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype InstrumentSessionRole {\n account: Account!\n instrumentSession: InstrumentSession!\n onSite: Boolean!\n role: String!\n}\n\nenum InstrumentSessionSortField {\n endTime\n instrumentSessionNumber\n proposalNumber\n riskRating\n startTime\n state\n type\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n gt: Int = null\n gte: Int = null\n lt: Int = null\n lte: Int = null\n neq: Int = null\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSessionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") @key(fields: \"proposalReference\") {\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n proposalCategory: String\n proposalNumber: Int!\n proposalReference: String\n roles: [ProposalAccount!]!\n state: ProposalState!\n summary: String\n title: String\n}\n\ntype ProposalAccount {\n account: Account!\n proposal: Proposal!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ProposalEdge {\n cursor: String! @shareable\n node: Proposal! @shareable\n}\n\ninput ProposalFilterInput {\n proposalCategory: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n state: ProposalStateFilterInput = null\n title: StringFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n CANCELLED\n CLOSED\n OPEN\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\ntype Query {\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, proposalCategory: String = null, proposalNumber: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n emailAddress: String\n familyName: String\n givenName: String\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype StaffEdge {\n cursor: String! @shareable\n node: Staff! @shareable\n}\n\ninput StringFilterInput {\n contains: String = null\n endsWith: String = null\n eq: String = null\n neq: String = null\n notContains: String = null\n startsWith: String = null\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"ab9040c814f11559b1e7d93f67b38b284f1bf0d3": "schema {\n query: Query\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The description og the schema\"\"\"\n description: String\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The version of the schema\"\"\"\n version: String\n}\n\ntype Query {\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(instrument: String = null, type: String = null): [JSONSchema!]!\n}",
"af5a88b7893039d342e7bb3e67d277be36ce0e96": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Artifact {\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"A scalar that can represent any JSON value.\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(name: String, templateRef: String!, visit: VisitInput): Trigger\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(manifest: String!, visit: VisitInput!): Workflow!\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, parameters: JSON!, visit: VisitInput!): Workflow!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String @shareable\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean! @shareable\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean! @shareable\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String @shareable\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(name: String!, visit: VisitInput!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, filter: WorkflowTemplatesFilter, limit: Int): WorkflowTemplateConnection!\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(cursor: String, filter: WorkflowFilter, limit: Int, visit: VisitInput!): WorkflowConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(taskId: String!, visit: VisitInput!, workflowName: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(name: String!, visit: VisitInput!): Workflow!\n}\n\ntype Task {\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n}\n\nenum TaskStatus {\n ERROR\n FAILED\n OMITTED\n PENDING\n RUNNING\n SKIPPED\n SUCCEEDED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n}\n\ntype TriggerConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger! @shareable\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Session visit Number\"\"\"\n number: Int!\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Session visit Number\"\"\"\n number: Int!\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n}\n\ntype Workflow {\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n}\n\ntype WorkflowConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow! @shareable\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowErroredStatus | WorkflowFailedStatus | WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n error: Boolean! = false\n failed: Boolean! = false\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate! @shareable\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}",
@@ -2478,13 +2554,13 @@
},
{
"id": "2",
- "name": "experiments",
- "routingUrl": "https://api.experiment-definition.diamond.ac.uk/graphql"
+ "name": "instrument_sessions",
+ "routingUrl": "https://instrument-sessions.diamond.ac.uk/api/graphql"
},
{
"id": "3",
- "name": "instrument_sessions",
- "routingUrl": "https://instrument-sessions.diamond.ac.uk/api/graphql"
+ "name": "experiments",
+ "routingUrl": "https://api.experiment-definition.diamond.ac.uk/graphql"
},
{
"id": "4", |
diff --git a/tmp/old_supergraph.graphql b/tmp/new_supergraph.graphql
index 83bacb2..b98f2c8 100644
--- a/tmp/old_supergraph.graphql
+++ b/tmp/new_supergraph.graphql
@@ -66,10 +66,14 @@ type Mutation {
"""Create a Trigger from a template"""
createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger
- createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
- experimentDefinition(id: UUID!): ExperimentDefinitionMutations
createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!
instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations
+ createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
+ experimentDefinition(id: UUID!): ExperimentDefinitionMutations
+ deleteExperiment(id: UUID!): DeleteExperimentResponse
+ restoreExperiment(id: UUID!): DeleteExperimentResponse
+ deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
+ restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!
sample(sampleId: UUID!): SampleMutations
deleteSample(sampleId: UUID!): DeleteSampleResponse!
@@ -138,10 +142,6 @@ type Query {
triggers(cursor: String, limit: Int): TriggerConnection!
jsonSchema(url: String!): JSONSchema
jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!
- experimentDefinition(id: UUID!): ExperimentDefinition
- experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
- experiment(id: UUID!): Experiment
- experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
"""Get a proposal by its number"""
proposal(proposalNumber: Int!): Proposal
@@ -176,6 +176,10 @@ type Query {
"""Get an account"""
account(username: String!): Account
+ experimentDefinition(id: UUID!): ExperimentDefinition
+ experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
+ experiment(id: UUID!): Experiment
+ experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
"""Get a sample by its id"""
sample(sampleId: UUID!): Sample
@@ -609,215 +613,6 @@ type JSONSchema {
description: String
}
-"""Values required to create an experiment definition"""
-input CreateExperimentDefinitionInput {
- name: String!
- data: JSON!
- dataSchemaUrl: String!
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-}
-
-"""Return type when creating an experiment definition"""
-type CreateExperimentDefinitionResponse {
- """Whether the operation has succeeded without validation errors"""
- success: Boolean!
-
- """Experiment Definition that has been created"""
- experimentDefinition: ExperimentDefinition
-
- """Errors that occurred during validation"""
- errors: [ExperimentDefinitionErrorDetails!]!
-}
-
-"""Values required for the createExperiments mutation"""
-input CreateExperimentsInput {
- experiments: [ExperimentInput!]!
-}
-
-"""Return type when updating an experiment definition"""
-type CreateExperimentsResponse {
- """Whether the operation has succeeded without errors"""
- success: Boolean!
-
- """Experiments created"""
- experiments: [Experiment!]
-
- """Errors that occurred during experiments creation"""
- errors: [String!]!
-}
-
-type Experiment {
- id: UUID!
- name: String!
- createdTime: DateTime!
- updatedTime: DateTime!
- experimentDefinition: ExperimentDefinition!
-
- """The sample that this experiment is associated with"""
- sample: Sample!
-}
-
-type ExperimentConnection {
- edges: [ExperimentEdge!]!
- pageInfo: PageInfo!
-}
-
-type ExperimentDefinition {
- id: UUID!
- name: String!
- createdTime: DateTime!
- updatedTime: DateTime!
- data: JSON!
- dataSchemaUrl: String!
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-
- """
- The instrument session that this experiment definition is associated with
- """
- instrumentSession: InstrumentSession!
-
- """Experiments associated with this experiment definition"""
- experiments: [Experiment!]!
-}
-
-type ExperimentDefinitionConnection {
- edges: [ExperimentDefinitionEdge!]!
- pageInfo: PageInfo!
-}
-
-type ExperimentDefinitionEdge {
- cursor: String!
- node: ExperimentDefinition!
-}
-
-"""The details of an experiment definition validation error"""
-type ExperimentDefinitionErrorDetails {
- """The type of error that occurred"""
- type: String!
-
- """
- Tuple of strings identifying where in the experiment definition schema the error occurred.
- """
- location: [String!]!
-
- """A human readable error message."""
- message: String!
-}
-
-"""Mutations for a given experiment defintion"""
-type ExperimentDefinitionMutations {
- updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
- createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!
-}
-
-type ExperimentEdge {
- cursor: String!
- node: Experiment!
-}
-
-"""Values required to create an experiment"""
-input ExperimentInput {
- name: String!
- sampleId: UUID!
-}
-
-type InstrumentSession {
- instrumentSessionNumber: Int!
- proposal: Proposal
-
- """Experiment Definitions"""
- experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!
-
- """Experiments associated with this session"""
- experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!
- instrumentSessionId: Int! @deprecated(reason: "instrument_session_id is deprecated and will be removed in a future version.")
- instrumentSessionReference: String
- startTime: DateTime
- endTime: DateTime
- type: String
- state: String
- riskRating: String
- instrument: Instrument!
- roles: [InstrumentSessionRole!]!
-
- """Samples associated with a given instrument session"""
- samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!
-}
-
-"""Values required to uniquely identify an instrument session"""
-input InstrumentSessionInput {
- proposalNumber: Int!
- instrumentSessionNumber: Int!
-}
-
-type Proposal {
- proposalNumber: Int!
- proposalCategory: String
- title: String
- summary: String
- state: ProposalState!
- proposalReference: String
- instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!
- instruments: [Instrument!]!
- roles: [ProposalAccount!]!
-}
-
-type Sample {
- id: UUID!
- experiments: [Experiment!]!
- name: String!
- data: JSON!
- createdTime: DateTime!
- updatedTime: DateTime!
- dataSchemaUrl: String!
- deleted: Boolean!
-
- """Samples from which this sample is derived"""
- parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
-
- """Samples derived from this sample"""
- children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
-
- """Events linked to this sample"""
- events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!
-
- """The JSON schema that the sample's `data` conforms to"""
- dataSchema: JSON!
-
- """The instrument sessions that this sample is associated with"""
- instrumentSessions: [InstrumentSession!]!
- images: [SampleImage!]!
-
- """The container containing the sample"""
- container: Container
-
- """The sample's position within a container"""
- positionInContainer: ContainerPosition
-}
-
-scalar UUID
-
-"""Values that can be updated on experiment definition"""
-input UpdateExperimentDefinitionInput {
- name: String
- data: JSON
- dataSchemaUrl: String
-}
-
-"""Return type when updating an experiment definition"""
-type UpdateExperimentDefinitionResponse {
- """Whether the operation has succeeded without validation errors"""
- success: Boolean!
-
- """Experiment Definition that has been updated"""
- experimentDefinition: ExperimentDefinition
-
- """Errors that occurred during validation"""
- errors: [ExperimentDefinitionErrorDetails!]!
-}
-
type Account {
username: String!
emailAddress: String
@@ -894,6 +689,29 @@ type Instrument {
staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!
}
+type InstrumentSession {
+ instrumentSessionId: Int! @deprecated(reason: "instrument_session_id is deprecated and will be removed in a future version.")
+ instrumentSessionNumber: Int!
+ instrumentSessionReference: String
+ startTime: DateTime
+ endTime: DateTime
+ type: String
+ state: String
+ riskRating: String
+ proposal: Proposal
+ instrument: Instrument!
+ roles: [InstrumentSessionRole!]!
+
+ """Experiment Definitions"""
+ experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!
+
+ """Experiments associated with this session"""
+ experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!
+
+ """Samples associated with a given instrument session"""
+ samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!
+}
+
type InstrumentSessionConnection {
edges: [InstrumentSessionEdge!]!
pageInfo: PageInfo!
@@ -965,6 +783,18 @@ input IntFilterInput {
lte: Int = null
}
+type Proposal {
+ proposalNumber: Int!
+ proposalCategory: String
+ title: String
+ summary: String
+ state: ProposalState!
+ proposalReference: String
+ instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!
+ instruments: [Instrument!]!
+ roles: [ProposalAccount!]!
+}
+
type ProposalAccount {
proposal: Proposal!
account: Account!
@@ -1042,6 +872,301 @@ input StringFilterInput {
endsWith: String = null
}
+"""Values required to create an experiment definition"""
+input CreateExperimentDefinitionInput {
+ name: String!
+ data: JSON!
+ dataSchemaUrl: String!
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+}
+
+"""Return type when creating an experiment definition"""
+type CreateExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Experiment Definition that has been created"""
+ experimentDefinition: ExperimentDefinition
+
+ """Errors that occurred during validation"""
+ errors: [ExperimentDefinitionErrorDetails!]!
+}
+
+"""Values required for the createExperiments mutation"""
+input CreateExperimentsInput {
+ experiments: [ExperimentInput!]!
+}
+
+"""Return type when updating an experiment definition"""
+type CreateExperimentsResponse {
+ """Whether the operation has succeeded without errors"""
+ success: Boolean!
+
+ """Experiments created"""
+ experiments: [Experiment!]
+
+ """Errors that occurred during experiments creation"""
+ errors: [String!]!
+}
+
+input DatetimeFilterInputV2 {
+ """
+ Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value
+ """
+ greaterThan: DateTime = null
+
+ """
+ Will filter to items where the `DateTime` field is less than (i.e. before) the provided value
+ """
+ lessThan: DateTime = null
+}
+
+"""The details of an deleted record validation error"""
+type DeleteErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the record schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Return type when marking an record as deleted"""
+type DeleteExperimentResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+"""Return type when marking an record as deleted"""
+type DeletedExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+type Experiment {
+ id: UUID!
+ name: String!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ deleted: Boolean!
+ experimentDefinition: ExperimentDefinition!
+ createdBy: String!
+ modifiedBy: String!
+
+ """The sample that this experiment is associated with"""
+ sample: Sample!
+}
+
+type ExperimentConnection {
+ edges: [ExperimentEdge!]!
+ pageInfo: PageInfo!
+}
+
+type ExperimentDefinition {
+ id: UUID!
+ name: String!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ data: JSON!
+ dataSchemaUrl: String!
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+ deleted: Boolean!
+ createdBy: String!
+ modifiedBy: String!
+
+ """
+ The instrument session that this experiment definition is associated with
+ """
+ instrumentSession: InstrumentSession!
+
+ """Experiments associated with this experiment definition"""
+ experiments: [Experiment!]!
+}
+
+type ExperimentDefinitionConnection {
+ edges: [ExperimentDefinitionEdge!]!
+ pageInfo: PageInfo!
+}
+
+type ExperimentDefinitionEdge {
+ cursor: String!
+ node: ExperimentDefinition!
+}
+
+"""The details of an experiment definition validation error"""
+type ExperimentDefinitionErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the experiment definition schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Values required to filter a list of experiment definitions"""
+input ExperimentDefinitionFilterInput {
+ """Filter by the name of experiment definitions"""
+ name: StringFilterInputV2 = null
+
+ """Filter by the created datetime of experiment definitions"""
+ createdTime: DatetimeFilterInputV2 = null
+
+ """Filter by the update datetime of experiment definitions"""
+ updatedTime: DatetimeFilterInputV2 = null
+
+ """Filter by the data schema URL of experiment definitions"""
+ dataSchemaUrl: StringFilterInputV2 = null
+
+ """Filter within the JSON data of experiment definitions"""
+ data: [JSONFilterInputV2!] = null
+}
+
+"""Mutations for a given experiment defintion"""
+type ExperimentDefinitionMutations {
+ updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
+ createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!
+}
+
+type ExperimentEdge {
+ cursor: String!
+ node: Experiment!
+}
+
+"""Values required to create an experiment"""
+input ExperimentInput {
+ name: String!
+ sampleId: UUID!
+}
+
+"""Values required to uniquely identify an instrument session"""
+input InstrumentSessionInput {
+ proposalNumber: Int!
+ instrumentSessionNumber: Int!
+}
+
+input JSONFilterConditionInput @oneOf {
+ stringFilter: StringFilterInputV2 = null
+ datetimeFilter: DatetimeFilterInputV2 = null
+ numericFilter: NumericFilterInputV2 = null
+}
+
+input JSONFilterInputV2 {
+ """The JSON path to the field to filter. Must start with '$.'"""
+ path: String!
+
+ """The filter operation to apply to the field"""
+ condition: JSONFilterConditionInput!
+}
+
+input NumericFilterInputV2 {
+ """
+ Will filter to items where the numeric field is greater than the provided value
+ """
+ greaterThan: Float = null
+
+ """
+ Will filter to items where the numeric field is less than the provided value
+ """
+ lessThan: Float = null
+}
+
+type Sample {
+ id: UUID!
+ experiments: [Experiment!]!
+ name: String!
+ data: JSON!
+ createdTime: DateTime!
+ updatedTime: DateTime!
+ dataSchemaUrl: String!
+ deleted: Boolean!
+
+ """Samples from which this sample is derived"""
+ parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
+
+ """Samples derived from this sample"""
+ children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!
+
+ """Events linked to this sample"""
+ events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!
+
+ """The JSON schema that the sample's `data` conforms to"""
+ dataSchema: JSON!
+
+ """The instrument sessions that this sample is associated with"""
+ instrumentSessions: [InstrumentSession!]!
+ images: [SampleImage!]!
+
+ """The container containing the sample"""
+ container: Container
+
+ """The sample's position within a container"""
+ positionInContainer: ContainerPosition
+}
+
+input StringFilterInputV2 {
+ """
+ Will filter to items where the `String` field is a member of the provided value
+ """
+ in: [String!] = null
+
+ """
+ Will filter to items where the `String` field is equal to the provided value
+ """
+ equalTo: String = null
+
+ """
+ Will filter to items where the `String` field is not equal to the provided value
+ """
+ notEqualTo: String = null
+
+ """
+ Will filter to items where the `String` field is not a member of the provided value
+ """
+ notIn: [String!] = null
+
+ """
+ Will filter to items where the `String` field is contains the provided value
+ """
+ contains: String = null
+}
+
+scalar UUID
+
+"""Values that can be updated on experiment definition"""
+input UpdateExperimentDefinitionInput {
+ name: String
+ data: JSON
+ dataSchemaUrl: String
+}
+
+"""Return type when updating an experiment definition"""
+type UpdateExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Experiment Definition that has been updated"""
+ experimentDefinition: ExperimentDefinition
+
+ """Errors that occurred during validation"""
+ errors: [ExperimentDefinitionErrorDetails!]!
+}
+
input AddSampleEventInput {
description: String!
} |
VictoriaBeilsten-Edmands
previously approved these changes
Aug 14, 2026
VictoriaBeilsten-Edmands
force-pushed
the
experiments-experiments-0.3.0
branch
from
August 14, 2026 12:14
4fea031 to
03bfb6a
Compare
diff --git a/tmp/old_sorted.json b/tmp/new_sorted.json
index 962a55e..53c0447 100644
--- a/tmp/old_sorted.json
+++ b/tmp/new_sorted.json
@@ -319,6 +319,28 @@
],
"typeName": "CreateExperimentsResponse"
},
+ {
+ "fieldNames": [
+ "type",
+ "location",
+ "message"
+ ],
+ "typeName": "DeleteErrorDetails"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "errors"
+ ],
+ "typeName": "DeleteExperimentResponse"
+ },
+ {
+ "fieldNames": [
+ "success",
+ "errors"
+ ],
+ "typeName": "DeletedExperimentDefinitionResponse"
+ },
{
"fieldNames": [
"edges",
@@ -336,6 +358,9 @@
"dataSchemaUrl",
"proposalNumber",
"instrumentSessionNumber",
+ "deleted",
+ "createdBy",
+ "modifiedBy",
"instrumentSession",
"experiments"
],
@@ -398,7 +423,7 @@
"customGraphql": {
"federation": {
"enabled": true,
- "serviceSdl": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
+ "serviceSdl": "directive @oneOf on INPUT_OBJECT\n\nschema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment @key(fields: \"id\") {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n}\n\ntype ExperimentConnection @shareable {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection @shareable {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge @shareable {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge @shareable {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo @shareable {\n startCursor: String\n endCursor: String\n hasNextPage: Boolean!\n hasPreviousPage: Boolean!\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n _entities(representations: [_Any!]!): [_Entity]!\n _service: _Service!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n id: UUID! @external\n experiments: [Experiment!]!\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\nscalar _Any\n\nunion _Entity = Experiment | InstrumentSession | Proposal | Sample\n\ntype _Service {\n sdl: String!\n}\n"
},
"fetch": {
"baseUrl": {},
@@ -418,7 +443,7 @@
"websocketSubprotocol": "GRAPHQL_WEBSOCKET_SUBPROTOCOL_AUTO"
},
"upstreamSchema": {
- "key": "205f29cfa96469ebbca12795a6c272d9fca847ee"
+ "key": "002a5eb946b470d27322fd7ede391d75321b25b1"
}
},
"id": "2",
@@ -462,7 +487,10 @@
"name",
"createdTime",
"updatedTime",
+ "deleted",
"experimentDefinition",
+ "createdBy",
+ "modifiedBy",
"sample"
],
"typeName": "Experiment"
@@ -481,7 +509,11 @@
{
"fieldNames": [
"createExperimentDefinition",
- "experimentDefinition"
+ "experimentDefinition",
+ "deleteExperiment",
+ "restoreExperiment",
+ "deleteExperimentDefinition",
+ "restoreExperimentDefinition"
],
"typeName": "Mutation"
},
@@ -1364,6 +1396,46 @@
"fieldName": "experimentDefinition",
"typeName": "Mutation"
},
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "deleteExperiment",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "restoreExperiment",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "deleteExperimentDefinition",
+ "typeName": "Mutation"
+ },
+ {
+ "argumentsConfiguration": [
+ {
+ "name": "id",
+ "sourceType": "FIELD_ARGUMENT"
+ }
+ ],
+ "fieldName": "restoreExperimentDefinition",
+ "typeName": "Mutation"
+ },
{
"argumentsConfiguration": [
{
@@ -1624,6 +1696,10 @@
"name": "instrumentSessions",
"sourceType": "FIELD_ARGUMENT"
},
+ {
+ "name": "filter",
+ "sourceType": "FIELD_ARGUMENT"
+ },
{
"name": "first",
"sourceType": "FIELD_ARGUMENT"
@@ -2455,9 +2531,9 @@
"typeName": "ContainerTypeMutations"
}
],
- "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(visit: VisitInput!, manifest: String!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n deleteSample(sampleId: UUID!): DeleteSampleResponse!\n restoreSample(sampleId: UUID!): RestoreSampleResponse!\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, filter: ContainerFilterInput = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n}\n\ntype TriggerConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype Sample {\n id: UUID!\n experiments: [Experiment!]!\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"Return type when deleting a sample\"\"\"\ntype DeleteSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\n\"\"\"Return type when restoring a deleted sample\"\"\"\ntype RestoreSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating a sample\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"The user that created the container\"\"\"\n createdBy: String!\n \"\"\"The user that last modified the container\"\"\"\n modifiedBy: String!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\n\"\"\"Values required to filter a list of containers\"\"\"\ninput ContainerFilterInput {\n \"\"\"Filter using the id of the container's parent\"\"\"\n parentId: UUIDFilterInputV2 = null\n \"\"\"Filter using the of the container's children\"\"\"\n childId: UUIDFilterInputV2 = null\n \"\"\"Include/exclude 'deleted' containers\"\"\"\n includeDeleted: Boolean! = false\n \"\"\"Filter to containers with/without child containers\"\"\"\n hasChildren: Boolean = null\n \"\"\"Filter to containers with/without a parent\"\"\"\n hasParent: Boolean = null\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The user that created the container type\"\"\"\n createdBy: String!\n \"\"\"The user user that last modified the container type\"\"\"\n modifiedBy: String!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\ninput UUIDFilterInputV2 {\n \"\"\"\n Will filter to items where the `UUID` field is a member of the provided value\n \"\"\"\n in: [UUID!] = null\n \"\"\"\n Will filter to items where the `UUID` field is equal to the provided value\n \"\"\"\n equalTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not equal to the provided value\n \"\"\"\n notEqualTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not a member of the provided value\n \"\"\"\n notIn: [UUID!] = null\n}\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}",
+ "graphqlSchema": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ntype Artifact {\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, visit: VisitInput!, parameters: JSON!): Workflow!\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(visit: VisitInput!, manifest: String!): Workflow!\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations\n createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!\n sample(sampleId: UUID!): SampleMutations\n deleteSample(sampleId: UUID!): DeleteSampleResponse!\n restoreSample(sampleId: UUID!): RestoreSampleResponse!\n \"\"\"Create a new container type\"\"\"\n createContainerType(input: CreateContainerTypeInput!): CreateContainerTypeResponse!\n \"\"\"Mutations relating to a specific container type\"\"\"\n containerType(name: String!): ContainerTypeMutations!\n \"\"\"Create a new container\"\"\"\n createContainer(input: CreateContainerInput!): CreateContainerResponse!\n \"\"\"Muatations relating to a specific container\"\"\"\n container(id: UUID = null, barcode: String = null): ContainerMutations!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean!\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean!\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(visit: VisitInput!, cursor: String, limit: Int, filter: WorkflowFilter): WorkflowConnection!\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, limit: Int, filter: WorkflowTemplatesFilter): WorkflowTemplateConnection!\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection\n experiment(id: UUID!): Experiment\n experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(proposalNumber: Int = null, proposalCategory: String = null, first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get a sample by its id\"\"\"\n sample(sampleId: UUID!): Sample\n \"\"\"Get a list of samples associated with a given instrument session\"\"\"\n samples(first: Int = null, instrumentSessions: [InstrumentSessionInput!] = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n \"\"\"Fetch a single container type, by specifying its name\"\"\"\n containerType(name: String!): ContainerType\n \"\"\"Fetch multiple container types, by specifying associated instruments\"\"\"\n containerTypes(instrumentKeys: [String!]!, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerTypeConnection!\n \"\"\"Fetch a single container, by specifying either its id or barcode\"\"\"\n container(id: UUID = null, barcode: String = null): Container\n \"\"\"\n \n Fetch multiple containers, by specifying either its parent, a child, an\n associated instrument, or associated instrument sessions\n \"\"\"\n containers(instrumentSessions: [InstrumentSessionInput!] = null, instrumentKeys: [String!] = null, filter: ContainerFilterInput = null, first: Int = 20, last: Int = null, before: String = null, after: String = null): ContainerConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(visit: VisitInput!, workflowName: String!, taskId: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(visit: VisitInput!, name: String!): Workflow!\n}\n\ntype Task {\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n}\n\nenum TaskStatus {\n PENDING\n RUNNING\n SUCCEEDED\n SKIPPED\n FAILED\n ERROR\n OMITTED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n}\n\ntype TriggerConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n \"\"\"Session visit Number\"\"\"\n number: Int!\n}\n\ntype Workflow {\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n}\n\ntype WorkflowConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]!\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus | WorkflowFailedStatus | WorkflowErroredStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n failed: Boolean! = false\n error: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo!\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]!\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate!\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String!\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The version of the schema\"\"\"\n version: String\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The description og the schema\"\"\"\n description: String\n}\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n name: String!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n}\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n}\n\ntype Experiment {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n createdBy: String!\n modifiedBy: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinition {\n id: UUID!\n name: String!\n createdTime: DateTime!\n updatedTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n deleted: Boolean!\n createdBy: String!\n modifiedBy: String!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String!\n node: ExperimentDefinition!\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n}\n\ntype ExperimentEdge {\n cursor: String!\n node: Experiment!\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession {\n instrumentSessionNumber: Int!\n proposal: Proposal\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionReference: String\n startTime: DateTime\n endTime: DateTime\n type: String\n state: String\n riskRating: String\n instrument: Instrument!\n roles: [InstrumentSessionRole!]!\n \"\"\"Samples associated with a given instrument session\"\"\"\n samples(first: Int = null, filter: SampleFilterInput! = {schemaUrl: null, createdTime: null, updatedTime: null, name: null, data: null}, before: String = null, after: String = null, last: Int = null, orderBy: SampleOrder! = {name: null, createdTime: null, updatedTime: null}): SampleConnection!\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n proposalNumber: Int!\n instrumentSessionNumber: Int!\n}\n\ninput JSONFilterConditionInput @oneOf {\n stringFilter: StringFilterInputV2 = null\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype Proposal {\n proposalNumber: Int!\n proposalCategory: String\n title: String\n summary: String\n state: ProposalState!\n proposalReference: String\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n roles: [ProposalAccount!]!\n}\n\ntype Sample {\n id: UUID!\n experiments: [Experiment!]!\n name: String!\n data: JSON!\n createdTime: DateTime!\n updatedTime: DateTime!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Samples from which this sample is derived\"\"\"\n parents(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Samples derived from this sample\"\"\"\n children(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleConnection!\n \"\"\"Events linked to this sample\"\"\"\n events(first: Int = null, before: String = null, after: String = null, last: Int = null): SampleEventConnection!\n \"\"\"The JSON schema that the sample's `data` conforms to\"\"\"\n dataSchema: JSON!\n \"\"\"The instrument sessions that this sample is associated with\"\"\"\n instrumentSessions: [InstrumentSession!]!\n images: [SampleImage!]!\n \"\"\"The container containing the sample\"\"\"\n container: Container\n \"\"\"The sample's position within a container\"\"\"\n positionInContainer: ContainerPosition\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n name: String\n data: JSON\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n}\n\ntype Account {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n proposalRoles: [ProposalAccount!]!\n instrumentSessionRoles: [InstrumentSessionRole!]!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n givenName: StringFilterInput = null\n familyName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n enabled\n disabled\n}\n\nenum AccountType {\n user\n staff\n functional\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n}\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n neq: DateTime = null\n gt: DateTime = null\n lt: DateTime = null\n gte: DateTime = null\n lte: DateTime = null\n}\n\ntype Instrument {\n name: String!\n key: String!\n scienceGroup: String\n description: String\n proposals(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [ProposalSortInput!] = null, filterBy: ProposalFilterInput = null): ProposalConnection!\n instrumentSessions(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [InstrumentSessionSortInput!] = null, filterBy: InstrumentSessionFilterInput = null): InstrumentSessionConnection!\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(first: Int = null, last: Int = null, after: String = null, before: String = null, sortBy: [AccountSortInput!] = null, filterBy: AccountFilterInput = null): StaffConnection!\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]!\n pageInfo: PageInfo!\n}\n\ntype InstrumentSessionEdge {\n cursor: String!\n node: InstrumentSession!\n}\n\ninput InstrumentSessionFilterInput {\n instrumentSessionNumber: IntFilterInput = null\n startTime: DateTimeFilterInput = null\n endTime: DateTimeFilterInput = null\n type: StringFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n riskRating: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n}\n\ntype InstrumentSessionMutations {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n \"\"\"Create or validate samples associated with this instrument session\"\"\"\n createOrValidateSamples(input: CreateOrValidateSampleInputBase!): CreateSamplesResponse!\n}\n\ntype InstrumentSessionRole {\n instrumentSession: InstrumentSession!\n account: Account!\n role: String!\n onSite: Boolean!\n}\n\nenum InstrumentSessionSortField {\n instrumentSessionNumber\n startTime\n endTime\n type\n state\n riskRating\n proposalNumber\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n neq: Int = null\n gt: Int = null\n lt: Int = null\n gte: Int = null\n lte: Int = null\n}\n\ntype ProposalAccount {\n proposal: Proposal!\n account: Account!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ProposalEdge {\n cursor: String!\n node: Proposal!\n}\n\ninput ProposalFilterInput {\n proposalNumber: IntFilterInput = null\n proposalCategory: StringFilterInput = null\n title: StringFilterInput = null\n state: ProposalStateFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n OPEN\n CLOSED\n CANCELLED\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n username: String!\n emailAddress: String\n title: String\n givenName: String\n familyName: String\n type: AccountType!\n state: AccountState!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]!\n pageInfo: PageInfo!\n}\n\ntype StaffEdge {\n cursor: String!\n node: Staff!\n}\n\ninput StringFilterInput {\n eq: String = null\n neq: String = null\n contains: String = null\n notContains: String = null\n startsWith: String = null\n endsWith: String = null\n}\n\ninput AddSampleEventInput {\n description: String!\n}\n\ninput CreateOrValidateSampleInput {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n \"\"\"Number of the proposal the samples should be associated with\"\"\"\n proposalNumber: Int!\n \"\"\"Number of the instrument session the samples should be associated with\"\"\"\n instrumentSessionNumber: Int!\n}\n\ninput CreateOrValidateSampleInputBase {\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String!\n \"\"\"Samples to be created\"\"\"\n samples: [SampleIn!]!\n \"\"\"\n Whether or not the provided samples should only be validated and not created\n \"\"\"\n validateOnly: Boolean! = false\n}\n\n\"\"\"Return type when creating or validating samples\"\"\"\ntype CreateSamplesResponse {\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n \"\"\"Samples that have been created\"\"\"\n samples: [Sample!]!\n \"\"\"Errors that occurred during sample validation\"\"\"\n errors: [SampleValidationError!]!\n}\n\ninput DatetimeOperatorInput {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n gt: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lt: DateTime = null\n}\n\n\"\"\"Return type when deleting a sample\"\"\"\ntype DeleteSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\n\"\"\"The details of sample validation error\"\"\"\ntype ErrorDetails {\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n \"\"\"\n Tuple of strings identifying where in the sample schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n}\n\ninput JSONOperator @oneOf {\n stringOperator: StringOperatorInput = null\n datetimeOperator: DatetimeOperatorInput = null\n numericOperator: NumericOperatorInput = null\n}\n\ninput JSONOperatorInput {\n \"\"\"A JSON path specifying the value to filter. Must start with '$.'\"\"\"\n path: String!\n \"\"\"The operator to apply to the JSON field\"\"\"\n operator: JSONOperator!\n}\n\ninput NumericOperatorInput {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n gt: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lt: Float = null\n}\n\n\"\"\"Return type when restoring a deleted sample\"\"\"\ntype RestoreSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [String!]!\n}\n\ntype SampleConnection {\n edges: [SampleEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEdge {\n cursor: String!\n node: Sample!\n}\n\ntype SampleEvent {\n id: UUID!\n timestamp: DateTime!\n description: String!\n}\n\ntype SampleEventConnection {\n edges: [SampleEventEdge!]!\n pageInfo: PageInfo!\n}\n\ntype SampleEventEdge {\n cursor: String!\n node: SampleEvent!\n}\n\ninput SampleFilterInput {\n \"\"\"Filter on the `schemaUrl` field of `Sample`\"\"\"\n schemaUrl: StringOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n createdTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `createdTime` field of `Sample`\"\"\"\n updatedTime: DatetimeOperatorInput = null\n \"\"\"Filter on the `name` field of `Sample`\"\"\"\n name: StringOperatorInput = null\n \"\"\"Filter on the `data` field of `Sample`\"\"\"\n data: [JSONOperatorInput!] = null\n}\n\ntype SampleImage {\n url: String!\n filename: String!\n}\n\ninput SampleIn {\n \"\"\"Name of the sample\"\"\"\n name: String!\n \"\"\"Data of the sample\"\"\"\n data: JSON!\n}\n\ntype SampleMutations {\n sampleId: UUID!\n updateSample(input: UpdateSampleInput!): UpdateSampleResponse!\n linkInstrumentSessionToSample(proposalNumber: Int!, instrumentSessionNumber: Int!): Void\n addSampleEvent(sampleEvent: AddSampleEventInput!): SampleEvent!\n createSampleImageUploadUrl(filename: String!, contentType: String!, contentLength: Int!): String!\n \"\"\"Assign this sample to a container\"\"\"\n addSampleToContainer(input: AddSampleToContainerInput!): AddSampleToContainerResponse!\n}\n\ninput SampleOrder {\n name: SortingOrder = null\n createdTime: SortingOrder = null\n updatedTime: SortingOrder = null\n}\n\n\"\"\"The details of errors occurred when validating a sample\"\"\"\ntype SampleValidationError {\n \"\"\"\n The index of the sample in CreateSampleInput.samples for which the error occurred\n \"\"\"\n index: Int!\n \"\"\"Errors that occurred when validating the sample\"\"\"\n errors: [ErrorDetails!]!\n}\n\nenum SortingOrder {\n ASC\n DESC\n}\n\n\"\"\"Conditions used to filter results based on the value of a String field\"\"\"\ninput StringOperatorInput {\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n eq: String = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n ne: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n nin: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n}\n\ninput UpdateSampleInput {\n \"\"\"Name of the sample\"\"\"\n name: String\n \"\"\"Data of the sample\"\"\"\n data: JSON\n \"\"\"URL of the JSON schema the samples' `data` should be validated against\"\"\"\n dataSchemaUrl: String\n}\n\n\"\"\"Return type when updating a sample\"\"\"\ntype UpdateSampleResponse {\n \"\"\"Whether the operation has succeeded\"\"\"\n success: Boolean!\n \"\"\"Sample that has been updated\"\"\"\n sample: Sample\n \"\"\"Errors that occurred during the operation\"\"\"\n errors: [SampleValidationError!]!\n}\n\n\"\"\"Represents NULL values\"\"\"\nscalar Void\n\n\"\"\"Values required to set a container's children\"\"\"\ninput AddContainersToContainerInput {\n containerPositions: [ChildContainerPositionInput!]!\n}\n\ntype AddContainersToContainerResponse {\n success: Boolean!\n containerPositions: [ContainerPosition!]\n errors: [String!]!\n}\n\ninput AddSampleToContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype AddSampleToContainerResponse {\n success: Boolean!\n samplePosition: SamplePostion\n errors: [String!]!\n}\n\ninput AddSamplesToContainerInput {\n samplePositions: [SamplePositionInput!]!\n}\n\ntype AddSamplesToContainerResponse {\n success: Boolean!\n samplePositions: [SamplePostion!]\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument\"\"\"\ninput AssignContainerToInstrumentInput {\n \"\"\"The unique key of the instrument this container should be assigned to\"\"\"\n instrumentKey: String!\n}\n\ntype AssignContainerToInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to assign a contianer to an instrument session\"\"\"\ninput AssignContainerToInstrumentSessionInput {\n \"\"\"The instrument session this container should be assigned to\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype AssignContainerToInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to specify a container's position within a container\"\"\"\ninput ChildContainerPositionInput {\n childContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A container that can store samples and/or other containers\"\"\"\ntype Container {\n \"\"\"The unique identifier of this container\"\"\"\n id: UUID!\n \"\"\"When the container was created in the service\"\"\"\n createdTime: DateTime!\n \"\"\"When the container was last updated in the service\"\"\"\n updatedTime: DateTime!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The type of this container\"\"\"\n type: ContainerType!\n \"\"\"The manufacturer's serial number of the container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode for the container\"\"\"\n barcode: String\n \"\"\"Whether or not the container has been marked as discarded\"\"\"\n deleted: Boolean!\n \"\"\"The user that created the container\"\"\"\n createdBy: String!\n \"\"\"The user that last modified the container\"\"\"\n modifiedBy: String!\n \"\"\"\n The instrument sessions that this container is currently associated with\n \"\"\"\n instrumentSessions: [InstrumentSession!]!\n \"\"\"Sample positions within this container\"\"\"\n samplePositions: [SamplePostion!]!\n \"\"\"The top-level fixed location where this container is stored\"\"\"\n location: Container\n parent: Container\n \"\"\"The container position occupied by this container\"\"\"\n positionInParent: ContainerPosition\n children: [Container!]!\n \"\"\"Container positions within this container\"\"\"\n containerPositions: [ContainerPosition!]!\n}\n\ntype ContainerConnection {\n edges: [ContainerEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerEdge {\n cursor: String!\n node: Container!\n}\n\n\"\"\"Values required to filter a list of containers\"\"\"\ninput ContainerFilterInput {\n \"\"\"Filter using the id of the container's parent\"\"\"\n parentId: UUIDFilterInputV2 = null\n \"\"\"Filter using the of the container's children\"\"\"\n childId: UUIDFilterInputV2 = null\n \"\"\"Include/exclude 'deleted' containers\"\"\"\n includeDeleted: Boolean! = false\n \"\"\"Filter to containers with/without child containers\"\"\"\n hasChildren: Boolean = null\n \"\"\"Filter to containers with/without a parent\"\"\"\n hasParent: Boolean = null\n}\n\ntype ContainerMutations {\n \"\"\"Update this container\"\"\"\n updateContainer(input: UpdateContainerInput!): UpdateContainerResponse!\n \"\"\"Add containers to this container\"\"\"\n addContainersToContainer(input: AddContainersToContainerInput!): AddContainersToContainerResponse!\n \"\"\"Remove containers from this container\"\"\"\n removeContainersFromContainer(input: RemoveContainersFromContainerInput!): RemoveContainersFromContainerResponse!\n \"\"\"Set the container that this container is contained within\"\"\"\n setParentContainer(input: SetParentContainerInput!): SetParentContainerResponse!\n \"\"\"Add samples to this container\"\"\"\n addSamplesToContainer(input: AddSamplesToContainerInput!): AddSamplesToContainerResponse!\n \"\"\"Remove samples from this container\"\"\"\n removeSamplesFromContainer(input: RemoveSamplesFromContainerInput!): RemoveSamplesFromContainerResponse!\n \"\"\"Associate this container with an instrument session\"\"\"\n assignContainerToInstrumentSession(input: AssignContainerToInstrumentSessionInput!): AssignContainerToInstrumentSessionResponse!\n \"\"\"Unassign this container from an instrument session\"\"\"\n unassignContainerFromInstrumentSession(input: UnassignContainerFromInstrumentSessionInput!): UnassignContainerFromInstrumentSessionResponse!\n \"\"\"Associate this container with an instrument\"\"\"\n assignContainerToInstrument(input: AssignContainerToInstrumentInput!): AssignContainerToInstrumentResponse!\n \"\"\"Unassign this container from an instrument\"\"\"\n unassignContainerFromInstrument(input: UnassignContainerFromInstrumentInput!): UnassignContainerFromInstrumentResponse!\n}\n\ntype ContainerPosition {\n position: Int\n container: Container\n}\n\n\"\"\"Values required to specify a position within a container\"\"\"\ninput ContainerPositionInput {\n parentContainerId: UUID!\n position: Int = null\n}\n\n\"\"\"A type of container\"\"\"\ntype ContainerType {\n \"\"\"The unique name of the container type\"\"\"\n name: String!\n \"\"\"A description of this type of container\"\"\"\n description: String!\n \"\"\"The number of containers the container can hold\"\"\"\n numberOfContainerPositions: Int\n \"\"\"The number of samples the container can hold\"\"\"\n numberOfSamplePositions: Int\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The user that created the container type\"\"\"\n createdBy: String!\n \"\"\"The user user that last modified the container type\"\"\"\n modifiedBy: String!\n}\n\ntype ContainerTypeConnection {\n edges: [ContainerTypeEdge!]!\n pageInfo: PageInfo!\n}\n\ntype ContainerTypeEdge {\n cursor: String!\n node: ContainerType!\n}\n\ntype ContainerTypeMutations {\n \"\"\"Update this container type\"\"\"\n updateContainerType(input: UpdateContainerTypeInput!): UpdateContainerTypeResponse!\n}\n\n\"\"\"Values required to create a container\"\"\"\ninput CreateContainerInput {\n \"\"\"The unique key of an instrument associated with this container\"\"\"\n instrumentKey: String = null\n \"\"\"An instrument session associated with this container\"\"\"\n instrumentSession: InstrumentSessionInput = null\n \"\"\"The name of the type of this container\"\"\"\n type: String!\n \"\"\"The name of the container\"\"\"\n name: String!\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String = null\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String = null\n}\n\ntype CreateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to create a container type\"\"\"\ninput CreateContainerTypeInput {\n \"\"\"The unique key of an instrument associated with this container type\"\"\"\n instrumentKey: String!\n \"\"\"The unique name of this container type\"\"\"\n name: String!\n \"\"\"A description of this container type\"\"\"\n description: String!\n \"\"\"Whether or not this container type is a fixed storage location\"\"\"\n isFixedLocation: Boolean!\n \"\"\"The number of container positions within this container\"\"\"\n numberOfContainerPositions: Int = 0\n \"\"\"The number of sample positions within this container\"\"\"\n numberOfSamplePositions: Int = 0\n}\n\ntype CreateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}\n\n\"\"\"Values required to remove containers from a container\"\"\"\ninput RemoveContainersFromContainerInput {\n containerIds: [UUID!]!\n}\n\ntype RemoveContainersFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to remove samples from a container\"\"\"\ninput RemoveSamplesFromContainerInput {\n sampleIds: [UUID!]!\n}\n\ntype RemoveSamplesFromContainerResponse {\n success: Boolean!\n}\n\n\"\"\"Values required to specify a sample's position within a container\"\"\"\ninput SamplePositionInput {\n sampleId: UUID!\n position: Int = null\n}\n\ntype SamplePostion {\n position: Int\n sample: Sample\n}\n\n\"\"\"Values required to set a container's parent\"\"\"\ninput SetParentContainerInput {\n containerPosition: ContainerPositionInput!\n}\n\ntype SetParentContainerResponse {\n success: Boolean!\n containerPosition: ContainerPosition\n errors: [String!]!\n}\n\ninput UUIDFilterInputV2 {\n \"\"\"\n Will filter to items where the `UUID` field is a member of the provided value\n \"\"\"\n in: [UUID!] = null\n \"\"\"\n Will filter to items where the `UUID` field is equal to the provided value\n \"\"\"\n equalTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not equal to the provided value\n \"\"\"\n notEqualTo: UUID = null\n \"\"\"\n Will filter to items where the `UUID` field is not a member of the provided value\n \"\"\"\n notIn: [UUID!] = null\n}\n\n\"\"\"Values required to unassign a contianer from an instrument\"\"\"\ninput UnassignContainerFromInstrumentInput {\n \"\"\"\n The unique key of the instrument this container should be unassigned from\n \"\"\"\n instrumentKey: String!\n}\n\ntype UnassignContainerFromInstrumentResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to unassign a contianer from an instrument session\"\"\"\ninput UnassignContainerFromInstrumentSessionInput {\n \"\"\"The instrument session this container should be unassigned from\"\"\"\n instrumentSession: InstrumentSessionInput!\n}\n\ntype UnassignContainerFromInstrumentSessionResponse {\n success: Boolean!\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container\"\"\"\ninput UpdateContainerInput {\n \"\"\"The name of the container\"\"\"\n name: String\n \"\"\"The serial number of this container\"\"\"\n serialNumber: String\n \"\"\"The facility barcode of the container\"\"\"\n barcode: String\n}\n\ntype UpdateContainerResponse {\n success: Boolean!\n container: Container\n errors: [String!]!\n}\n\n\"\"\"Values required to update a container type\"\"\"\ninput UpdateContainerTypeInput {\n \"\"\"The unique name of the container type\"\"\"\n name: String\n \"\"\"A description of this container type\"\"\"\n description: String\n \"\"\"Used to distingush storage locations from moveable containers\"\"\"\n isFixedLocation: Boolean\n}\n\ntype UpdateContainerTypeResponse {\n success: Boolean!\n containerType: ContainerType\n errors: [String!]!\n}",
"stringStorage": {
- "205f29cfa96469ebbca12795a6c272d9fca847ee": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ntype Experiment @key(fields: \"id\") {\n createdTime: DateTime!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
+ "002a5eb946b470d27322fd7ede391d75321b25b1": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@external\", \"@key\", \"@provides\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @external on FIELD_DEFINITION | OBJECT\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @provides(fields: openfed__FieldSet!) on FIELD_DEFINITION\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\n\"\"\"Values required to create an experiment definition\"\"\"\ninput CreateExperimentDefinitionInput {\n data: JSON!\n dataSchemaUrl: String!\n instrumentSessionNumber: Int!\n name: String!\n proposalNumber: Int!\n}\n\n\"\"\"Return type when creating an experiment definition\"\"\"\ntype CreateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been created\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Values required for the createExperiments mutation\"\"\"\ninput CreateExperimentsInput {\n experiments: [ExperimentInput!]!\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype CreateExperimentsResponse {\n \"\"\"Errors that occurred during experiments creation\"\"\"\n errors: [String!]!\n \"\"\"Experiments created\"\"\"\n experiments: [Experiment!]\n \"\"\"Whether the operation has succeeded without errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DatetimeFilterInputV2 {\n \"\"\"\n Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value\n \"\"\"\n greaterThan: DateTime = null\n \"\"\"\n Will filter to items where the `DateTime` field is less than (i.e. before) the provided value\n \"\"\"\n lessThan: DateTime = null\n}\n\n\"\"\"The details of an deleted record validation error\"\"\"\ntype DeleteErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the record schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeleteExperimentResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\n\"\"\"Return type when marking an record as deleted\"\"\"\ntype DeletedExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [DeleteErrorDetails!]!\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\ntype Experiment @key(fields: \"id\") {\n createdBy: String!\n createdTime: DateTime!\n deleted: Boolean!\n experimentDefinition: ExperimentDefinition!\n id: UUID!\n modifiedBy: String!\n name: String!\n \"\"\"The sample that this experiment is associated with\"\"\"\n sample: Sample! @provides(fields: \"id\")\n updatedTime: DateTime!\n}\n\ntype ExperimentConnection {\n edges: [ExperimentEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinition {\n createdBy: String!\n createdTime: DateTime!\n data: JSON!\n dataSchemaUrl: String!\n deleted: Boolean!\n \"\"\"Experiments associated with this experiment definition\"\"\"\n experiments: [Experiment!]!\n id: UUID!\n \"\"\"\n The instrument session that this experiment definition is associated with\n \"\"\"\n instrumentSession: InstrumentSession! @provides(fields: \"instrumentSessionNumber proposal{ proposalNumber }\")\n instrumentSessionNumber: Int!\n modifiedBy: String!\n name: String!\n proposalNumber: Int!\n updatedTime: DateTime!\n}\n\ntype ExperimentDefinitionConnection {\n edges: [ExperimentDefinitionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ExperimentDefinitionEdge {\n cursor: String! @shareable\n node: ExperimentDefinition! @shareable\n}\n\n\"\"\"The details of an experiment definition validation error\"\"\"\ntype ExperimentDefinitionErrorDetails {\n \"\"\"\n Tuple of strings identifying where in the experiment definition schema the error occurred.\n \"\"\"\n location: [String!]!\n \"\"\"A human readable error message.\"\"\"\n message: String!\n \"\"\"The type of error that occurred\"\"\"\n type: String!\n}\n\n\"\"\"Values required to filter a list of experiment definitions\"\"\"\ninput ExperimentDefinitionFilterInput {\n \"\"\"Filter by the created datetime of experiment definitions\"\"\"\n createdTime: DatetimeFilterInputV2 = null\n \"\"\"Filter within the JSON data of experiment definitions\"\"\"\n data: [JSONFilterInputV2!] = null\n \"\"\"Filter by the data schema URL of experiment definitions\"\"\"\n dataSchemaUrl: StringFilterInputV2 = null\n \"\"\"Filter by the name of experiment definitions\"\"\"\n name: StringFilterInputV2 = null\n \"\"\"Filter by the update datetime of experiment definitions\"\"\"\n updatedTime: DatetimeFilterInputV2 = null\n}\n\n\"\"\"Mutations for a given experiment defintion\"\"\"\ntype ExperimentDefinitionMutations {\n createExperiments(input: CreateExperimentsInput!): CreateExperimentsResponse!\n updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!\n}\n\ntype ExperimentEdge {\n cursor: String! @shareable\n node: Experiment! @shareable\n}\n\n\"\"\"Values required to create an experiment\"\"\"\ninput ExperimentInput {\n name: String!\n sampleId: UUID!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal { proposalNumber }\") {\n \"\"\"Experiment Definitions\"\"\"\n experimentDefinitions(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentDefinitionConnection!\n \"\"\"Experiments associated with this session\"\"\"\n experiments(after: String = null, before: String = null, first: Int = null, last: Int = null): ExperimentConnection!\n instrumentSessionNumber: Int! @external\n proposal: Proposal @external\n}\n\n\"\"\"Values required to uniquely identify an instrument session\"\"\"\ninput InstrumentSessionInput {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ninput JSONFilterConditionInput @oneOf {\n datetimeFilter: DatetimeFilterInputV2 = null\n numericFilter: NumericFilterInputV2 = null\n stringFilter: StringFilterInputV2 = null\n}\n\ninput JSONFilterInputV2 {\n \"\"\"The filter operation to apply to the field\"\"\"\n condition: JSONFilterConditionInput!\n \"\"\"The JSON path to the field to filter. Must start with '$.'\"\"\"\n path: String!\n}\n\ntype Mutation {\n createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse\n deleteExperiment(id: UUID!): DeleteExperimentResponse\n deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n experimentDefinition(id: UUID!): ExperimentDefinitionMutations\n restoreExperiment(id: UUID!): DeleteExperimentResponse\n restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse\n}\n\ninput NumericFilterInputV2 {\n \"\"\"\n Will filter to items where the numeric field is greater than the provided value\n \"\"\"\n greaterThan: Float = null\n \"\"\"\n Will filter to items where the numeric field is less than the provided value\n \"\"\"\n lessThan: Float = null\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") {\n proposalNumber: Int! @external\n}\n\ntype Query {\n experiment(id: UUID!): Experiment\n experimentDefinition(id: UUID!): ExperimentDefinition\n experimentDefinitions(after: String = null, before: String = null, filter: ExperimentDefinitionFilterInput = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentDefinitionConnection\n experiments(after: String = null, before: String = null, first: Int = null, instrumentSessions: [InstrumentSessionInput!]!, last: Int = null): ExperimentConnection\n}\n\ntype Sample @key(fields: \"id\") {\n experiments: [Experiment!]!\n id: UUID! @external\n}\n\ninput StringFilterInputV2 {\n \"\"\"\n Will filter to items where the `String` field is contains the provided value\n \"\"\"\n contains: String = null\n \"\"\"\n Will filter to items where the `String` field is equal to the provided value\n \"\"\"\n equalTo: String = null\n \"\"\"\n Will filter to items where the `String` field is a member of the provided value\n \"\"\"\n in: [String!] = null\n \"\"\"\n Will filter to items where the `String` field is not equal to the provided value\n \"\"\"\n notEqualTo: String = null\n \"\"\"\n Will filter to items where the `String` field is not a member of the provided value\n \"\"\"\n notIn: [String!] = null\n}\n\nscalar UUID\n\n\"\"\"Values that can be updated on experiment definition\"\"\"\ninput UpdateExperimentDefinitionInput {\n data: JSON\n dataSchemaUrl: String\n name: String\n}\n\n\"\"\"Return type when updating an experiment definition\"\"\"\ntype UpdateExperimentDefinitionResponse {\n \"\"\"Errors that occurred during validation\"\"\"\n errors: [ExperimentDefinitionErrorDetails!]!\n \"\"\"Experiment Definition that has been updated\"\"\"\n experimentDefinition: ExperimentDefinition\n \"\"\"Whether the operation has succeeded without validation errors\"\"\"\n success: Boolean!\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"42f0af102c26cc7df0bfcca4c1e19a298c4f5749": "schema @link(url: \"https://specs.apollo.dev/federation/v2.7\", import: [\"@key\", \"@shareable\"]) {\n query: Query\n mutation: Mutation\n}\n\ndirective @key(fields: openfed__FieldSet!, resolvable: Boolean = true) repeatable on INTERFACE | OBJECT\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Account {\n accountId: Int! @deprecated(reason: \"account_id is deprecated and will be removed in a future version.\")\n emailAddress: String\n familyName: String\n givenName: String\n instrumentSessionRoles: [InstrumentSessionRole!]!\n proposalRoles: [ProposalAccount!]!\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ninput AccountFilterInput {\n emailAddress: StringFilterInput = null\n familyName: StringFilterInput = null\n givenName: StringFilterInput = null\n}\n\nenum AccountSortField {\n family_name\n given_name\n}\n\ninput AccountSortInput {\n field: AccountSortField!\n orderBy: SortOrder!\n}\n\nenum AccountState {\n disabled\n enabled\n}\n\nenum AccountType {\n functional\n staff\n user\n}\n\ninput CreateInstrumentSessionInput {\n \"\"\"\n Instrument Session information that isn't needed by the Session Service but should be passed through the UAS\n \"\"\"\n additionalInfo: JSON = null\n \"\"\"Name of the instrument the session is for\"\"\"\n instrumentName: String!\n \"\"\"Number of the proposal the session is for\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"Date with time (isoformat)\"\"\"\nscalar DateTime\n\ninput DateTimeFilterInput {\n eq: DateTime = null\n gt: DateTime = null\n gte: DateTime = null\n lt: DateTime = null\n lte: DateTime = null\n neq: DateTime = null\n}\n\ntype Instrument {\n description: String\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n key: String!\n name: String!\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n scienceGroup: String\n \"\"\"\n Get paginated staff accounts for this instrument. Trusted users see all accounts; fedid users see only accounts linked to sessions or instruments they are associated with.\n \"\"\"\n staff(after: String = null, before: String = null, filterBy: AccountFilterInput = null, first: Int = null, last: Int = null, sortBy: [AccountSortInput!] = null): StaffConnection!\n}\n\ntype InstrumentSession @key(fields: \"instrumentSessionNumber proposal {proposalNumber}\") @key(fields: \"instrumentSessionReference\") {\n endTime: DateTime\n instrument: Instrument!\n instrumentSessionId: Int! @deprecated(reason: \"instrument_session_id is deprecated and will be removed in a future version.\")\n instrumentSessionNumber: Int!\n instrumentSessionReference: String\n proposal: Proposal!\n riskRating: String\n roles: [InstrumentSessionRole!]!\n startTime: DateTime\n state: String\n type: String\n}\n\ntype InstrumentSessionConnection {\n edges: [InstrumentSessionEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype InstrumentSessionEdge {\n cursor: String! @shareable\n node: InstrumentSession! @shareable\n}\n\ninput InstrumentSessionFilterInput {\n endTime: DateTimeFilterInput = null\n instrumentSessionNumber: IntFilterInput = null\n proposalNumber: IntFilterInput = null\n riskRating: StringFilterInput = null\n startTime: DateTimeFilterInput = null\n state: InstrumentSessionStateFilterInput = null\n type: StringFilterInput = null\n}\n\ntype InstrumentSessionMutations @key(fields: \"instrumentSessionNumber proposalNumber\") {\n instrumentSessionNumber: Int!\n proposalNumber: Int!\n}\n\ntype InstrumentSessionRole {\n account: Account!\n instrumentSession: InstrumentSession!\n onSite: Boolean!\n role: String!\n}\n\nenum InstrumentSessionSortField {\n endTime\n instrumentSessionNumber\n proposalNumber\n riskRating\n startTime\n state\n type\n}\n\ninput InstrumentSessionSortInput {\n field: InstrumentSessionSortField!\n orderBy: SortOrder!\n}\n\nenum InstrumentSessionState {\n CANCELLED\n COMPLETED\n FUTURE\n IN_PROGRESS\n}\n\ninput InstrumentSessionStateFilterInput {\n eq: InstrumentSessionState = null\n neq: InstrumentSessionState = null\n}\n\ninput IntFilterInput {\n eq: Int = null\n gt: Int = null\n gte: Int = null\n lt: Int = null\n lte: Int = null\n neq: Int = null\n}\n\n\"\"\"\nThe `JSON` scalar type represents JSON values as specified by [ECMA-404](https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf).\n\"\"\"\nscalar JSON @specifiedBy(url: \"https://ecma-international.org/wp-content/uploads/ECMA-404_2nd_edition_december_2017.pdf\")\n\ntype Mutation {\n createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSessionMutations\n}\n\ntype PageInfo {\n endCursor: String @shareable\n hasNextPage: Boolean! @shareable\n hasPreviousPage: Boolean! @shareable\n startCursor: String @shareable\n}\n\ntype Proposal @key(fields: \"proposalNumber\") @key(fields: \"proposalReference\") {\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n instruments: [Instrument!]!\n proposalCategory: String\n proposalNumber: Int!\n proposalReference: String\n roles: [ProposalAccount!]!\n state: ProposalState!\n summary: String\n title: String\n}\n\ntype ProposalAccount {\n account: Account!\n proposal: Proposal!\n role: String!\n}\n\ntype ProposalConnection {\n edges: [ProposalEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype ProposalEdge {\n cursor: String! @shareable\n node: Proposal! @shareable\n}\n\ninput ProposalFilterInput {\n proposalCategory: StringFilterInput = null\n proposalNumber: IntFilterInput = null\n state: ProposalStateFilterInput = null\n title: StringFilterInput = null\n}\n\nenum ProposalSortField {\n proposalNumber\n}\n\ninput ProposalSortInput {\n field: ProposalSortField!\n orderBy: SortOrder!\n}\n\nenum ProposalState {\n CANCELLED\n CLOSED\n OPEN\n}\n\ninput ProposalStateFilterInput {\n eq: ProposalState = null\n neq: ProposalState = null\n}\n\ntype Query {\n \"\"\"Get an account\"\"\"\n account(username: String!): Account\n \"\"\"Get an instrument by key\"\"\"\n instrumentByKey(key: String!): Instrument\n \"\"\"Get an instrument by name\"\"\"\n instrumentByName(name: String!): Instrument\n \"\"\"Get a instrument session\"\"\"\n instrumentSession(instrumentSessionNumber: Int!, proposalNumber: Int!): InstrumentSession\n \"\"\"\n Get an instrument session by its reference string e.g. 'MX12345-1'. The lookup is case-insensitive.\n \"\"\"\n instrumentSessionByReference(reference: String!): InstrumentSession\n \"\"\"Get a list of instrument sessions\"\"\"\n instrumentSessions(after: String = null, before: String = null, filterBy: InstrumentSessionFilterInput = null, first: Int = null, last: Int = null, proposalCategory: String = null, proposalNumber: Int = null, sortBy: [InstrumentSessionSortInput!] = null): InstrumentSessionConnection!\n \"\"\"Get a list of instruments\"\"\"\n instruments(scienceGroup: String = null): [Instrument!]!\n \"\"\"Get a proposal by its number\"\"\"\n proposal(proposalNumber: Int!): Proposal\n \"\"\"\n Get a proposal by its reference string e.g. 'MX12345'. The lookup is case-insensitive.\n \"\"\"\n proposalByReference(reference: String!): Proposal\n \"\"\"Get a list of proposals\"\"\"\n proposals(after: String = null, before: String = null, filterBy: ProposalFilterInput = null, first: Int = null, last: Int = null, sortBy: [ProposalSortInput!] = null): ProposalConnection!\n}\n\nenum SortOrder {\n ASC\n DESC\n}\n\ntype Staff {\n emailAddress: String\n familyName: String\n givenName: String\n state: AccountState!\n title: String\n type: AccountType!\n username: String!\n}\n\ntype StaffConnection {\n edges: [StaffEdge!]! @shareable\n pageInfo: PageInfo! @shareable\n}\n\ntype StaffEdge {\n cursor: String! @shareable\n node: Staff! @shareable\n}\n\ninput StringFilterInput {\n contains: String = null\n endsWith: String = null\n eq: String = null\n neq: String = null\n notContains: String = null\n startsWith: String = null\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}\n\nscalar openfed__FieldSet",
"ab9040c814f11559b1e7d93f67b38b284f1bf0d3": "schema {\n query: Query\n}\n\n\"\"\"A JSON schema\"\"\"\ntype JSONSchema {\n \"\"\"The description og the schema\"\"\"\n description: String\n \"\"\"The identifier of the schema\"\"\"\n id: String!\n \"\"\"The instrument the schema was created for\"\"\"\n instrument: String\n \"\"\"The title of the schema\"\"\"\n title: String\n \"\"\"The type of object the shema describes (if known)\"\"\"\n type: String\n \"\"\"A URL from which the schema can be accessed\"\"\"\n url: String!\n \"\"\"The version of the schema\"\"\"\n version: String\n}\n\ntype Query {\n jsonSchema(url: String!): JSONSchema\n jsonSchemas(instrument: String = null, type: String = null): [JSONSchema!]!\n}",
"af5a88b7893039d342e7bb3e67d277be36ce0e96": "schema {\n query: Query\n mutation: Mutation\n subscription: Subscription\n}\n\ndirective @link(as: String, for: link__Purpose, import: [link__Import], url: String!) repeatable on SCHEMA\n\ndirective @shareable repeatable on FIELD_DEFINITION | OBJECT\n\ntype Artifact {\n \"\"\"The MIME type of the artifact data\"\"\"\n mimeType: String!\n \"\"\"The file name of the artifact\"\"\"\n name: String!\n \"\"\"The download URL for the artifact\"\"\"\n url: Url!\n}\n\nscalar Creator\n\n\"\"\"\nImplement the DateTime<Utc> scalar\n\nThe input/output is a string in RFC3339 format.\n\"\"\"\nscalar DateTime\n\n\"\"\"A scalar that can represent any JSON value.\"\"\"\nscalar JSON\n\n\"\"\"A scalar that can represent any JSON Object value.\"\"\"\nscalar JSONObject\n\n\"\"\"Represents a label selector for filtering workflows based on labels\"\"\"\ninput LabelSelector {\n \"\"\"The label key to filter on\"\"\"\n key: String!\n \"\"\"The operator to use for the label selection\"\"\"\n operator: WorkflowLabelSelectorOperator!\n \"\"\"The values to match against the label key (if applicable)\"\"\"\n values: [String!]\n}\n\n\"\"\"A single log line streamed from a pod\"\"\"\ntype LogEntry {\n \"\"\"The log line content\"\"\"\n content: String!\n \"\"\"The name of the pod producing the log\"\"\"\n podName: String!\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Mutation {\n \"\"\"Create a Trigger from a template\"\"\"\n createTrigger(name: String, templateRef: String!, visit: VisitInput): Trigger\n \"\"\"\n Submit a manifest (YAML) as a one-off Workflow within a visit's namespace.\n \n The input is typically a `WorkflowTemplate` (the manifest developers author and\n store in their repository). It is submitted via the Argo Server API so the graph\n remains the single source of truth for submissions. To match the behaviour of the\n workflows CLI, the manifest is coerced into a one-off Workflow: `kind` is set to\n `Workflow`, and a fixed `metadata.name` is rewritten to a `metadata.generateName`\n (suffixed with `-`) so repeated submissions yield fresh, uniquely named Workflows.\n \"\"\"\n submitWorkflow(manifest: String!, visit: VisitInput!): Workflow!\n \"\"\"submit specific workflow template\"\"\"\n submitWorkflowTemplate(name: String!, parameters: JSON!, visit: VisitInput!): Workflow!\n}\n\n\"\"\"Represents Relay Node types\"\"\"\nunion NodeValue = Workflow\n\n\"\"\"Information about pagination in a connection\"\"\"\ntype PageInfo {\n \"\"\"When paginating forwards, the cursor to continue.\"\"\"\n endCursor: String @shareable\n \"\"\"When paginating forwards, are there more items?\"\"\"\n hasNextPage: Boolean! @shareable\n \"\"\"When paginating backwards, are there more items?\"\"\"\n hasPreviousPage: Boolean! @shareable\n \"\"\"When paginating backwards, the cursor to continue.\"\"\"\n startCursor: String @shareable\n}\n\n\"\"\"The root query of the service\"\"\"\ntype Query {\n node(id: ID!): NodeValue\n \"\"\"Get a specific Trigger by name and visit\"\"\"\n trigger(name: String!, visit: String): Trigger\n \"\"\"Get multiple Triggers across namespaces\"\"\"\n triggers(cursor: String, limit: Int): TriggerConnection!\n \"\"\"\n Get a single [`Workflow`] by proposal, visit, and name.\n \n In case of two workflows with the same name, returns the most recent.\n \"\"\"\n workflow(name: String!, visit: VisitInput!): Workflow @deprecated(reason: \"Use workflowById instead\")\n \"\"\"Get a single [`Workflow`] by unique ID.\"\"\"\n workflowById(id: ID!): Workflow\n \"\"\"Retrieves a single cluster workflow template by name\"\"\"\n workflowTemplate(name: String!): WorkflowTemplate!\n \"\"\"\n Retrieves all cluster workflow templates with respective pagination data\n \"\"\"\n workflowTemplates(cursor: String, filter: WorkflowTemplatesFilter, limit: Int): WorkflowTemplateConnection!\n \"\"\"Find all workflows available for a given visit\"\"\"\n workflows(cursor: String, filter: WorkflowFilter, limit: Int, visit: VisitInput!): WorkflowConnection!\n}\n\n\"\"\"Supported DLS science groups\"\"\"\nenum ScienceGroup {\n \"\"\"Biological Cryo-Imaging\"\"\"\n BIO_CRYO_IMAGING\n \"\"\"Soft Condensed Matter\"\"\"\n CONDENSED_MATTER\n \"\"\"Crystallography\"\"\"\n CRYSTALLOGRAPHY\n \"\"\"Workflows Examples\"\"\"\n EXAMPLES\n \"\"\"Imaging and Microscopy\"\"\"\n IMAGING\n \"\"\"Magnetic Materials\"\"\"\n MAGNETIC_MATERIALS\n \"\"\"Macromolecular Crystallography\"\"\"\n MX\n \"\"\"Spectroscopy\"\"\"\n SPECTROSCOPY\n \"\"\"Structures and Surfaces\"\"\"\n SURFACES\n}\n\n\"\"\"The root mutation of the service\"\"\"\ntype Subscription {\n \"\"\"Processing to subscribe to logs for a single pod of a workflow\"\"\"\n logs(taskId: String!, visit: VisitInput!, workflowName: String!): LogEntry!\n \"\"\"Processing to subscribe to data for all workflows in a session\"\"\"\n workflow(name: String!, visit: VisitInput!): Workflow!\n}\n\ntype Task {\n \"\"\"Artifacts produced by a task\"\"\"\n artifacts: [Artifact!]!\n \"\"\"Children of a task\"\"\"\n dependencies: [String!]!\n \"\"\"Parent of a task\"\"\"\n depends: [String!]!\n \"\"\"End time for a task on a workflow\"\"\"\n endTime: DateTime\n \"\"\"Unique name of the task\"\"\"\n id: String!\n \"\"\"\n A human readable message indicating details about why this step is in this condition\n \"\"\"\n message: String\n \"\"\"Display name of the task\"\"\"\n name: String!\n \"\"\"Start time for a task on a workflow\"\"\"\n startTime: DateTime\n \"\"\"Current status of a task\"\"\"\n status: TaskStatus!\n \"\"\"Node type - Pod, DAG, etc\"\"\"\n stepType: String!\n}\n\nenum TaskStatus {\n ERROR\n FAILED\n OMITTED\n PENDING\n RUNNING\n SKIPPED\n SUCCEEDED\n}\n\nscalar Template\n\n\"\"\"Information about where the template is stored\"\"\"\ntype TemplateSource {\n \"\"\"The path to the template within the repository\"\"\"\n path: String!\n \"\"\"The URL of the GitHub repository\"\"\"\n repositoryUrl: String!\n \"\"\"The current tracked branch of the repository\"\"\"\n targetRevision: String!\n}\n\n\"\"\"A Trigger for creating automated workflows\"\"\"\ntype Trigger {\n \"\"\"The beamline that the Trigger monitors\"\"\"\n beamline: String\n \"\"\"The name of the Trigger\"\"\"\n name: String\n \"\"\"The name of a ClusterTriggerTemplate that the Trigger is created from\"\"\"\n templateRef: String\n}\n\ntype TriggerConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [TriggerEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [Trigger!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype TriggerEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: Trigger! @shareable\n}\n\n\"\"\"\nURL is a String implementing the [URL Standard](http://url.spec.whatwg.org/)\n\"\"\"\nscalar Url\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ntype Visit {\n \"\"\"Session visit Number\"\"\"\n number: Int!\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n}\n\n\"\"\"A visit to an instrument as part of a session\"\"\"\ninput VisitInput {\n \"\"\"Session visit Number\"\"\"\n number: Int!\n \"\"\"Project Proposal Code\"\"\"\n proposalCode: String!\n \"\"\"Project Proposal Number\"\"\"\n proposalNumber: Int!\n}\n\ntype Workflow {\n \"\"\"The workflow creator\"\"\"\n creator: WorkflowCreator!\n \"\"\"The unique ID derived from the visit, name and uid\"\"\"\n id: ID!\n \"\"\"The name given to the workflow, unique within a given visit\"\"\"\n name: String!\n \"\"\"The top-level workflow parameters\"\"\"\n parameters: JSONObject\n \"\"\"The current status of the workflow\"\"\"\n status: WorkflowStatus\n \"\"\"The name of the template used to run the workflow\"\"\"\n templateRef: String\n \"\"\"The visit the Workflow was run against\"\"\"\n visit: Visit!\n}\n\ntype WorkflowConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [Workflow!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"Information about the creator of a workflow.\"\"\"\ntype WorkflowCreator {\n \"\"\"\n An identifier unique to the creator of the workflow.\n Typically this is the creator's Fed-ID.\n \"\"\"\n creatorId: String!\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: Workflow! @shareable\n}\n\n\"\"\"All tasks in the workflow have errored\"\"\"\ntype WorkflowErroredStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All tasks in the workflow have failed\"\"\"\ntype WorkflowFailedStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"All the supported Workflows filters\"\"\"\ninput WorkflowFilter {\n \"\"\"The fedid of the user who created the workflow\"\"\"\n creator: Creator\n \"\"\"Additional label selectors for filtering workflows\"\"\"\n labelSelectors: [LabelSelector!]\n \"\"\"The workflow template\"\"\"\n template: Template\n \"\"\"\n The status of the workflow (e.g., pending, running, succeeded, failed, error)\n \"\"\"\n workflowStatusFilter: WorkflowStatusFilter\n}\n\n\"\"\"Supported operators for label selection in workflows\"\"\"\nenum WorkflowLabelSelectorOperator {\n \"\"\"Match resources that do not have a specific label key.\"\"\"\n DOES_NOT_EXIST\n \"\"\"Match resources with an exact label value.\"\"\"\n EQ\n \"\"\"\n Match resources that have a specific label key, regardless of its value.\n \"\"\"\n EXISTS\n \"\"\"Match resources with a label value in a set of values.\"\"\"\n IN\n \"\"\"\n Match resources with a label value that is not equal to a specified value.\n \"\"\"\n NE\n \"\"\"Match resources with a label value not in a set of values.\"\"\"\n NOT_IN\n}\n\ntype WorkflowPendingStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n}\n\ntype WorkflowRunningStatus {\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\n\"\"\"The status of a workflow\"\"\"\nunion WorkflowStatus = WorkflowErroredStatus | WorkflowFailedStatus | WorkflowPendingStatus | WorkflowRunningStatus | WorkflowSucceededStatus\n\n\"\"\"Represents workflow status filters\"\"\"\ninput WorkflowStatusFilter {\n error: Boolean! = false\n failed: Boolean! = false\n pending: Boolean! = false\n running: Boolean! = false\n succeeded: Boolean! = false\n}\n\n\"\"\"All tasks in the workflow have succeded\"\"\"\ntype WorkflowSucceededStatus {\n \"\"\"Time at which this workflow completed\"\"\"\n endTime: DateTime!\n \"\"\"\n A human readable message indicating details about why the workflow is in this condition\n \"\"\"\n message: String\n \"\"\"Time at which this workflow started\"\"\"\n startTime: DateTime!\n \"\"\"Tasks created by the workflow\"\"\"\n tasks: [Task!]!\n}\n\ntype WorkflowTemplate {\n \"\"\"A JSON Schema describing the arguments of a Workflow Template\"\"\"\n arguments: JSON!\n \"\"\"A human readable description of the workflow which is created\"\"\"\n description: String\n \"\"\"The group who maintains the workflow template\"\"\"\n maintainer: String!\n \"\"\"The name given to the workflow template, globally unique\"\"\"\n name: String!\n \"\"\"The repository storing the code associated with this template.\"\"\"\n repository: String\n \"\"\"Information about where the template is obtained from\"\"\"\n templateSource: TemplateSource\n \"\"\"A human readable title for the workflow template\"\"\"\n title: String\n \"\"\"\n A JSON Forms UI Schema describing how to render the arguments of the Workflow Template\n \"\"\"\n uiSchema: JSON\n}\n\ntype WorkflowTemplateConnection {\n \"\"\"A list of edges.\"\"\"\n edges: [WorkflowTemplateEdge!]! @shareable\n \"\"\"A list of nodes.\"\"\"\n nodes: [WorkflowTemplate!]! @shareable\n \"\"\"Information to aid in pagination.\"\"\"\n pageInfo: PageInfo! @shareable\n}\n\n\"\"\"An edge in a connection.\"\"\"\ntype WorkflowTemplateEdge {\n \"\"\"A cursor for use in pagination\"\"\"\n cursor: String! @shareable\n \"\"\"The item at the end of the edge\"\"\"\n node: WorkflowTemplate! @shareable\n}\n\n\"\"\"Supported label filters for ClusterWorkflowTemplates\"\"\"\ninput WorkflowTemplatesFilter {\n \"\"\"The science group owning the template eg imaging\"\"\"\n scienceGroup: [ScienceGroup!]\n}\n\nscalar link__Import\n\nenum link__Purpose {\n EXECUTION\n SECURITY\n}", |
diff --git a/tmp/old_supergraph.graphql b/tmp/new_supergraph.graphql
index 83bacb2..ae96cbe 100644
--- a/tmp/old_supergraph.graphql
+++ b/tmp/new_supergraph.graphql
@@ -68,6 +68,10 @@ type Mutation {
createTrigger(templateRef: String!, name: String, visit: VisitInput): Trigger
createExperimentDefinition(input: CreateExperimentDefinitionInput!): CreateExperimentDefinitionResponse
experimentDefinition(id: UUID!): ExperimentDefinitionMutations
+ deleteExperiment(id: UUID!): DeleteExperimentResponse
+ restoreExperiment(id: UUID!): DeleteExperimentResponse
+ deleteExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
+ restoreExperimentDefinition(id: UUID!): DeletedExperimentDefinitionResponse
createInstrumentSession(input: CreateInstrumentSessionInput!): InstrumentSession!
instrumentSession(proposalNumber: Int!, instrumentSessionNumber: Int!): InstrumentSessionMutations
createOrValidateSamples(input: CreateOrValidateSampleInput!): CreateSamplesResponse!
@@ -139,7 +143,7 @@ type Query {
jsonSchema(url: String!): JSONSchema
jsonSchemas(type: String = null, instrument: String = null): [JSONSchema!]!
experimentDefinition(id: UUID!): ExperimentDefinition
- experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
+ experimentDefinitions(instrumentSessions: [InstrumentSessionInput!]!, filter: ExperimentDefinitionFilterInput = null, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentDefinitionConnection
experiment(id: UUID!): Experiment
experiments(instrumentSessions: [InstrumentSessionInput!]!, first: Int = null, last: Int = null, after: String = null, before: String = null): ExperimentConnection
@@ -647,12 +651,59 @@ type CreateExperimentsResponse {
errors: [String!]!
}
+input DatetimeFilterInputV2 {
+ """
+ Will filter to items where the `DateTime` field is greater than (i.e. after) the provided value
+ """
+ greaterThan: DateTime = null
+
+ """
+ Will filter to items where the `DateTime` field is less than (i.e. before) the provided value
+ """
+ lessThan: DateTime = null
+}
+
+"""The details of an deleted record validation error"""
+type DeleteErrorDetails {
+ """The type of error that occurred"""
+ type: String!
+
+ """
+ Tuple of strings identifying where in the record schema the error occurred.
+ """
+ location: [String!]!
+
+ """A human readable error message."""
+ message: String!
+}
+
+"""Return type when marking an record as deleted"""
+type DeleteExperimentResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
+"""Return type when marking an record as deleted"""
+type DeletedExperimentDefinitionResponse {
+ """Whether the operation has succeeded without validation errors"""
+ success: Boolean!
+
+ """Errors that occurred during validation"""
+ errors: [DeleteErrorDetails!]!
+}
+
type Experiment {
id: UUID!
name: String!
createdTime: DateTime!
updatedTime: DateTime!
+ deleted: Boolean!
experimentDefinition: ExperimentDefinition!
+ createdBy: String!
+ modifiedBy: String!
"""The sample that this experiment is associated with"""
sample: Sample!
@@ -672,6 +723,9 @@ type ExperimentDefinition {
dataSchemaUrl: String!
proposalNumber: Int!
instrumentSessionNumber: Int!
+ deleted: Boolean!
+ createdBy: String!
+ modifiedBy: String!
"""
The instrument session that this experiment definition is associated with
@@ -706,6 +760,24 @@ type ExperimentDefinitionErrorDetails {
message: String!
}
+"""Values required to filter a list of experiment definitions"""
+input ExperimentDefinitionFilterInput {
+ """Filter by the name of experiment definitions"""
+ name: StringFilterInputV2 = null
+
+ """Filter by the created datetime of experiment definitions"""
+ createdTime: DatetimeFilterInputV2 = null
+
+ """Filter by the update datetime of experiment definitions"""
+ updatedTime: DatetimeFilterInputV2 = null
+
+ """Filter by the data schema URL of experiment definitions"""
+ dataSchemaUrl: StringFilterInputV2 = null
+
+ """Filter within the JSON data of experiment definitions"""
+ data: [JSONFilterInputV2!] = null
+}
+
"""Mutations for a given experiment defintion"""
type ExperimentDefinitionMutations {
updateExperimentDefinition(input: UpdateExperimentDefinitionInput!): UpdateExperimentDefinitionResponse!
@@ -752,6 +824,32 @@ input InstrumentSessionInput {
instrumentSessionNumber: Int!
}
+input JSONFilterConditionInput @oneOf {
+ stringFilter: StringFilterInputV2 = null
+ datetimeFilter: DatetimeFilterInputV2 = null
+ numericFilter: NumericFilterInputV2 = null
+}
+
+input JSONFilterInputV2 {
+ """The JSON path to the field to filter. Must start with '$.'"""
+ path: String!
+
+ """The filter operation to apply to the field"""
+ condition: JSONFilterConditionInput!
+}
+
+input NumericFilterInputV2 {
+ """
+ Will filter to items where the numeric field is greater than the provided value
+ """
+ greaterThan: Float = null
+
+ """
+ Will filter to items where the numeric field is less than the provided value
+ """
+ lessThan: Float = null
+}
+
type Proposal {
proposalNumber: Int!
proposalCategory: String
@@ -797,6 +895,33 @@ type Sample {
positionInContainer: ContainerPosition
}
+input StringFilterInputV2 {
+ """
+ Will filter to items where the `String` field is a member of the provided value
+ """
+ in: [String!] = null
+
+ """
+ Will filter to items where the `String` field is equal to the provided value
+ """
+ equalTo: String = null
+
+ """
+ Will filter to items where the `String` field is not equal to the provided value
+ """
+ notEqualTo: String = null
+
+ """
+ Will filter to items where the `String` field is not a member of the provided value
+ """
+ notIn: [String!] = null
+
+ """
+ Will filter to items where the `String` field is contains the provided value
+ """
+ contains: String = null
+}
+
scalar UUID
"""Values that can be updated on experiment definition""" |
VictoriaBeilsten-Edmands
approved these changes
Aug 14, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Repository
Subgraph maintainers
@DiamondLightSource/ulims