text: const yapi = require('../yapi.js');
  const baseModel = require('./base.js');
  
  class interfaceModel extends baseModel {
    getName() {
      return 'interface';
    }
    
  
    getSchema() {
      return {
        title: { type: String, required: true },
        uid: { type: Number, required: true },
        path: { type: String, required: true },
        method: { type: String, required: true },
        project_id: { type: Number, required: true },
        catid: { type: Number, required: true },
        edit_uid: { type: Number, default: 0 },
        status: { type: String, enum: ['undone', 'done'], default: 'undone' },
        desc: String,
        markdown: String,
        add_time: Number,
        up_time: Number,
        type: { type: String, enum: ['static', 'var'], default: 'static' },
        query_path: {
          path: String,
          params: [{
            name: String, value: String
          }]
        },
        req_query: [{
          name: String, 
          value: String, 
          example: String, 
          desc: String, 
          required: {
            type: String,
            enum: ["1", "0"],
            default: "1"
          }
        }],
        req_headers: [{
          name: String, value: String, example: String, desc: String, required: {
            type: String,
            enum: ["1", "0"],
            default: "1"
          }
        }],
        req_params: [{
          name: String,
          desc: String,
          example: String
        }],
        req_body_type: {
          type: String,
          enum: ['form', 'json', 'text', 'file', 'raw']
        },
        req_body_is_json_schema: { type: Boolean, default: false },
        req_body_form: [{
          name: String, 
          type: { type: String, enum: ['text', 'file'] }, 
          example: String, 
          value: String,
          desc: String, 
          required: {
            type: String,
            enum: ["1", "0"],
            default: "1"
          }
        }],
        req_body_other: String,
        res_body_type: {
          type: String,
          enum: ['json', 'text', 'xml', 'raw', 'json-schema']
        },
        res_body: String,
        res_body_is_json_schema: { type: Boolean, default: false },
        custom_field_value: String,
        field2: String,
        field3: String,
        api_opened: { type: Boolean, default: false },
        index: { type: Number, default: 0 }
      };
    }
  
    
    save(data) {
      let m = new this.model(data);
      return m.save();
    }
  
    get(id) {
      return this.model.findOne({
        _id: id
      })
        .exec();
    }
  
    getBaseinfo(id) {
      return this.model.findOne({
        _id: id
      }).select('path method uid title project_id cat_id status ').exec()
    }
  
    getVar(project_id, method) {
      return this.model.find({
        project_id: project_id,
        type: 'var',
        method: method
      }).select('_id path').exec()
    }
  
    getByQueryPath(project_id, path, method) {
      return this.model.find({
        project_id: project_id,
        "query_path.path": path,
        method: method
      })
        .exec();
    }
  
    getByPath(project_id, path, method, select) {
      select = select || '_id title uid path method project_id catid edit_uid status add_time up_time type query_path req_query req_headers req_params req_body_type req_body_form req_body_other res_body_type custom_field_value res_body res_body_is_json_schema'
      return this.model.find({
        project_id: project_id,
        path: path,
        method: method
      })
      .select(select)
        .exec();
    }
  
    checkRepeat(id, path, method) {
      return this.model.count({
        project_id: id,
        path: path,
        method: method
      });
    }
  
    countByProjectId(id) {
      return this.model.count({
        project_id: id
      });
    }
  
    list(project_id, select) {
      select = select || '_id title uid path method project_id catid edit_uid status add_time up_time'
      return this.model.find({
        project_id: project_id
      })
        .select(select)
        .sort({ title: 1 })
        .exec();
    }
  
    listWithPage(project_id, page, limit) {
      page = parseInt(page);
      limit = parseInt(limit);
      return this.model.find({
        project_id: project_id
      })
        .sort({ title: 1 })
        .skip((page - 1) * limit)
        .limit(limit)
        .select('_id title uid path method project_id catid api_opened edit_uid status add_time up_time')
        .exec();
  
    }
  
    listByPid(project_id) {
      return this.model.find({
        project_id: project_id
      })
        .sort({ title: 1 })
        .exec();
    }
  
    //获取全部接口信息
    getInterfaceListCount() {
      return this.model.count({});
    }
  
    listByCatid(catid, select) {
      select = select || '_id title uid path method project_id catid edit_uid status add_time up_time index'
      return this.model.find({
        catid: catid
      })
        .select(select)
        .sort({ index: 1 })
        .exec();
    }
  
    listByCatidWithPage(catid, page, limit) {
      page = parseInt(page);
      limit = parseInt(limit);
      return this.model.find({
        catid: catid
      })
        .sort({ index: 1 })
        .skip((page - 1) * limit)
        .limit(limit)
        .select('_id title uid path method project_id catid edit_uid api_opened status add_time up_time, index')
        .exec();
  
    }
  
    listByInterStatus(catid, status){
      
      let option ={}
      if(status === 'open') {
        option = {
          catid: catid,
          api_opened: true
        }
      } else {
        option = {
          catid: catid
        }
      }
      return this.model.find(option)
        .select()
        .sort({ title: 1 })
        .exec();
    }
  
    del(id) {
      return this.model.remove({
        _id: id
      });
    }
  
    delByCatid(id) {
      return this.model.remove({
        catid: id
      })
    }
  
    delByProjectId(id) {
      return this.model.remove({
        project_id: id
      })
    }
  
    up(id, data) {
      data.up_time = yapi.commons.time();
      return this.model.update({
        _id: id
      }, data, { runValidators: true });
    }
  
    upEditUid(id, uid) {
      return this.model.update({
        _id: id
      },
        { edit_uid: uid },
        { runValidators: true });
    }
    getcustomFieldValue(id,value) {
      return this.model.find({
        project_id: id,
        custom_field_value: value
      })
      .select('title uid path method edit_uid status desc add_time up_time type query_path req_query req_headers req_params req_body_type req_body_form req_body_other res_body_type custom_field_value')
        .exec();
    }
  
    listCount(option) {
      return this.model.count(option);
    }
  
    upIndex(id, index) {
      return this.model.update({
          _id: id
      }, {
              index: index
          })
  }
  
  
  }
  
  module.exports = interfaceModel;
  