added some feature for plugin

This commit is contained in:
2026-09-08 18:00:56 +03:30
parent 67a03d9593
commit 58744d0f91
7 changed files with 147 additions and 7 deletions
@@ -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);
}
}
+67 -2
View File
@@ -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;
}
}