<commit_before>import _ from 'underscore'

let ignoreFilters = {
  push: (body) => {
    // ブランチの追加削除時はコミットのないpushが通知される。
    if (body.total_commits_count > 0) {} else {
      return {
        detail: 'because no commit push.'
      }
    }
  },
  issue: new CheckIssue(),
  merge_request: (body) => {
    // Accept Mergeの時にも3個通知されるのでstate:opend以外を無視する。
    if (body.object_attributes.state !== 'opened') {
      return {
        detail: 'because mr is not opend and not can_be_merged.'
      }
    }
  }
}

// 無視するときは結果オブジェクトをそれ以外の場合はfalseを返す。
export default function(req, res, next) {
  let isIgnore = ignoreFilters[req.objectKind] && ignoreFilters[req.objectKind](req.body, req.params.chatId)

  // 無視するときはオブジェクトを設定
  req.objectKind = isIgnore ? isIgnore : req.objectKind

  next()
}

function CheckIssue() {
  // IssueはClose/Reopenすると全く同じ内容で２つずつ通知される。
  let abt = new AvoidingDoubleTransmission()

  return (body, chatId) => abt(body, chatId, ignoreUpdate)

  // assignを変更するたびに通知してくるので、updateは無視
  function ignoreUpdate(body) {
    if (body.object_attributes.action === 'update') {
      return {
        detail: 'action is update ' + JSON.stringify(body)
      }
    }
  }
}

// 直前と同じ場合は無視します。
function AvoidingDoubleTransmission() {
  let prevBody = {}

  return (body, chatId, next) => {
    if (!_.isEqual(body, prevBody[chatId])) {
      prevBody[chatId] = body
      return next(body)
    } else {
      return {
        detail: 'because same notification ' + JSON.stringify(body)
      }
    }
  }
}<commit_msg>Refactor.<commit_after>import _ from 'underscore'

let ignoreFilters = {
  push: (body) => {
    // ブランチの追加削除時はコミットのないpushが通知される。
    if (body.total_commits_count > 0) {} else {
      return {
        detail: 'because no commit push.'
      }
    }
  },
  issue: new AbtAndCheck(ignoreUpdate),
  merge_request: (body) => {
    // Accept Mergeの時にも3個通知されるのでstate:opend以外を無視する。
    if (body.object_attributes.state !== 'opened') {
      return {
        detail: 'because mr is not opend and not can_be_merged.'
      }
    }
  }
}

// 無視するときは結果オブジェクトをそれ以外の場合はfalseを返す。
export default function(req, res, next) {
  let isIgnore = ignoreFilters[req.objectKind] && ignoreFilters[req.objectKind](req.body, req.params.chatId)

  // 無視するときはオブジェクトを設定
  req.objectKind = isIgnore ? isIgnore : req.objectKind

  next()
}

function AbtAndCheck(chechFunc) {
  // IssueはClose/Reopenすると全く同じ内容で２つずつ通知される。
  let abt = new AvoidingDoubleTransmission()

  return (body, chatId) => abt(body, chatId, chechFunc)
}

// assignを変更するたびに通知してくるので、updateは無視
function ignoreUpdate(body) {
  if (body.object_attributes.action === 'update') {
    return {
      detail: 'action is update ' + JSON.stringify(body)
    }
  }
}

// 直前と同じ場合は無視します。
function AvoidingDoubleTransmission() {
  let prevBody = {}

  return (body, chatId, next) => {
    if (!_.isEqual(body, prevBody[chatId])) {
      prevBody[chatId] = body
      return next(body)
    } else {
      return {
        detail: 'because same notification ' + JSON.stringify(body)
      }
    }
  }
}
{'fraction_non_alphanumeric': 0.12516425755584756, 'fraction_numerical': 0.0019710906701708277, 'mean_word_length': 3.092741935483871, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 13, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3699122', 'n_tokens_mistral': 1221, 'n_tokens_neox': 1190, 'n_words': 206}