스팸 필터 설정 정규화 로직 분리

This commit is contained in:
2026-07-24 11:36:45 +09:00
parent 6b8fd27423
commit 526c9b9de9
7 changed files with 99 additions and 20 deletions

View File

@@ -6,10 +6,6 @@ import {
normalizeAnnouncementBackgroundColor
} from '~/lib/announcement-bar.js'
import { DEFAULT_BRAND_COLOR, normalizeBrandColor } from '~/lib/brand-color.js'
import {
normalizeSignupBlockedUsernames,
parseSignupBlockedUsernamesFromText
} from '~/lib/signup-blocked-usernames.js'
import {
DISPLAY_COUNT_OPTIONS,
POST_LIST_COUNT_OPTIONS
@@ -33,6 +29,15 @@ import {
hasSocialSettingsSectionChanges,
normalizeSocialSettingsSection
} from '~/lib/admin-social-settings-section.js'
import {
SPAM_SETTINGS_FIELDS,
assignSpamSettingsSection,
createDefaultSpamSettingsSnapshot,
formatSpamBlockedUsernamesText,
hasSpamSettingsSectionChanges,
normalizeSpamSettingsSection,
parseSpamBlockedUsernamesText
} from '~/lib/admin-spam-settings-section.js'
definePageMeta({
layout: 'admin'
@@ -181,9 +186,7 @@ const announcementSnapshot = reactive({
announcementAlignment: DEFAULT_ANNOUNCEMENT_ALIGNMENT
})
/** 편집 시작 시점의 스팸 필터(취소 시 복원용) */
const spamSnapshot = reactive({
signupBlockedUsernames: []
})
const spamSnapshot = reactive(createDefaultSpamSettingsSnapshot())
/** 편집 시작 시점의 사이트 코드(취소 시 복원용) */
const siteCodeSnapshot = reactive({
adsTxt: '',
@@ -225,6 +228,7 @@ const {
})
const initialPostSettings = normalizePostSettingsSection(settings.value)
const initialSocialSettings = normalizeSocialSettingsSection(settings.value)
const initialSpamSettings = normalizeSpamSettingsSection(settings.value)
const form = reactive({
title: settings.value?.title || 'sori.studio',
@@ -246,7 +250,7 @@ const form = reactive({
announcementUrl: settings.value?.announcementUrl || '',
announcementBackgroundColor: normalizeAnnouncementBackgroundColor(settings.value?.announcementBackgroundColor || DEFAULT_ANNOUNCEMENT_BACKGROUND_COLOR),
announcementAlignment: normalizeAnnouncementAlignment(settings.value?.announcementAlignment || DEFAULT_ANNOUNCEMENT_ALIGNMENT),
signupBlockedUsernames: normalizeSignupBlockedUsernames(settings.value?.signupBlockedUsernames),
...initialSpamSettings,
adsTxt: settings.value?.adsTxt || '',
customHeadCode: settings.value?.customHeadCode || '',
customFooterCode: settings.value?.customFooterCode || '',
@@ -329,7 +333,7 @@ const hasAnnouncementChanges = computed(() => customizeAnnouncement.value && (
* @returns {boolean} 변경 여부
*/
const hasSpamChanges = computed(() => editSpam.value
&& JSON.stringify(form.signupBlockedUsernames) !== JSON.stringify(spamSnapshot.signupBlockedUsernames))
&& hasSpamSettingsSectionChanges(form, spamSnapshot))
/**
* 사이트 코드 변경 여부
@@ -599,9 +603,9 @@ const getPostExportProgressDescription = (job) => {
* 가입 금지 닉네임 textarea 바인딩
*/
const signupBlockedUsernamesText = computed({
get: () => form.signupBlockedUsernames.join('\n'),
get: () => formatSpamBlockedUsernamesText(form),
set: (value) => {
form.signupBlockedUsernames = parseSignupBlockedUsernamesFromText(value)
assignSpamSettingsSection(form, parseSpamBlockedUsernamesText(value))
}
})
@@ -1080,7 +1084,7 @@ const buildSiteSettingsPayload = (fields = null) => {
announcementUrl: form.announcementUrl || '',
announcementBackgroundColor: normalizeAnnouncementBackgroundColor(form.announcementBackgroundColor || DEFAULT_ANNOUNCEMENT_BACKGROUND_COLOR),
announcementAlignment: normalizeAnnouncementAlignment(form.announcementAlignment || DEFAULT_ANNOUNCEMENT_ALIGNMENT),
signupBlockedUsernames: normalizeSignupBlockedUsernames(form.signupBlockedUsernames),
...normalizeSpamSettingsSection(form),
adsTxt: form.adsTxt || '',
customHeadCode: form.customHeadCode || '',
customFooterCode: form.customFooterCode || '',
@@ -1561,7 +1565,8 @@ const saveAnnouncementSection = async () => {
* @returns {void}
*/
const beginEditSpam = () => {
spamSnapshot.signupBlockedUsernames = [...form.signupBlockedUsernames]
assignSpamSettingsSection(spamSnapshot, form)
assignSpamSettingsSection(form, spamSnapshot)
editSpam.value = true
}
@@ -1570,7 +1575,7 @@ const beginEditSpam = () => {
* @returns {void}
*/
const cancelEditSpam = () => {
form.signupBlockedUsernames = [...spamSnapshot.signupBlockedUsernames]
assignSpamSettingsSection(form, spamSnapshot)
editSpam.value = false
}
@@ -1586,11 +1591,12 @@ const saveSpamSection = async () => {
const ok = await persistSiteSettings({
successToast: '스팸 필터 설정이 저장되었습니다.',
savingFlag: savingSpam,
fields: ['signupBlockedUsernames']
fields: SPAM_SETTINGS_FIELDS
})
if (ok) {
spamSnapshot.signupBlockedUsernames = [...form.signupBlockedUsernames]
assignSpamSettingsSection(spamSnapshot, form)
assignSpamSettingsSection(form, spamSnapshot)
editSpam.value = false
}
}