From 2c6457345241dbb03817c115373c3eb42900d161 Mon Sep 17 00:00:00 2001 From: Tajim Date: Tue, 1 Sep 2026 23:19:33 +0600 Subject: [PATCH] feat(forum): make question details optional while keeping title required --- app/Http/Controllers/ForumController.php | 4 +-- ...ake_body_nullable_on_forum_posts_table.php | 28 +++++++++++++++++++ resources/js/pages/Forum/Create.vue | 10 ++++--- resources/js/pages/Forum/Index.vue | 3 +- resources/js/pages/Forum/Show.vue | 18 +++++++----- tests/Feature/ForumTest.php | 22 +++++++++++++++ 6 files changed, 71 insertions(+), 14 deletions(-) create mode 100644 database/migrations/2026_09_01_231700_make_body_nullable_on_forum_posts_table.php diff --git a/app/Http/Controllers/ForumController.php b/app/Http/Controllers/ForumController.php index 595bf0ec..c4b24077 100644 --- a/app/Http/Controllers/ForumController.php +++ b/app/Http/Controllers/ForumController.php @@ -212,7 +212,7 @@ public function store(Request $request): RedirectResponse $validated = $request->validate([ 'title' => ['required', 'string', 'min:5', 'max:255', new CleanText], - 'body' => ['required', 'string', 'min:10', 'max:30000', new CleanText], + 'body' => ['nullable', 'string', 'max:30000', new CleanText], 'curriculum' => ['required', 'in:hsc,ssc'], 'subject_id' => ['nullable', 'exists:subjects,id'], 'node_id' => ['nullable', 'exists:nodes,id'], @@ -251,7 +251,7 @@ public function store(Request $request): RedirectResponse 'node_id' => $nodeId, 'curriculum' => $validated['curriculum'], 'title' => $validated['title'], - 'body' => $validated['body'], + 'body' => $validated['body'] ?? null, 'image_path' => $imagePath, 'is_locked' => false, 'moderation_status' => $moderationStatus, diff --git a/database/migrations/2026_09_01_231700_make_body_nullable_on_forum_posts_table.php b/database/migrations/2026_09_01_231700_make_body_nullable_on_forum_posts_table.php new file mode 100644 index 00000000..5a354fcd --- /dev/null +++ b/database/migrations/2026_09_01_231700_make_body_nullable_on_forum_posts_table.php @@ -0,0 +1,28 @@ +text('body')->nullable()->change(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('forum_posts', function (Blueprint $table) { + $table->text('body')->nullable(false)->change(); + }); + } +}; diff --git a/resources/js/pages/Forum/Create.vue b/resources/js/pages/Forum/Create.vue index c6d59a61..cc3aca08 100644 --- a/resources/js/pages/Forum/Create.vue +++ b/resources/js/pages/Forum/Create.vue @@ -121,7 +121,7 @@ const removeImage = () => { const handleOpenModal = () => { // Basic frontend checks before modal - if (!form.title.trim() || !form.body.trim()) { + if (!form.title.trim()) { form.post('/forum'); // trigger inertia validation errors if fields are empty return; @@ -335,14 +335,16 @@ const submit = () => { for="body" class="mb-2 block text-xs font-bold tracking-wider text-slate-700 uppercase dark:text-gray-300" > - Question Details * + Question Details + (Optional)

{{ post.body }} diff --git a/resources/js/pages/Forum/Show.vue b/resources/js/pages/Forum/Show.vue index e0e8e13d..66465bb7 100644 --- a/resources/js/pages/Forum/Show.vue +++ b/resources/js/pages/Forum/Show.vue @@ -86,7 +86,7 @@ interface ForumPost { curriculum: 'hsc' | 'ssc'; title: string; slug: string; - body: string; + body?: string | null; image_path?: string | null; image_url?: string | null; is_answered: boolean; @@ -288,21 +288,21 @@ const openReportModal = ( id: number, title: string | undefined, authorName: string | undefined, - contentPreview: string, + contentPreview?: string | null, ) => { if (!requireAuth('Please sign in to report this content.')) { return; } + const preview = contentPreview || ''; + reportingTarget.value = { type, id, title, authorName: authorName || 'Anonymous', contentPreview: - contentPreview.length > 200 - ? contentPreview.slice(0, 200) + '...' - : contentPreview, + preview.length > 200 ? preview.slice(0, 200) + '...' : preview, }; reportReason.value = 'Inappropriate content or conduct'; reportSuccessMessage.value = null; @@ -581,7 +581,10 @@ function parseMentions(