vkashti / app / admin / quiz / actions.ts
actions.ts
Raw
'use server';

import { createClient } from '@/utils/supabase/server';
import { revalidatePath } from 'next/cache';

export async function toggleCorrect(formData: FormData) {
  const supabase = createClient();
  const answerId = Number(formData.get('answerId'));
  const newCorrectValue = formData.get('newCorrectValue') === 'true';

  const { data: existingAnswer, error: fetchError } = await supabase
    .from('quiz_answers')
    .select('*')
    .eq('id', answerId)
    .single();

  if (fetchError || !existingAnswer) {
    console.error('Error fetching existing answer:', fetchError);
    return;
  }

  const { question_number } = existingAnswer;
  let points = 0;

  if (question_number !== null) {
    if (question_number >= 1 && question_number <= 10) {
      if (newCorrectValue) points = 1;
    } else if (question_number >= 11 && question_number <= 19) {
      if (newCorrectValue) points = 2;
    }
  }

  const { error } = await supabase
    .from('quiz_answers')
    .update({ correct: newCorrectValue, points })
    .eq('id', answerId);

  if (error) {
    console.error('Error updating correctness:', error);
    return;
  }

  revalidatePath('/quiz/answers');
}

export async function updatePoints(formData: FormData) {
  const supabase = createClient();
  
  // Get the form data with validation
  const answerId = Number(formData.get('answerId'));
  if (isNaN(answerId) || answerId <= 0) {
    console.error('Invalid answer ID');
    return { error: 'Invalid answer ID' };
  }
  
  let customPoints = Number(formData.get('customPoints'));
  if (isNaN(customPoints)) {
    customPoints = 0;
  }
  
  // Ensure points are non-negative
  customPoints = Math.max(0, customPoints);

  try {
    // First check if the answer exists
    const { data: existingAnswer, error: fetchError } = await supabase
      .from('quiz_answers')
      .select('*')
      .eq('id', answerId)
      .single();

    if (fetchError) {
      console.error('Error fetching existing answer:', fetchError);
      return { error: fetchError.message };
    }
    
    if (!existingAnswer) {
      console.error('Answer not found');
      return { error: 'Answer not found' };
    }

    // Determine correct status based on question number
    let newCorrectValue = existingAnswer.correct;
    if (
      existingAnswer.question_number !== null &&
      existingAnswer.question_number >= 20 &&
      existingAnswer.question_number <= 35
    ) {
      newCorrectValue = customPoints > 0; // Mark as correct if points are given
    }

    // Update the answer
    const { error: updateError } = await supabase
      .from('quiz_answers')
      .update({
        correct: newCorrectValue,
        points: customPoints,
      })
      .eq('id', answerId);

    if (updateError) {
      console.error('Error updating points:', updateError);
      return { error: updateError.message };
    }

    // Revalidate paths to refresh data
    revalidatePath('/quiz/answers');
    revalidatePath('/admin/quiz');
    
    return { success: true, points: customPoints };
  } catch (error) {
    console.error('Unexpected error updating points:', error);
    return { error: 'An unexpected error occurred' };
  }
}

export async function deleteAllQuizAnswers() {
  'use server';
  
  const supabase = createClient();
  
  const { error } = await supabase
    .from('quiz_answers')
    .delete()
    .neq('id', 0); // Delete all rows
    
  if (error) {
    console.error('Error deleting quiz answers:', error);
    throw new Error('Failed to delete quiz answers');
  }
  
  revalidatePath('/quiz/answers');
}