owner-settings.js 1.46 KB
const TABLE = 'vk_owner_settings'

/** 没有保存过设置的主人使用的产品默认值:Asia/Shanghai、23:00–08:00 安静、两类邮件都开。 */
export const DEFAULT_OWNER_SETTINGS = Object.freeze({ timezone: 'Asia/Shanghai', quiet_start_hour: 23, quiet_end_hour: 8, email_help: true, email_digest: true })

/**
 * @typedef {{ timezone: string, quiet_start_hour: number, quiet_end_hour: number, email_help: boolean, email_digest: boolean }} OwnerSettings
 */

/**
 * 主人的通知设置:时区、安静时段、邮件开关。
 * @param {{ db: import('knex').Knex }} deps
 */
export function createOwnerSettings({ db }) {
  if (typeof db !== 'function') throw new Error('createOwnerSettings: db is required')

  /**
   * @param {object} _ctx
   * @param {{ user_id: string }} input
   * @returns {Promise<OwnerSettings>}
   */
  async function get(_ctx, { user_id }) {
    const row = await db(TABLE).where({ user_id }).first()
    if (row === undefined) return { ...DEFAULT_OWNER_SETTINGS }
    return { timezone: row.timezone, quiet_start_hour: row.quiet_start_hour, quiet_end_hour: row.quiet_end_hour, email_help: row.email_help === 1, email_digest: row.email_digest === 1 }
  }

  /**
   * @param {object} _ctx
   * @param {{ user_id: string, settings: OwnerSettings }} input
   */
  async function save(_ctx, { user_id, settings }) {
    await db(TABLE).insert({ user_id, ...settings, updated_at: new Date() }).onConflict('user_id').merge()
  }

  return { get, save }
}