# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

# The overview topology of the whole application cluster or services,
type Topology {
    nodes: [Node!]!
    calls: [Call!]!
}

# The instance topology based on the given serviceIds
type ServiceInstanceTopology {
    nodes: [ServiceInstanceNode!]!
    calls: [Call!]!
}

# The endpoint topology
type EndpointTopology {
    nodes: [EndpointNode!]!
    calls: [Call!]!
}

# Node in Topology
type Node {
    # The global id of each node,
    # 1. Service id
    # 2. Endpoint id
    id: ID!
    # The literal name of the #id.
    name: String!
    # The type name may be
    # 1. The service provider/middleware tech, such as: Tomcat, SpringMVC
    # 2. Conjectural Service, e.g. MySQL, Redis, Kafka
    type: String
    # It is a conjuecture node or real node, to represent a service or endpoint.
    isReal: Boolean!
}

# Node in ServiceInstanceTopology
type ServiceInstanceNode {
    # The instance id of each node,
    id: ID!
    # The literal name of the #id. Instance Name.
    name: String!
    # Service id
    serviceId: ID!
    # The literal name of the #serviceId.
    serviceName: String!
    # The type name may be
    # 1. The service provider/middleware tech, such as: Tomcat, SpringMVC
    # 2. Conjectural Service, e.g. MySQL, Redis, Kafka
    type: String
    # It is a conjuecture node or real node, to represent an instance.
    isReal: Boolean!
}

# Node in EndpointTopology
type EndpointNode {
    # The instance id of each node,
    id: ID!
    # The literal name of the #id. Endpoint Name
    name: String!
    # Service id
    serviceId: ID!
    # The literal name of the #serviceId.
    serviceName: String!
    # The type name may be
    # 1. The service provider/middleware tech, such as: Tomcat, SpringMVC
    # 2. Conjectural Service, e.g. MySQL, Redis, Kafka
    type: String
    # It is a conjuecture node or real node, to represent an instance.
    isReal: Boolean!
}

# The Call represents a directed distributed call,
# from the `source` to the `target`.
type Call {
    source: ID!
    # The protocol and tech stack used at source side in this distributed call
    sourceComponents: [ID!]!
    target: ID!
    # The protocol and tech stack used at target side in this distributed call
    targetComponents: [ID!]!
    id: ID!
    # The detect Points of this distributed call.
    detectPoints: [DetectPoint!]!
}

enum NodeType {
    SERVICE,
    ENDPOINT,
    USER
}


extend type Query {
    # Query the global topology
    getGlobalTopology(duration: Duration!): Topology
    # Query the topology, based on the given service
    getServiceTopology(serviceId: ID!, duration: Duration!): Topology
    # Query the topology, based on the given services.
    # `#getServiceTopology` could be replaced by this.
    getServicesTopology(serviceIds: [ID!]!, duration: Duration!): Topology
    # Query the instance topology, based on the given clientServiceId and serverServiceId
    getServiceInstanceTopology(clientServiceId: ID!, serverServiceId: ID!, duration: Duration!): ServiceInstanceTopology
    # Query the topology, based on the given endpoint
    getEndpointTopology(endpointId: ID!, duration: Duration!): Topology
    # v2 of getEndpointTopology
    getEndpointDependencies(endpointId: ID!, duration: Duration!): EndpointTopology
}
