fn_b/app/Services/ResourcePublication.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];
}
}