lubo_comment_query/app/Http/Controllers/ProgramAppendConstructController.php

121 lines
4.1 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\ProgramAppends;
use App\Models\Programs;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
class ProgramAppendConstructController extends BaseController
{
// region Views
public function index(Request $request, Programs $program) {
return view("program.construct.append.index", [
"program" => $program,
"appends" => $program->appends,
]);
}
public function add(Request $request, Programs $program) {
$append = new ProgramAppends();
if (sizeof($program->appends) === 0) {
$append->is_original = 1;
}
return view("program.construct.append.create", [
"program" => $program,
"append" => $append
]);
}
public function edit(Request $request, ProgramAppends $append) {
return view("program.construct.append.create", [
"program" => $append->program,
"append" => $append
]);
}
public function copy_view(Request $request, Programs $program) {
$programsId = Programs::query()->select("id")
->where("created_at", "<", $program->created_at->addWeeks(2))
->where("created_at", ">", $program->created_at->addWeeks(-2))
->pluck("id");
$broadcastList = ProgramAppends::query()->groupBy("name", "from")
->whereIn("program_id", $programsId)
->where("broadcast", "=", 1)
->select("name", "from")->selectRaw("max(id) as id")
->orderBy("id")->get();
return view("program.construct.append.copy_broadcast", [
"program" => $program,
"broadcastList" => $broadcastList,
]);
}
// endregion
// region Form Submits
public function create(Request $request, Programs $program) {
$append = $this->fill_model($request);
$program->appends()->save($append);
return redirect(route("program.construct.append.list", [
"program"=>$program->id,
]));
}
public function submit(Request $request, ProgramAppends $append) {
$append = $this->fill_model($request, $append);
$append->save();
return redirect(route("program.construct.append.list", [
"program"=>$append->program->id,
]));
}
public function copy_append(Request $request, Programs $program) {
$payload = $request->validate([
"ids" => ["required", "array", "exists:App\Models\ProgramAppends,id"]
]);
$original_appends = ProgramAppends::query()->findMany($payload["ids"]);
$appends = $original_appends->map(function ($append) {
return $append->replicate();
});
$program->appends()->saveMany($appends);
return redirect(route("program.construct.append.list", [
"program"=>$program->id,
]));
}
// endregion
// region API
public function from_list(Request $request) {
$query = ProgramAppends::query()->groupBy("from")
->select("from")
->selectRaw("count(1) as total_count")
->orderByDesc("total_count");
return $query->get()->map(function ($item) {
return [
"text" => $item["from"],
"value" => $item["from"],
"alias" => implode("", \pinyin($item["from"], PINYIN_NO_TONE|PINYIN_KEEP_ENGLISH)),
"abbr" => \pinyin_abbr($item["from"]),
];
})->toArray();
}
// endregion
private function fill_model(Request $request, ?ProgramAppends $append = null): ProgramAppends
{
if ($append === null) {
$append = new ProgramAppends();
}
$payload = $request->validate([
"name" => ["required_without:is_original"],
"from" => ["required"],
"price" => ["required", "numeric"],
"append" => [],
]);
$append->fill($payload);
$append->is_original = $request->post("is_original", 0);
return $append;
}
}