findOrFail($course); $items = CourseSession::query() ->where('course_id', $course) ->orderBy('sort') ->orderBy('id') ->get() ->map(fn (CourseSession $s) => $this->serialize($s)); return $this->ok(['items' => $items]); } public function store(Request $request, int $course): JsonResponse { Course::query()->findOrFail($course); $data = $request->validate([ 'title' => ['nullable', 'string', 'max:255'], 'starts_at' => ['nullable', 'date'], 'ends_at' => ['nullable', 'date', 'after_or_equal:starts_at'], 'venue' => ['nullable', 'string', 'max:255'], 'capacity' => ['nullable', 'integer', 'min:0'], 'sort' => ['nullable', 'integer'], ]); $session = CourseSession::query()->create([ 'course_id' => $course, ...$data, ]); return $this->ok(['id' => $session->id], '已创建'); } public function update(Request $request, int $course, int $session): JsonResponse { $model = CourseSession::query()->where('course_id', $course)->findOrFail($session); $data = $request->validate([ 'title' => ['nullable', 'string', 'max:255'], 'starts_at' => ['nullable', 'date'], 'ends_at' => ['nullable', 'date'], 'venue' => ['nullable', 'string', 'max:255'], 'capacity' => ['nullable', 'integer', 'min:0'], 'sort' => ['nullable', 'integer'], ]); $model->fill($data); $model->save(); return $this->ok(null, '已保存'); } public function destroy(int $course, int $session): JsonResponse { $model = CourseSession::query()->where('course_id', $course)->findOrFail($session); $model->delete(); return $this->ok(null, '已删除'); } /** * @return array */ protected function serialize(CourseSession $s): array { return [ 'id' => $s->id, 'course_id' => $s->course_id, 'title' => $s->title, 'starts_at' => $s->starts_at?->toIso8601String(), 'ends_at' => $s->ends_at?->toIso8601String(), 'venue' => $s->venue, 'capacity' => $s->capacity !== null ? (int) $s->capacity : null, 'sort' => (int) $s->sort, ]; } }