<commit_before>'use strict'


/**
 * データストアとの中間層として機能するデータ管理クラスです。
 * SakuyaBotが保持するユーザデータの管理を行い、バックエンドでデータストアとの同期を実行します。
 */
const DataManager = class {
  /**
   * 生成時、バックエンドのデータストアからデータを取得します。
   */
  constructor (db) {
    this.db = db
  }

  /**
   * クエリを発行し、結果をPromiseで返却します。
   * @param query クエリ
   * @param value プレースホルダで置き換えるパラメータ
   * @return 実行結果を返却するPromise
   */
  _query (query, value) {
    return new Promise ((resolve, reject) => {
      connection.query( query, value, (err, rows) => {
        if (err) reject(err)
        else resolve(rows)
      })
    })
  }

  /**
   * トランザクションを生成します。
   * @param transaction トランザクション内で実行する処理(関数)
   */
  _transaction (transaction) {
    connection.beginTransaction( (err) => {
      if (err) throw err
      else transaction()
    })
  }

  /**
   * ユーザのドキュメントを作成します。
   * @param {UserObject} user TwitterのUser Object
   * @return insertの結果
   */
  createUser (user) {
    return this._query(
      'INSERT into users (id, nickname, lovelity) value (?, ?, ?) ;', 
      [user.id_str, ':NAME:さん', 5]
    )
  }

  /** 
   * ユーザデータを取得します。
   * @param {UserObject} user TwitterのUser Object
   * @return ユーザデータ
   */
  getUser (user) {
    return this._query(
      'SELECT * from users WHERE id = ?;',
      [user.id_str]
    ).then( (data) => { return data[0] })
  }

  /**
   * ユーザのドキュメントを更新します。
   * @param {UserObject} user TwitterのUser Object
   * @param {object} data 更新するデータのクエリ
   * @return updateの結果
   */
  _updateUser (user, data) {
    return this._query(
      'UPDATE users set ? WHERE id = ?;',
      [data, user.id_str]
    )
  }

  /**
   * 指定したIDのユーザにニックネームを設定します。
   * @param {UserObject} user TwitterのUser Object
   * @param {string} nickname ニックネーム
   * @return updateの結果
   */
  setNickname (user, nickname) {
    return this._updateUser(user, {nickname: nickname})
  }


  /**
   * 指定したIDのユーザの誕生日を設定します。
   * @param {UserObject} user TwitterのUser Object
   * @param {number} month 誕生月
   * @param {number} day 誕生日
   * @return updateの結果
   * [hint]月と日のみで管理する。Date.yearは2000でMASKする。
   */
  setBirthday (user, month, day) {
    return this._updateUser(user, {birth_m: month, birth_d: day})
  }

  /**
   * 指定したIDのユーザの好感度を設定します。。
   * @param {UserObject} user TwitterのUser Object
   * @param {number} lovelity 好感度値
   * @return updateの結果
   */
  setLovelity (user, lovelity) {
    return this._updateUser(user, {lovelity: lovelity})
  }

  /**
   * 指定したIDのユーザの献血履歴を残します。
   * @param {UserObject} user 
   * @param {number} 献血量
   * @return updateの結果
   */
  addDonateLog(user, amount) {
    return this._query(
      'INSERT into donates (userId, donatedAt, amount) value (?, NOW(), ?);',
      [user.id_str, amount]
    )
  }

  /**
   * 指定したユーザが献血していたかどうかを調べます。
   * @param {UserObject} user
   * @return 献血している場合はtrue, それ以外はfalse
   */
  userIsDonated(user) {
    /** @todo 関数の実装 */
    return user
  }

  /**
   * 献血履歴テーブルから合計量を集計します。
   * @return {number} 献血量
   */
  sumDonation () {
    /** @todo 関数の実装 */
    return false
  }

  /**
   * 合計献血量を日別献血履歴に退避し、
   * 献血履歴テーブルをクリアします。
   * @return delete結果
   */
  stashDonatedLog () {
    /** @todo 関数の実装 */
    return false
  }
}

module.exports = DataManager


// test
const mysql = require('mysql')
require('dotenv').config()
const connection = mysql.createConnection({
  host : process.env.mysql_server,
  user : process.env.mysql_user,
  password: <PASSWORD>,
  database: process.env.mysql_database
})


// 接続
connection.connect()


// let dm = new DataManager(connection)

// createUser
// dm.createUser(
//   {id_str: "00000000"}
// ).then((rows) => { console.log(rows) }
// ).catch((err) => { throw err })

// getUser
// dm.getUser(
//   {id_str: "00000000"}
// ).then((rows) => { console.log(rows) }
// ).catch((err) => { console.error(err) })
<commit_msg>userIsDonated 実装<commit_after>'use strict'


/**
 * データストアとの中間層として機能するデータ管理クラスです。
 * SakuyaBotが保持するユーザデータの管理を行い、バックエンドでデータストアとの同期を実行します。
 */
const DataManager = class {
  /**
   * 生成時、バックエンドのデータストアからデータを取得します。
   */
  constructor (db) {
    this.db = db
  }

  /**
   * クエリを発行し、結果をPromiseで返却します。
   * @param query クエリ
   * @param value プレースホルダで置き換えるパラメータ
   * @return 実行結果を返却するPromise
   */
  _query (query, value) {
    return new Promise ((resolve, reject) => {
      connection.query( query, value, (err, rows) => {
        if (err) reject(err)
        else resolve(rows)
      })
    })
  }

  /**
   * トランザクションを生成します。
   * @param transaction トランザクション内で実行する処理(関数)
   */
  _transaction (transaction) {
    connection.beginTransaction( (err) => {
      if (err) throw err
      else transaction()
    })
  }

  /**
   * ユーザのドキュメントを作成します。
   * @param {UserObject} user TwitterのUser Object
   * @return insertの結果
   */
  createUser (user) {
    return this._query(
      'INSERT into users (id, nickname, lovelity) value (?, ?, ?) ;', 
      [user.id_str, ':NAME:さん', 5]
    )
  }

  /** 
   * ユーザデータを取得します。
   * @param {UserObject} user TwitterのUser Object
   * @return ユーザデータ
   */
  getUser (user) {
    return this._query(
      'SELECT * from users WHERE id = ?;',
      [user.id_str]
    ).then( (data) => { return data[0] })
  }

  /**
   * ユーザのドキュメントを更新します。
   * @param {UserObject} user TwitterのUser Object
   * @param {object} data 更新するデータのクエリ
   * @return updateの結果
   */
  _updateUser (user, data) {
    return this._query(
      'UPDATE users set ? WHERE id = ?;',
      [data, user.id_str]
    )
  }

  /**
   * 指定したIDのユーザにニックネームを設定します。
   * @param {UserObject} user TwitterのUser Object
   * @param {string} nickname ニックネーム
   * @return updateの結果
   */
  setNickname (user, nickname) {
    return this._updateUser(user, {nickname: nickname})
  }


  /**
   * 指定したIDのユーザの誕生日を設定します。
   * @param {UserObject} user TwitterのUser Object
   * @param {number} month 誕生月
   * @param {number} day 誕生日
   * @return updateの結果
   * [hint]月と日のみで管理する。Date.yearは2000でMASKする。
   */
  setBirthday (user, month, day) {
    return this._updateUser(user, {birth_m: month, birth_d: day})
  }

  /**
   * 指定したIDのユーザの好感度を設定します。。
   * @param {UserObject} user TwitterのUser Object
   * @param {number} lovelity 好感度値
   * @return updateの結果
   */
  setLovelity (user, lovelity) {
    return this._updateUser(user, {lovelity: lovelity})
  }

  /**
   * 指定したIDのユーザの献血履歴を残します。
   * @param {UserObject} user 
   * @param {number} 献血量
   * @return updateの結果
   */
  addDonateLog(user, amount) {
    return this._query(
      'INSERT into donates (userId, donatedAt, amount) value (?, NOW(), ?);',
      [user.id_str, amount]
    )
  }

  /**
   * 指定したユーザが献血していたかどうかを調べます。
   * @param {UserObject} user
   * @return 献血している場合はtrue, それ以外はfalse
   */
  userIsDonated(user) {
    /** @todo 関数の実装 */
    return this._query(
      'SELECT count(*) as DC from donates WHERE userId = ? and donatedAt BETWEEN concat(CURDATE(), " 00:00:00") and concat(CURDATE(), " 23:59:59");',
      [user.id_str]
    ).then( (data) => data[0].DC > 0 )
  }

  /**
   * 献血履歴テーブルから合計量を集計します。
   * @return {number} 献血量
   */
  sumDonation () {
    /** @todo 関数の実装 */
    return false
  }

  /**
   * 合計献血量を日別献血履歴に退避し、
   * 献血履歴テーブルをクリアします。
   * @return delete結果
   */
  stashDonatedLog () {
    /** @todo 関数の実装 */
    return false
  }
}

module.exports = DataManager


// test
const mysql = require('mysql')
require('dotenv').config()
const connection = mysql.createConnection({
  host : process.env.mysql_server,
  user : process.env.mysql_user,
  password: <PASSWORD>,
  database: process.env.mysql_database
})


// 接続
connection.connect()


// let dm = new DataManager(connection)

// createUser
// dm.userIsDonated(
//   {id_str: "00000000"}
// ).then((rows) => { console.log(rows) }
// ).catch((err) => { throw err })


// createUser
// dm.createUser(
//   {id_str: "00000000"}
// ).then((rows) => { console.log(rows) }
// ).catch((err) => { throw err })

// getUser
// dm.getUser(
//   {id_str: "00000000"}
// ).then((rows) => { console.log(rows) }
// ).catch((err) => { console.error(err) })

{'fraction_non_alphanumeric': 0.15323596071518508, 'fraction_numerical': 0.008310249307479225, 'mean_word_length': 2.771604938271605, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 25, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 5, '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': '1157466', 'n_tokens_mistral': 3685, 'n_tokens_neox': 3550, 'n_words': 591}