refactor: single EventPresenter and ManualEvents shared by /api, /me, inbox, webhook; editable flag

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BCrwHHnGCB5XH968Nxokqw
This commit is contained in:
nikita.hohlov
2026-09-05 06:01:55 -03:00
parent 2ec71ab710
commit 9163ff97f9
10 changed files with 297 additions and 75 deletions

View File

@@ -3,11 +3,12 @@
namespace App\Http\Controllers;
use App\Enums\EventState;
use App\Http\Controllers\Api\EventsController as Presenter;
use App\Http\Controllers\Me\ChannelsController;
use App\Http\Controllers\Me\ProfileController;
use App\Ingest\ManualEvents;
use App\Models\Event;
use App\Models\User;
use App\Presenters\EventPresenter;
use App\Scheduling\DueResolver;
use Carbon\CarbonImmutable;
use Illuminate\Contracts\View\View;
@@ -36,14 +37,12 @@ class InboxController extends Controller
$groups[] = ['state' => $state, 'jp' => $jp, 'ru' => $ru, 'events' => $live->where('state', $state)->values()->all()];
}
$archive = $user->events()->with('source')
->whereIn('state', [EventState::Done->value, EventState::Expired->value])
->orderByDesc('updated_at')->limit(100)->get()
$archive = $user->archive()->get()
->map(fn (Event $e) => [
'title' => $e->payload['title'],
'source' => self::sourceLabel($e->source->name),
'due' => Presenter::present($e)['due_at'],
'closed_as' => $e->state === EventState::Expired ? 'Истекло' : ($e->payload['done_label'] ?? 'Сделано'),
'due' => EventPresenter::dueAt($e),
'closed_as' => EventPresenter::closedAs($e),
])->values()->all();
$profile = ProfileController::present($user);
@@ -74,7 +73,7 @@ class InboxController extends Controller
'done_label' => $e->payload['done_label'] ?? 'Сделано',
'can_remind' => $e->state !== EventState::Scheduled,
'source' => self::sourceLabel($e->source->name),
'due' => Presenter::present($e)['due_at'],
'due' => EventPresenter::dueAt($e),
'due_month' => self::MONTHS[(int) $due->day->format('n') - 1],
'due_day' => $due->day->format('d'),
'due_time' => $wholeDay ? null : $due->moment->format('H:i'),
@@ -85,7 +84,7 @@ class InboxController extends Controller
public static function sourceLabel(string $name): string
{
return $name === 'manual' ? 'вручную' : $name;
return $name === ManualEvents::SOURCE ? 'вручную' : $name;
}
/** Пропускает только относительные пути и http(s)-ссылки; прочее (напр. javascript:) отбрасывает. */