# 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!]!
}

# 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.
    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 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
}
