added some feature for plugin
This commit is contained in:
@@ -0,0 +1,28 @@
|
||||
import { IsOptional, IsString, MaxLength } from 'class-validator';
|
||||
|
||||
export class UpdateKhanegiDepositDto {
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@MaxLength(64)
|
||||
sms_charge_card_number?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@MaxLength(64)
|
||||
sms_charge_sheba?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@MaxLength(120)
|
||||
sms_charge_account_holder?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@MaxLength(4000)
|
||||
sms_charge_note?: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
@MaxLength(4000)
|
||||
plugin_charge_note?: string;
|
||||
}
|
||||
@@ -3,6 +3,7 @@ import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
||||
import { PermissionsGuard } from '../auth/permissions.guard';
|
||||
import { RequirePermissions } from '../auth/permissions.decorator';
|
||||
import { UpdateAdminSmsDto } from './dto/update-admin-sms.dto';
|
||||
import { UpdateKhanegiDepositDto } from './dto/update-khanegi-deposit.dto';
|
||||
import { RuntimeSettingsService } from './runtime-settings.service';
|
||||
|
||||
@Controller('settings')
|
||||
@@ -22,4 +23,16 @@ export class RuntimeSettingsController {
|
||||
this.settings.setAdminSmsEnabled(dto.enabled);
|
||||
return this.settings.getPublic();
|
||||
}
|
||||
|
||||
@Get('khanegi-deposit')
|
||||
@RequirePermissions('khanegi:read')
|
||||
getKhanegiDeposit() {
|
||||
return this.settings.getKhanegiDeposit();
|
||||
}
|
||||
|
||||
@Patch('khanegi-deposit')
|
||||
@RequirePermissions('khanegi:write')
|
||||
setKhanegiDeposit(@Body() dto: UpdateKhanegiDepositDto) {
|
||||
return this.settings.setKhanegiDeposit(dto);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,13 +2,33 @@ import { Injectable, Logger } from '@nestjs/common';
|
||||
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
|
||||
import { join } from 'path';
|
||||
|
||||
export type KhanegiDeposit = {
|
||||
sms_charge_card_number: string;
|
||||
sms_charge_sheba: string;
|
||||
sms_charge_account_holder: string;
|
||||
sms_charge_note: string;
|
||||
plugin_charge_note: string;
|
||||
};
|
||||
|
||||
type RuntimeSettings = {
|
||||
/** When false, SuperAdmin stops SMS alerts to managers */
|
||||
adminSmsEnabled: boolean;
|
||||
khanegiDeposit: KhanegiDeposit;
|
||||
};
|
||||
|
||||
const DEPOSIT_DEFAULTS: KhanegiDeposit = {
|
||||
sms_charge_card_number: '6219861961033817',
|
||||
sms_charge_sheba: 'IR080560611828005603604201',
|
||||
sms_charge_account_holder: 'حسین منتظر',
|
||||
sms_charge_note:
|
||||
'لطفا مبلغ مورد نظر خود جهت شارژ سامانه پیامکی را به شماره کارت یا حساب زیر واریز نمایید و تصویر فیش پرداختی را برای پشتیبانی بفرستید.',
|
||||
plugin_charge_note:
|
||||
'لطفا مبلغ افزونه را به شماره کارت یا حساب زیر واریز نمایید و تصویر فیش را از تب درخواستها ارسال کنید.',
|
||||
};
|
||||
|
||||
const DEFAULTS: RuntimeSettings = {
|
||||
adminSmsEnabled: true,
|
||||
khanegiDeposit: { ...DEPOSIT_DEFAULTS },
|
||||
};
|
||||
|
||||
@Injectable()
|
||||
@@ -28,6 +48,30 @@ export class RuntimeSettingsService {
|
||||
return next;
|
||||
}
|
||||
|
||||
getKhanegiDeposit(): KhanegiDeposit {
|
||||
return { ...this.read().khanegiDeposit };
|
||||
}
|
||||
|
||||
setKhanegiDeposit(patch: Partial<KhanegiDeposit>) {
|
||||
const current = this.read();
|
||||
const next: RuntimeSettings = {
|
||||
...current,
|
||||
khanegiDeposit: this.normalizeDeposit({ ...current.khanegiDeposit, ...patch }),
|
||||
};
|
||||
this.write(next);
|
||||
return next.khanegiDeposit;
|
||||
}
|
||||
|
||||
pluginStoreDeposit() {
|
||||
const d = this.getKhanegiDeposit();
|
||||
return {
|
||||
card_number: d.sms_charge_card_number,
|
||||
sheba: d.sms_charge_sheba,
|
||||
account_holder: d.sms_charge_account_holder,
|
||||
note: d.plugin_charge_note || d.sms_charge_note,
|
||||
};
|
||||
}
|
||||
|
||||
getPublic() {
|
||||
try {
|
||||
return { adminSmsEnabled: this.getAdminSmsEnabled() };
|
||||
@@ -37,21 +81,42 @@ export class RuntimeSettingsService {
|
||||
}
|
||||
}
|
||||
|
||||
private normalizeDeposit(raw?: Partial<KhanegiDeposit> | null): KhanegiDeposit {
|
||||
const pick = (key: keyof KhanegiDeposit) => {
|
||||
const value = String(raw?.[key] ?? '').trim();
|
||||
return value || DEPOSIT_DEFAULTS[key];
|
||||
};
|
||||
return {
|
||||
sms_charge_card_number: pick('sms_charge_card_number'),
|
||||
sms_charge_sheba: pick('sms_charge_sheba'),
|
||||
sms_charge_account_holder: pick('sms_charge_account_holder'),
|
||||
sms_charge_note: String(raw?.sms_charge_note ?? DEPOSIT_DEFAULTS.sms_charge_note),
|
||||
plugin_charge_note: String(raw?.plugin_charge_note ?? DEPOSIT_DEFAULTS.plugin_charge_note),
|
||||
};
|
||||
}
|
||||
|
||||
private read(): RuntimeSettings {
|
||||
if (this.cache) return this.cache;
|
||||
try {
|
||||
if (!existsSync(this.filePath)) {
|
||||
this.cache = { ...DEFAULTS };
|
||||
this.cache = {
|
||||
adminSmsEnabled: DEFAULTS.adminSmsEnabled,
|
||||
khanegiDeposit: { ...DEPOSIT_DEFAULTS },
|
||||
};
|
||||
return this.cache;
|
||||
}
|
||||
const raw = JSON.parse(readFileSync(this.filePath, 'utf8')) as Partial<RuntimeSettings>;
|
||||
this.cache = {
|
||||
adminSmsEnabled: raw.adminSmsEnabled !== false,
|
||||
khanegiDeposit: this.normalizeDeposit(raw.khanegiDeposit),
|
||||
};
|
||||
return this.cache;
|
||||
} catch (error: any) {
|
||||
this.logger.warn(`Failed to read runtime settings: ${error?.message || error}`);
|
||||
this.cache = { ...DEFAULTS };
|
||||
this.cache = {
|
||||
adminSmsEnabled: DEFAULTS.adminSmsEnabled,
|
||||
khanegiDeposit: { ...DEPOSIT_DEFAULTS },
|
||||
};
|
||||
return this.cache;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user