#feature: some update
This commit is contained in:
@@ -4,6 +4,7 @@ namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Models\Config;
|
||||
use App\Services\ErpRequestReportService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\Rule;
|
||||
@@ -14,6 +15,7 @@ class ConfigController extends Controller
|
||||
public function index(): JsonResponse
|
||||
{
|
||||
$configs = Config::query()
|
||||
->where('key', '!=', ErpRequestReportService::DINGTALK_TOKEN_CONFIG_KEY)
|
||||
->orderBy('key')
|
||||
->get();
|
||||
|
||||
@@ -28,7 +30,7 @@ class ConfigController extends Controller
|
||||
public function store(Request $request): JsonResponse
|
||||
{
|
||||
$data = $request->validate([
|
||||
'key' => ['required', 'string', 'max:255', 'unique:configs,key'],
|
||||
'key' => ['required', 'string', 'max:255', 'unique:configs,key', 'not_in:'.ErpRequestReportService::DINGTALK_TOKEN_CONFIG_KEY],
|
||||
'value' => ['nullable', 'string'],
|
||||
'description' => ['nullable', 'string', 'max:255'],
|
||||
]);
|
||||
@@ -49,12 +51,15 @@ class ConfigController extends Controller
|
||||
|
||||
public function update(Request $request, Config $config): JsonResponse
|
||||
{
|
||||
$this->ensureNotProtected($config);
|
||||
|
||||
$data = $request->validate([
|
||||
'key' => [
|
||||
'required',
|
||||
'string',
|
||||
'max:255',
|
||||
Rule::unique('configs', 'key')->ignore($config->id),
|
||||
'not_in:'.ErpRequestReportService::DINGTALK_TOKEN_CONFIG_KEY,
|
||||
],
|
||||
'value' => ['nullable', 'string'],
|
||||
'description' => ['nullable', 'string', 'max:255'],
|
||||
@@ -76,6 +81,8 @@ class ConfigController extends Controller
|
||||
|
||||
public function destroy(Config $config): JsonResponse
|
||||
{
|
||||
$this->ensureNotProtected($config);
|
||||
|
||||
$config->delete();
|
||||
|
||||
return response()->json([
|
||||
@@ -103,4 +110,13 @@ class ConfigController extends Controller
|
||||
|
||||
return $decoded;
|
||||
}
|
||||
|
||||
private function ensureNotProtected(Config $config): void
|
||||
{
|
||||
if ($config->key === ErpRequestReportService::DINGTALK_TOKEN_CONFIG_KEY) {
|
||||
throw ValidationException::withMessages([
|
||||
'key' => '该配置只能通过 ERP 请求日报设置修改',
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Services\ConfigService;
|
||||
use App\Services\ErpRequestReportService;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
||||
class ErpRequestReportConfigController extends Controller
|
||||
{
|
||||
public function __construct(private readonly ConfigService $configService) {}
|
||||
|
||||
public function show(): JsonResponse
|
||||
{
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'dingtalk_token_configured' => filled($this->configService->get(ErpRequestReportService::DINGTALK_TOKEN_CONFIG_KEY)),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function update(Request $request): JsonResponse
|
||||
{
|
||||
$validated = $request->validate([
|
||||
'dingtalk_token' => ['required', 'string', 'max:2048'],
|
||||
]);
|
||||
|
||||
$token = trim($validated['dingtalk_token']);
|
||||
if ($token === '') {
|
||||
throw ValidationException::withMessages([
|
||||
'dingtalk_token' => 'Token 不能为空',
|
||||
]);
|
||||
}
|
||||
|
||||
$this->configService->set(
|
||||
ErpRequestReportService::DINGTALK_TOKEN_CONFIG_KEY,
|
||||
$token,
|
||||
'ERP 请求日报钉钉机器人 Token'
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'message' => 'ERP 请求日报钉钉机器人 Token 已保存',
|
||||
'data' => [
|
||||
'dingtalk_token_configured' => true,
|
||||
],
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -82,6 +82,7 @@ class JenkinsBuildController extends Controller
|
||||
'success' => (bool) ($result['success'] ?? false),
|
||||
'message' => $result['message'] ?? null,
|
||||
'queue_url' => $result['queue_url'] ?? null,
|
||||
'build_number' => $result['build_number'] ?? null,
|
||||
];
|
||||
}
|
||||
|
||||
@@ -94,6 +95,83 @@ class JenkinsBuildController extends Controller
|
||||
], $successCount > 0 ? 200 : 422);
|
||||
}
|
||||
|
||||
public function statuses(Request $request): JsonResponse
|
||||
{
|
||||
if (! $this->jenkinsClient->isConfigured()) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Jenkins 未配置,请先配置 Jenkins 连接信息',
|
||||
], 422);
|
||||
}
|
||||
|
||||
$projectSlugs = Project::getJenkinsNotifyEnabled()->pluck('slug')->all();
|
||||
$data = $request->validate([
|
||||
'builds' => ['required', 'array', 'min:1'],
|
||||
'builds.*.id' => ['required', 'string'],
|
||||
'builds.*.project_slug' => ['required', 'string', Rule::in($projectSlugs)],
|
||||
'builds.*.queue_url' => ['nullable', 'string'],
|
||||
'builds.*.build_number' => ['nullable', 'integer'],
|
||||
]);
|
||||
|
||||
$projects = Project::getJenkinsNotifyEnabled()->keyBy('slug');
|
||||
$results = [];
|
||||
|
||||
foreach ($data['builds'] as $build) {
|
||||
/** @var Project $project */
|
||||
$project = $projects[$build['project_slug']];
|
||||
|
||||
$results[] = [
|
||||
'id' => $build['id'],
|
||||
'project_slug' => $project->slug,
|
||||
'job_name' => $project->jenkins_job_name,
|
||||
...$this->jenkinsClient->getBuildStatus(
|
||||
$project->jenkins_job_name,
|
||||
$build['queue_url'] ?? null,
|
||||
isset($build['build_number']) ? (int) $build['build_number'] : null
|
||||
),
|
||||
];
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'success' => true,
|
||||
'data' => [
|
||||
'results' => $results,
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function cancel(Request $request): JsonResponse
|
||||
{
|
||||
if (! $this->jenkinsClient->isConfigured()) {
|
||||
return response()->json([
|
||||
'success' => false,
|
||||
'message' => 'Jenkins 未配置,请先配置 Jenkins 连接信息',
|
||||
], 422);
|
||||
}
|
||||
|
||||
$projectSlugs = Project::getJenkinsNotifyEnabled()->pluck('slug')->all();
|
||||
$data = $request->validate([
|
||||
'project_slug' => ['required', 'string', Rule::in($projectSlugs)],
|
||||
'queue_url' => ['nullable', 'string'],
|
||||
'build_number' => ['nullable', 'integer'],
|
||||
]);
|
||||
|
||||
$project = Project::getJenkinsNotifyEnabled()->firstWhere('slug', $data['project_slug']);
|
||||
$result = $this->jenkinsClient->cancelBuild(
|
||||
$project->jenkins_job_name,
|
||||
$data['queue_url'] ?? null,
|
||||
isset($data['build_number']) ? (int) $data['build_number'] : null
|
||||
);
|
||||
|
||||
return response()->json([
|
||||
'success' => (bool) ($result['success'] ?? false),
|
||||
'message' => ($result['success'] ?? false) ? '已发送取消请求' : ($result['message'] ?? '取消失败'),
|
||||
'data' => [
|
||||
'result' => $result,
|
||||
],
|
||||
], ($result['success'] ?? false) ? 200 : 422);
|
||||
}
|
||||
|
||||
private function normalizeParameters(array $parameters): array
|
||||
{
|
||||
return collect($parameters)
|
||||
|
||||
Reference in New Issue
Block a user