Support user config of notification types, fixes #994

코어에서 지원하는 알림 종류 및 알림 수신 방법이 늘어남에 따라,
관리자가 설정한 범위 내에서 회원들이 알림 수신 방법을 선택할 수 있도록 합니다.
기존에는 수신 여부만 선택할 수 있었으나 이제 더 세부적인 설정이 가능합니다.
예를 들어 웹 알림과 푸시알림은 받고, 메일 알림과 문자 알림은 끌 수 있습니다.

이 기능을 지원하기 위해 ncenterlite_user_set 테이블 스키마를 대폭 조정합니다.
기존 설정은 가능하면 그대로 유지하려고 노력하였습니다.
This commit is contained in:
Kijin Sung 2020-12-17 23:41:31 +09:00
parent 3032784ca7
commit c52187a8f2
14 changed files with 435 additions and 531 deletions

View file

@ -63,72 +63,37 @@ class ncenterlite extends ModuleObject
}
}
if(!$oDB->isColumnExists('ncenterlite_notify', 'readed'))
foreach(['notify_type', 'readed', 'target_body', 'target_browser', 'target_p_srl'] as $column_name)
{
return true;
if(!$oDB->isColumnExists('ncenterlite_notify', $column_name))
{
return true;
}
}
foreach(['idx_srl', 'idx_member_srl', 'idx_regdate', 'idx_readed', 'idx_target_srl', 'idx_target_p_srl', 'idx_target_member_srl', 'idx_member_srl_and_readed'] as $index_name)
{
if(!$oDB->isIndexExists('ncenterlite_notify', $index_name))
{
return true;
}
}
if(!$oDB->isColumnExists('ncenterlite_notify', 'target_body'))
foreach(NcenterliteModel::getNotifyTypes() as $type => $srl)
{
return true;
if(!$oDB->isColumnExists('ncenterlite_user_set', $type . '_notify'))
{
return true;
}
else
{
$column_info = $oDB->getColumnInfo('ncenterlite_user_set', $type . '_notify');
if (strtolower($column_info->dbtype) !== 'varchar' || $column_info->size < 40)
{
return true;
}
}
}
if(!$oDB->isColumnExists('ncenterlite_notify', 'notify_type'))
{
return true;
}
if(!$oDB->isColumnExists('ncenterlite_notify', 'target_browser'))
{
return true;
}
if(!$oDB->isColumnExists('ncenterlite_notify', 'target_p_srl'))
{
return true;
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_srl'))
{
return true;
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_target_srl'))
{
return true;
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_target_p_srl'))
{
return true;
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_target_member_srl'))
{
return true;
}
// Composite index to speed up getNotifyList
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_member_srl_and_readed'))
{
return true;
}
if(!$oDB->isColumnExists('ncenterlite_user_set', 'comment_comment_notify'))
{
return true;
}
if(!$oDB->isColumnExists('ncenterlite_user_set', 'vote_notify'))
{
return true;
}
if(!$oDB->isColumnExists('ncenterlite_user_set', 'scrap_notify'))
{
return true;
}
// PK duplicate
if($oDB->isIndexExists('ncenterlite_notify', 'idx_notify'))
{
@ -177,54 +142,53 @@ class ncenterlite extends ModuleObject
}
}
if(!$oDB->isColumnExists('ncenterlite_notify','readed'))
{
$oDB->addColumn('ncenterlite_notify', 'readed', 'char', 1, 'N', true);
$oDB->addIndex('ncenterlite_notify', 'idx_readed', array('readed'));
$oDB->addIndex('ncenterlite_notify', 'idx_member_srl', array('member_srl'));
$oDB->addIndex('ncenterlite_notify', 'idx_regdate', array('regdate'));
}
if(!$oDB->isColumnExists('ncenterlite_notify','target_browser'))
{
$oDB->addColumn('ncenterlite_notify', 'target_browser', 'varchar', 50, true);
}
if(!$oDB->isColumnExists('ncenterlite_notify','target_body'))
{
$oDB->addColumn('ncenterlite_notify', 'target_body', 'varchar', 255, true);
}
if(!$oDB->isColumnExists('ncenterlite_notify','notify_type'))
{
$oDB->addColumn('ncenterlite_notify', 'notify_type', 'number', 11, 0);
}
if(!$oDB->isColumnExists('ncenterlite_notify','readed'))
{
$oDB->addColumn('ncenterlite_notify', 'readed', 'char', 1, 'N', true);
}
if(!$oDB->isColumnExists('ncenterlite_notify','target_body'))
{
$oDB->addColumn('ncenterlite_notify', 'target_body', 'varchar', 255, true);
}
if(!$oDB->isColumnExists('ncenterlite_notify','target_browser'))
{
$oDB->addColumn('ncenterlite_notify', 'target_browser', 'varchar', 50, true);
}
if(!$oDB->isColumnExists('ncenterlite_notify','target_p_srl'))
{
$oDB->addColumn('ncenterlite_notify', 'target_p_srl', 'number', 10, true);
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_srl'))
foreach(['idx_srl', 'idx_member_srl', 'idx_regdate', 'idx_readed', 'idx_target_srl', 'idx_target_p_srl', 'idx_target_member_srl'] as $index_name)
{
$oDB->addIndex('ncenterlite_notify', 'idx_srl', array('srl'));
if(!$oDB->isIndexExists('ncenterlite_notify', $index_name))
{
$oDB->addIndex('ncenterlite_notify', $index_name, array(substr($index_name, 4)));
}
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_target_srl'))
$prev_type = '';
foreach(NcenterliteModel::getNotifyTypes() as $type => $srl)
{
$oDB->addIndex('ncenterlite_notify', 'idx_target_srl', array('target_srl'));
if(!$oDB->isColumnExists('ncenterlite_user_set', $type . '_notify'))
{
$oDB->addColumn('ncenterlite_user_set', $type . '_notify', 'varchar', 40, null, true, $prev_type ? ($prev_type . '_notify') : 'member_srl');
}
else
{
$column_info = $oDB->getColumnInfo('ncenterlite_user_set', $type . '_notify');
if (strtolower($column_info->dbtype) !== 'varchar' || $column_info->size < 40)
{
$oDB->modifyColumn('ncenterlite_user_set', $type . '_notify', 'varchar', 40, null, true, $prev_type ? ($prev_type . '_notify') : 'member_srl');
}
}
$prev_type = $type;
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_target_p_srl'))
{
$oDB->addIndex('ncenterlite_notify', 'idx_target_p_srl', array('target_p_srl'));
}
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_target_member_srl'))
{
$oDB->addIndex('ncenterlite_notify', 'idx_target_member_srl', array('target_member_srl'));
}
// Composite index to speed up getNotifyList
if(!$oDB->isIndexExists('ncenterlite_notify', 'idx_member_srl_and_readed'))
{
@ -237,21 +201,6 @@ class ncenterlite extends ModuleObject
$oDB->dropIndex('ncenterlite_notify', 'idx_notify');
}
if(!$oDB->isColumnExists('ncenterlite_user_set','comment_comment_notify'))
{
$oDB->addColumn('ncenterlite_user_set', 'comment_comment_notify', 'char', 1, null, true, 'comment_notify');
}
if(!$oDB->isColumnExists('ncenterlite_user_set','vote_notify'))
{
$oDB->addColumn('ncenterlite_user_set', 'vote_notify', 'char', 1, null, true, 'mention_notify');
}
if(!$oDB->isColumnExists('ncenterlite_user_set','scrap_notify'))
{
$oDB->addColumn('ncenterlite_user_set', 'scrap_notify', 'char', 1, null, true, 'vote_notify');
}
$config = getModel('ncenterlite')->getConfig();
if(!$config)
{