fix: optimize batch email performance and fix gift card issues

- Add chunking and batching for admin email sending
- Fix gift card pagination and add per_page limits
- Update frontend prompts and complete language packs
This commit is contained in:
xboard
2025-08-23 00:11:45 +08:00
parent 53ca5d062c
commit 8f3cdf0dde
6 changed files with 266 additions and 157 deletions
@@ -65,15 +65,7 @@ class GiftCardController extends Controller
];
})->values();
return response()->json([
'data' => $data,
'pagination' => [
'current_page' => $templates->currentPage(),
'last_page' => $templates->lastPage(),
'per_page' => $templates->perPage(),
'total' => $templates->total(),
],
]);
return $this->paginate( $templates);
}
/**
@@ -352,7 +344,7 @@ class GiftCardController extends Controller
'batch_id' => 'string',
'status' => 'integer|in:0,1,2,3',
'page' => 'integer|min:1',
'per_page' => 'integer|min:1|max:100',
'per_page' => 'integer|min:1|max:500',
]);
$query = GiftCardCode::with(['template', 'user']);
@@ -391,15 +383,7 @@ class GiftCardController extends Controller
];
})->values();
return response()->json([
'data' => $data,
'pagination' => [
'current_page' => $codes->currentPage(),
'last_page' => $codes->lastPage(),
'per_page' => $codes->perPage(),
'total' => $codes->total(),
],
]);
return $this->paginate($codes);
}
/**
@@ -464,7 +448,7 @@ class GiftCardController extends Controller
'template_id' => 'integer|exists:v2_gift_card_template,id',
'user_id' => 'integer|exists:v2_user,id',
'page' => 'integer|min:1',
'per_page' => 'integer|min:1|max:100',
'per_page' => 'integer|min:1|max:500',
]);
$query = GiftCardUsage::with(['template', 'code', 'user', 'inviteUser']);
@@ -480,7 +464,7 @@ class GiftCardController extends Controller
$perPage = $request->input('per_page', 15);
$usages = $query->orderBy('created_at', 'desc')->paginate($perPage);
$data = $usages->getCollection()->map(function ($usage) {
$usages->transform(function ($usage) {
return [
'id' => $usage->id,
'code' => $usage->code->code ?? '',
@@ -493,15 +477,7 @@ class GiftCardController extends Controller
'created_at' => $usage->created_at,
];
})->values();
return response()->json([
'data' => $data,
'pagination' => [
'current_page' => $usages->currentPage(),
'last_page' => $usages->lastPage(),
'per_page' => $usages->perPage(),
'total' => $usages->total(),
],
]);
return $this->paginate($usages);
}
/**
@@ -16,6 +16,7 @@ use App\Utils\Helper;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Facades\Bus;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
@@ -442,22 +443,38 @@ class UserController extends Controller
$sort = $request->input('sort') ? $request->input('sort') : 'created_at';
$builder = User::orderBy($sort, $sortType);
$this->applyFiltersAndSorts($request, $builder);
$users = $builder->get();
foreach ($users as $user) {
SendEmailJob::dispatch(
[
$subject = $request->input('subject');
$content = $request->input('content');
$templateValue = [
'name' => admin_setting('app_name', 'XBoard'),
'url' => admin_setting('app_url'),
'content' => $content
];
$chunkSize = 1000;
$totalProcessed = 0;
$builder->chunk($chunkSize, function ($users) use ($subject, $templateValue, &$totalProcessed) {
$jobs = [];
foreach ($users as $user) {
$jobs[] = new SendEmailJob([
'email' => $user->email,
'subject' => $request->input('subject'),
'subject' => $subject,
'template_name' => 'notify',
'template_value' => [
'name' => admin_setting('app_name', 'XBoard'),
'url' => admin_setting('app_url'),
'content' => $request->input('content')
]
],
'send_email_mass'
);
}
'template_value' => $templateValue
], 'send_email_mass');
}
if (!empty($jobs)) {
Bus::batch($jobs)
->allowFailures()
->dispatch();
}
$totalProcessed += $users->count();
});
return $this->success(true);
}