You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.9 KiB
117 lines
3.9 KiB
|
4 months ago
|
<?php
|
||
|
|
|
||
|
|
namespace App\Http\Controllers\Api\Admin;
|
||
|
|
|
||
|
|
use App\Http\Controllers\Controller;
|
||
|
|
use App\Models\PublicSourceChannel;
|
||
|
|
use Illuminate\Http\JsonResponse;
|
||
|
|
use Illuminate\Http\Request;
|
||
|
|
use Illuminate\Http\Response;
|
||
|
|
use Illuminate\Validation\Rule;
|
||
|
|
|
||
|
|
class PublicSourceChannelController extends Controller
|
||
|
|
{
|
||
|
|
public function index(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$channels = PublicSourceChannel::query()
|
||
|
|
->orderByDesc('id')
|
||
|
|
->get()
|
||
|
|
->map(fn (PublicSourceChannel $channel) => $this->toRow($channel, $request))
|
||
|
|
->values();
|
||
|
|
|
||
|
|
return response()->json(['data' => $channels]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function store(Request $request): JsonResponse
|
||
|
|
{
|
||
|
|
$data = $request->validate([
|
||
|
|
'source_code' => [
|
||
|
|
'required',
|
||
|
|
'string',
|
||
|
|
'min:2',
|
||
|
|
'max:64',
|
||
|
|
'regex:/^[A-Za-z0-9_-]{2,64}$/',
|
||
|
|
Rule::unique('public_source_channels', 'source_code'),
|
||
|
|
],
|
||
|
|
'source_name' => ['required', 'string', 'min:1', 'max:100'],
|
||
|
|
'status' => ['sometimes', Rule::in(PublicSourceChannel::STATUSES)],
|
||
|
|
]);
|
||
|
|
|
||
|
|
$channel = PublicSourceChannel::query()->create([
|
||
|
|
'source_code' => trim($data['source_code']),
|
||
|
|
'source_name' => trim($data['source_name']),
|
||
|
|
'status' => $data['status'] ?? PublicSourceChannel::STATUS_ENABLED,
|
||
|
|
]);
|
||
|
|
|
||
|
|
return response()->json($this->toRow($channel, $request), 201);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function show(Request $request, PublicSourceChannel $publicSourceChannel): JsonResponse
|
||
|
|
{
|
||
|
|
return response()->json($this->toRow($publicSourceChannel, $request));
|
||
|
|
}
|
||
|
|
|
||
|
|
public function update(Request $request, PublicSourceChannel $publicSourceChannel): JsonResponse
|
||
|
|
{
|
||
|
|
$data = $request->validate([
|
||
|
|
'source_code' => [
|
||
|
|
'sometimes',
|
||
|
|
'string',
|
||
|
|
'min:2',
|
||
|
|
'max:64',
|
||
|
|
'regex:/^[A-Za-z0-9_-]{2,64}$/',
|
||
|
|
Rule::unique('public_source_channels', 'source_code')->ignore($publicSourceChannel->id),
|
||
|
|
],
|
||
|
|
'source_name' => ['sometimes', 'string', 'min:1', 'max:100'],
|
||
|
|
'status' => ['sometimes', Rule::in(PublicSourceChannel::STATUSES)],
|
||
|
|
]);
|
||
|
|
|
||
|
|
if (array_key_exists('source_code', $data)) {
|
||
|
|
$publicSourceChannel->source_code = trim($data['source_code']);
|
||
|
|
}
|
||
|
|
if (array_key_exists('source_name', $data)) {
|
||
|
|
$publicSourceChannel->source_name = trim($data['source_name']);
|
||
|
|
}
|
||
|
|
if (array_key_exists('status', $data)) {
|
||
|
|
$publicSourceChannel->status = $data['status'];
|
||
|
|
}
|
||
|
|
$publicSourceChannel->save();
|
||
|
|
|
||
|
|
return response()->json($this->toRow($publicSourceChannel, $request));
|
||
|
|
}
|
||
|
|
|
||
|
|
public function destroy(PublicSourceChannel $publicSourceChannel): Response
|
||
|
|
{
|
||
|
|
$publicSourceChannel->status = PublicSourceChannel::STATUS_DISABLED;
|
||
|
|
$publicSourceChannel->save();
|
||
|
|
|
||
|
|
return response()->noContent();
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @return array<string, mixed>
|
||
|
|
*/
|
||
|
|
private function toRow(PublicSourceChannel $channel, Request $request): array
|
||
|
|
{
|
||
|
|
return [
|
||
|
|
'id' => $channel->id,
|
||
|
|
'source_code' => $channel->source_code,
|
||
|
|
'source_name' => $channel->source_name,
|
||
|
|
'status' => $channel->status,
|
||
|
|
'entry_url' => $this->entryUrl($channel, $request),
|
||
|
|
'created_at' => $channel->created_at?->toIso8601String(),
|
||
|
|
'updated_at' => $channel->updated_at?->toIso8601String(),
|
||
|
|
];
|
||
|
|
}
|
||
|
|
|
||
|
|
private function entryUrl(PublicSourceChannel $channel, Request $request): string
|
||
|
|
{
|
||
|
|
$base = trim((string) config('public_source.frontend_url'));
|
||
|
|
if ($base === '') {
|
||
|
|
$base = $request->getSchemeAndHttpHost();
|
||
|
|
}
|
||
|
|
|
||
|
|
return rtrim($base, '/').'/?src='.rawurlencode($channel->source_code);
|
||
|
|
}
|
||
|
|
}
|