{
  "isError" : false,
  "request" : { },
  "response" : {
    "byService" : {
      "CachedService" : 1,
      "ClockService" : 1,
      "CorsService" : 1,
      "LookupService" : 2,
      "OrderService" : 4,
      "PublicService" : 1,
      "ReportService" : 6
    },
    "meta" : {
      "serverMs" : "<timing>"
    },
    "programState" : "clean",
    "routeCount" : 16,
    "routes" : [ {
      "anySanitized" : false,
      "auditCompliant" : true,
      "auth" : {
        "explicitlyOpen" : false,
        "guarded" : true,
        "source" : "service"
      },
      "baseUri" : "/api/cached",
      "caching" : {
        "directive" : "public,max-age=600,s-maxage=30",
        "directives" : [ "public" ],
        "maxAgeSeconds" : 600,
        "sMaxAgeSeconds" : 30,
        "source" : "override"
      },
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "none"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/cached/fresh/{tag}",
      "line" : 119,
      "method" : "fresh",
      "module" : "demo.routes",
      "parameters" : [ {
        "binding" : "PATH",
        "line" : 120,
        "name" : "tag",
        "sanitized" : false,
        "source" : "tag",
        "type" : "org.ek9.lang::String"
      } ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyGate",
        "line" : 17,
        "name" : "MyGate"
      },
      "service" : "CachedService",
      "serviceFQN" : "demo.routes::CachedService",
      "uri" : "/fresh/{tag}",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/clock",
      "caching" : {
        "directive" : "public,max-age=3600,must-revalidate",
        "directives" : [ "public", "must-revalidate" ],
        "maxAgeSeconds" : 3600,
        "source" : "default"
      },
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 1,
        "status" : "opaque"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/clock/time",
      "line" : 183,
      "method" : "time",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "ClockService",
      "serviceFQN" : "demo.routes::ClockService",
      "uri" : "/time",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : true,
      "auth" : {
        "explicitlyOpen" : false,
        "guarded" : true,
        "source" : "service"
      },
      "baseUri" : "/api/cors",
      "cors" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyCors",
        "line" : 21,
        "name" : "MyCors"
      },
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/cors",
      "line" : 114,
      "method" : "ping",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyGate",
        "line" : 17,
        "name" : "MyGate"
      },
      "service" : "CorsService",
      "serviceFQN" : "demo.routes::CorsService",
      "uri" : "/",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/lookup",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/lookup/all",
      "line" : 172,
      "method" : "lookup",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "LookupService",
      "serviceFQN" : "demo.routes::LookupService",
      "uri" : "/all",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/lookup",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/lookup/one/{id}",
      "line" : 175,
      "method" : "lookup",
      "module" : "demo.routes",
      "parameters" : [ {
        "binding" : "PATH",
        "line" : 176,
        "name" : "id",
        "sanitized" : false,
        "source" : "id",
        "type" : "org.ek9.lang::String"
      } ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "LookupService",
      "serviceFQN" : "demo.routes::LookupService",
      "uri" : "/one/{id}",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Mark parameter 'content' as `sanitized` (or validate it) before use",
        "kind" : "unsanitized-content",
        "param" : "content"
      } ],
      "auth" : {
        "explicitlyOpen" : false,
        "guarded" : true,
        "source" : "service"
      },
      "baseUri" : "/api/orders",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/orders",
      "line" : 96,
      "method" : "create",
      "module" : "demo.routes",
      "parameters" : [ {
        "binding" : "CONTENT",
        "line" : 97,
        "name" : "content",
        "sanitized" : false,
        "type" : "org.ek9.lang::String"
      } ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyGate",
        "line" : 17,
        "name" : "MyGate"
      },
      "service" : "OrderService",
      "serviceFQN" : "demo.routes::OrderService",
      "uri" : "/",
      "verb" : "POST"
    }, {
      "anySanitized" : true,
      "auditCompliant" : true,
      "auth" : {
        "explicitlyOpen" : false,
        "guarded" : true,
        "source" : "service"
      },
      "baseUri" : "/api/orders",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/orders/find",
      "line" : 100,
      "method" : "search",
      "module" : "demo.routes",
      "parameters" : [ {
        "binding" : "QUERY",
        "line" : 101,
        "name" : "term",
        "sanitized" : true,
        "source" : "q",
        "type" : "org.ek9.lang::String"
      } ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyGate",
        "line" : 17,
        "name" : "MyGate"
      },
      "service" : "OrderService",
      "serviceFQN" : "demo.routes::OrderService",
      "uri" : "/find",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/orders",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/orders/status",
      "line" : 104,
      "method" : "status",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "OrderService",
      "serviceFQN" : "demo.routes::OrderService",
      "uri" : "/status",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : true,
      "auth" : {
        "explicitlyOpen" : false,
        "guarded" : true,
        "source" : "service"
      },
      "baseUri" : "/api/orders",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/orders/{id}",
      "line" : 92,
      "method" : "byId",
      "module" : "demo.routes",
      "parameters" : [ {
        "binding" : "PATH",
        "line" : 93,
        "name" : "id",
        "sanitized" : false,
        "source" : "id",
        "type" : "org.ek9.lang::String"
      } ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyGate",
        "line" : 17,
        "name" : "MyGate"
      },
      "service" : "OrderService",
      "serviceFQN" : "demo.routes::OrderService",
      "uri" : "/{id}",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/public",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/public/status",
      "line" : 109,
      "method" : "health",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "PublicService",
      "serviceFQN" : "demo.routes::PublicService",
      "uri" : "/status",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : true,
      "auth" : {
        "explicitlyOpen" : false,
        "guarded" : true,
        "source" : "route"
      },
      "baseUri" : "/api/reports",
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "unknown"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/reports/admin",
      "line" : 147,
      "method" : "admin",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : {
        "file" : "routes.ek9",
        "fullyQualifiedName" : "demo.routes::MyGate",
        "line" : 17,
        "name" : "MyGate"
      },
      "service" : "ReportService",
      "serviceFQN" : "demo.routes::ReportService",
      "uri" : "/admin",
      "verb" : "DELETE"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/reports",
      "caching" : {
        "source" : "dynamic"
      },
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "none"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/reports/detail/{ref}",
      "line" : 138,
      "method" : "detail",
      "module" : "demo.routes",
      "parameters" : [ {
        "binding" : "PATH",
        "line" : 139,
        "name" : "ref",
        "sanitized" : false,
        "source" : "ref",
        "type" : "org.ek9.lang::String"
      } ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "ReportService",
      "serviceFQN" : "demo.routes::ReportService",
      "uri" : "/detail/{ref}",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/reports",
      "caching" : {
        "directive" : "public,max-age=3600,must-revalidate",
        "directives" : [ "public", "must-revalidate" ],
        "maxAgeSeconds" : 3600,
        "source" : "default"
      },
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "none"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/reports/summary",
      "line" : 132,
      "method" : "summary",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "ReportService",
      "serviceFQN" : "demo.routes::ReportService",
      "uri" : "/summary",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/reports",
      "caching" : {
        "directive" : "public,max-age=3600,must-revalidate",
        "directives" : [ "public", "must-revalidate" ],
        "maxAgeSeconds" : 3600,
        "source" : "default"
      },
      "cors" : null,
      "domainFootprint" : {
        "elements" : [ {
          "depth" : 1,
          "file" : "routes.ek9",
          "fullyQualifiedName" : "demo.routes::Thing",
          "genus" : "CLASS",
          "kind" : "resolved",
          "line" : 50,
          "type" : "Thing",
          "via" : "ThingRepo"
        }, {
          "depth" : 2,
          "file" : "routes.ek9",
          "fullyQualifiedName" : "demo.routes::Deep",
          "genus" : "RECORD",
          "kind" : "recursed",
          "line" : 38,
          "type" : "Deep",
          "via" : "ThingRepo"
        } ],
        "injectedComponentCount" : 1,
        "status" : "derived"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/reports/things",
      "line" : 163,
      "method" : "things",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "ReportService",
      "serviceFQN" : "demo.routes::ReportService",
      "uri" : "/things",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/reports",
      "caching" : {
        "directive" : "public,max-age=3600,must-revalidate",
        "directives" : [ "public", "must-revalidate" ],
        "maxAgeSeconds" : 3600,
        "source" : "default"
      },
      "cors" : null,
      "domainFootprint" : {
        "elements" : [ {
          "depth" : 1,
          "file" : "routes.ek9",
          "fullyQualifiedName" : "demo.routes::Ticket",
          "genus" : "RECORD",
          "kind" : "resolved",
          "line" : 34,
          "type" : "Ticket",
          "via" : "Repo"
        } ],
        "injectedComponentCount" : 1,
        "status" : "derived"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/reports/tickets",
      "line" : 156,
      "method" : "tickets",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "ReportService",
      "serviceFQN" : "demo.routes::ReportService",
      "uri" : "/tickets",
      "verb" : "GET"
    }, {
      "anySanitized" : false,
      "auditCompliant" : false,
      "auditWarnings" : [ {
        "fix" : "Attach a security gate with `constrain by <Gate>` on the route or service",
        "kind" : "unguarded-route"
      } ],
      "auth" : {
        "explicitlyOpen" : true,
        "guarded" : false
      },
      "baseUri" : "/api/reports",
      "caching" : {
        "directive" : "private,max-age=42",
        "directives" : [ "private" ],
        "maxAgeSeconds" : 42,
        "source" : "override"
      },
      "cors" : null,
      "domainFootprint" : {
        "injectedComponentCount" : 0,
        "status" : "none"
      },
      "file" : "routes.ek9",
      "fullPath" : "/api/reports/traited",
      "line" : 150,
      "method" : "traited",
      "module" : "demo.routes",
      "parameters" : [ ],
      "returns" : {
        "type" : "HTTPResponse",
        "typeFqn" : "org.ek9.lang::HTTPResponse"
      },
      "securityGate" : null,
      "service" : "ReportService",
      "serviceFQN" : "demo.routes::ReportService",
      "uri" : "/traited",
      "verb" : "GET"
    } ],
    "status" : "ok",
    "summary" : {
      "corsConfiguredRoutes" : 1,
      "guardedRoutes" : 6,
      "sanitizedCount" : 1,
      "totalParams" : 6,
      "unguardedRoutes" : 10,
      "unsanitizedCount" : 5
    }
  },
  "scenario" : "inventory",
  "tool" : "query_service_routes"
}
