25 lines
1.5 KiB
PHP
25 lines
1.5 KiB
PHP
<?php
|
|
namespace App\Services;
|
|
use App\Models\Articles;
|
|
final class ResourcePublication
|
|
{
|
|
public static function usable(Articles $article): bool
|
|
{
|
|
if (in_array($article->sResourceStatus, ['failed','empty'], true)) return false;
|
|
// Legacy explicit zero is evidence of no result, not a successful refresh.
|
|
return !preg_match('/(?:共|更新)\s*0\s*个可用节点/u', Seo::text($article->sTitleSub));
|
|
}
|
|
public static function validate(array $article): array
|
|
{
|
|
validator($article, ['title'=>'required|string|max:250','title_sub'=>'present|string|max:4000',
|
|
'content'=>'required|string|max:2000000','tags'=>'present|array','7like'=>'nullable|integer|min:0',
|
|
'check_status'=>'nullable|in:success,failed,unknown','valid_count'=>'nullable|integer|min:0'])->validate();
|
|
$count = isset($article['valid_count']) ? (int)$article['valid_count'] : null;
|
|
$state = $article['check_status'] ?? 'unknown';
|
|
// Compatibility for the current upstream; a reported count is not a new live check.
|
|
if ($count === null && preg_match('/(?:共|更新)\s*(\d+)\s*个可用节点/u', Seo::text($article['title_sub']), $m)) $count = (int)$m[1];
|
|
abort_if($state === 'failed' || $count === 0 || trim(Seo::text($article['content'])) === '', 422, 'Resource update has no usable result; previous publication retained');
|
|
return ['sResourceStatus'=>$state === 'success' && $count > 0 ? 'success' : 'unknown','iResourceCount'=>$count];
|
|
}
|
|
}
|