AgentPageConfigurationService.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. <?php
  2. namespace App\Services\Agent;
  3. use App\Services\OperationAuditService;
  4. use App\Support\RichTextContent;
  5. use Illuminate\Support\Facades\DB;
  6. use Illuminate\Support\Facades\Validator;
  7. use Illuminate\Validation\ValidationException;
  8. class AgentPageConfigurationService
  9. {
  10. private const FIELDS = ['commission_plan_html', 'contact_tg_url', 'agent_backend_url'];
  11. public function get(): array
  12. {
  13. return $this->format(DB::table('agent_page_settings')->where('id', 1)->first());
  14. }
  15. public function save(array $input): array
  16. {
  17. $data = Validator::make($input, [
  18. 'commission_plan_html' => ['present', 'nullable', 'string', 'max:100000'],
  19. 'contact_tg_url' => ['present', 'nullable', 'string', 'max:2048'],
  20. 'agent_backend_url' => ['present', 'nullable', 'string', 'max:2048'],
  21. ], ['commission_plan_html.present' => '请提交佣金方案', 'contact_tg_url.present' => '请提交联系TG地址',
  22. 'agent_backend_url.present' => '请提交代理后台地址'])->validate();
  23. $data['commission_plan_html'] = RichTextContent::clean((string)($data['commission_plan_html'] ?? ''));
  24. foreach (['contact_tg_url', 'agent_backend_url'] as $field) {
  25. $url = trim((string)($data[$field] ?? ''));
  26. if ($url !== '') {
  27. $parts = parse_url($url);
  28. if (preg_match('/[\x00-\x20\x7f\\\\]/', $url) || !filter_var($url, FILTER_VALIDATE_URL) || !$parts
  29. || !in_array(strtolower($parts['scheme'] ?? ''), ['http', 'https'], true)
  30. || isset($parts['user']) || isset($parts['pass'])) {
  31. throw ValidationException::withMessages([$field => '请填写完整的HTTP/HTTPS地址']);
  32. }
  33. }
  34. $data[$field] = $url;
  35. }
  36. return DB::transaction(function () use ($data) {
  37. DB::table('agent_page_settings')->insertOrIgnore(['id' => 1, 'created_at' => now(), 'updated_at' => now()]);
  38. $before = $this->format(DB::table('agent_page_settings')->where('id', 1)->lockForUpdate()->first());
  39. if ($before !== $data) {
  40. DB::table('agent_page_settings')->where('id', 1)->update($data + ['updated_at' => now()]);
  41. OperationAuditService::record('agent_page_configuration', 1, 'update', $before, $data);
  42. }
  43. return $data;
  44. }, 3);
  45. }
  46. private function format(?object $row): array
  47. {
  48. $data = [];
  49. foreach (self::FIELDS as $field) $data[$field] = (string)($row->$field ?? '');
  50. return $data;
  51. }
  52. }