SOURCE

/**
 * 本文件定义了服务的配置信息获取机制, 通过这个机制,运营系统能够自动化的生成服务文档和配置工作;
 * 
 * 目前,我们只需要两种信息的获取
 * 
 * 1. 服务的状态信息, 用于跟踪每一个数据服务当前的状态
 * 2. 元数据信息,用于获取对服务的描述,方便一些工作的自动化
 * 
 * 借助服务的状态信息,我们除了能够了解服务的当前健康状态,还可以获取一些其他信息,例如
 * 1. 运行时间
 * 2. 代码版本号
 * 3. 元数据版本号
 * 
 * 其中,元数据版本号十分重要,通过对元数据版本的记录,可以实现增量更新,只有当元数据版本号发生了变化,
 * 才需要更新诸如服务文档和配置等信息
 * 
 * 前置声明:
 * 1. 每一个服务部署后都需要向管理端提供服务地址,例如
 *    http://ip:port/svc/firespot
 *    服务地址是一个服务的入口地址,其所提供的接口(包含元数据接口)都是以此为前缀
 */


/**
 * 服务状态模型定义
 * 
 * 状态接口 
 * 
 * GET http://ip:port/svc/firespot/_status
 * 
 * @Remark 可以根据需要扩展状态数据内容
 */
export type ServiceStatus = {

   /**
    * 服务运行时间, 单位毫秒
    */
   uptime: number;

   /**
    * 代码版本号
    */
   codeVersion: number;

   /**
    * 元数据版本号
    */
   metaVersion: number;

}

/**
* 服务元数据模型定义
* 
* 元数据接口 
* 
* GET http://ip:port/svc/firespot/_meta
*/
export type ServiceDescriptor = {

   /**
    * 服务的名称
    */
   name: string;

   /**
    * 服务的基本描述
    */
   desc: string;

   /**
    * 数据源信息
    */
   dataSources: DataSource[];

   /**
    * 服务接口描述
    */
   apis: ServiceInterface[];

}

/**
* 数据源模型
* 
* 该模型为通用模型,即可用于表示卫星数据源,也可用来表示其他类型的数据源
* 
*/
export type DataSource = {
   /**
    * 数据源名称
    * 葵花8号 ccd | modis
    * 
    * name: 葵花8号CCD
    * name: 葵花8号modis
    */
   name: string;
   /**
   * 英文代码
   */
   code: string;

   /**
    * 数据源规格, 实际上就是为了描述不同的价格信息
    */
   specs: DataSourceSpec[];
}

/**
* 数据源具体的规格
*/
export type DataSourceSpec = {

   /**
    * 数据源规格名称 16分钟/次,3米分辨率
    */
   name: string;
   /**
    * 历史价格,单位:元/天/平方公里
    */
   historyDataPrice: number;
   /**
    * 实时价格,单位:元/天/平方公里  
    */
   realtimeDataPrice: number;
}

type HttpMethod = 'GET' | 'POST';


/**
* 服务接口描述
*/
export type ServiceInterface = {
   /**
    * 接口名称,例如
    * 获取火点列表
    */
   name: string;

   /**
    * 接口路径,例如
    * http://ip:port/svc/firespot/list
    * 
    * 其中 /svc/firespot/list 即为接口路径
    */
   path: string;

   /**
    * 接口功能描述
    */
   desc: string;

   /**
    * HTTP 请求方法,目前仅支持 GET/POST两种
    */
   method: HttpMethod;

   /**
    * 请求参数
    */
   requestParam: Param[];

   /**
    * 响应参数
    */
   response: string;

   /**
    * 示例
    */
   example: Example[];
}

/**
* 响应参数
*/
export type ResponseParam = {
   /**
    * 响应头
    */
   headers: Param[];
   
   /**
    * 响应体
    */
   body: Param[];
}

/**
* 请求示例
*/
export type Example = {

   /**
    * 请求示例
    */
   request: RequestExample;

   /**
    * 响应示例
    */
   response: ResponseExample;
}
/**
* 参数
*/
export type Param = {
   /**
    * 参数的名称
    */
   name: string;
   /**
    * 数据类型
    */
   dataType: 'string' | 'int' | 'long' | 'float' | 'double' | 'boolean';
   /**
    * 参数传输类型,目前不支持通过 http body 传递参数
    */
   paramType: 'query' | 'path';
   /**
    * 是否必填
    */
   required: boolean;
   /**
    * 默认值
    */
   defaultValue: string;
   /**
    * 描述信息
    */
   desc: string;
}

/**
* 请求参数示例
*/
export type RequestExample = {
   /**
    * https、http
    */
   schema: 'http' | 'https';
   /**
    * ip、域名
    */
   host: string;
   /**
    * 端口
    */
   port: number;
   /**
    * 接口路径
    */
   path: string;
   /**
    * GET|POST
    */
   method: HttpMethod;
   /**
    * 头
    */
   headers: KeyValue[];
   /**
    * query参数
    */
   query: KeyValue[]
}
/**
* 响应参数示例
*/
export type ResponseExample = {
   /**
    * 头信息
    */
   headers: KeyValue[];
   /**
    * 体信息
    */
   body: Body;
}
/**
* 键值
*/
export type KeyValue = {
   key: string;
   value: string;
}

export type Body = {
   /**
    * 编码
    */
   code: number;
   /**
    * 消息
    */
   message: string;
}
console 命令行工具 X clear

                    
>
console