// app/actions/auth.js 'use server' import { queryOne, run } from '../../lib/db'; import bcrypt from 'bcryptjs'; // Register a new user export async function registerUser(formData) { try { const username = formData.get('username'); const password = formData.get('password'); // Check if user already exists const existingUser = await queryOne( 'SELECT * FROM users WHERE username = ?', [username] ); if (existingUser) { return { success: false, error: 'Username already exists' }; } // Hash the password const hashedPassword = await bcrypt.hash(password, 10); // Insert the new user const result = await run( 'INSERT INTO users (username, password, role) VALUES (?, ?, ?)', [username, hashedPassword, 'user'] ); return { success: true, userId: result.lastID }; } catch (error) { console.error('Registration error:', error); return { success: false, error: 'Registration failed: ' + error.message }; } } // Login function (to be used with NextAuth) export async function validateCredentials(username, password) { try { const user = await queryOne( 'SELECT * FROM users WHERE username = ?', [username] ); if (!user) { return null; } const isValid = await bcrypt.compare(password, user.password); if (!isValid) { return null; } return { id: user.id, username: user.username, role: user.role }; } catch (error) { console.error('Login error:', error); return null; } } // Start hunt timer (admin only) export async function startHuntTimer(active) { try { // First check if a record exists const currentTimer = await queryOne('SELECT * FROM game_settings WHERE id = 1'); if (currentTimer) { // Update existing record await run( 'UPDATE game_settings SET hunt_active = ?, updated_at = CURRENT_TIMESTAMP WHERE id = 1', [active ? 1 : 0] ); } else { // Create new record await run( 'INSERT INTO game_settings (id, hunt_active, created_at, updated_at) VALUES (1, ?, CURRENT_TIMESTAMP, CURRENT_TIMESTAMP)', [active ? 1 : 0] ); } return { success: true }; } catch (error) { console.error('Timer update error:', error); return { success: false, error: error.message }; } } // Get hunt timer status export async function getHuntStatus() { try { const settings = await queryOne('SELECT * FROM game_settings WHERE id = 1'); return { active: settings?.hunt_active === 1, updatedAt: settings?.updated_at }; } catch (error) { console.error('Get hunt status error:', error); return { active: false }; } } // Join a team export async function joinTeam(userId, teamCode) { try { // Find the team by code const team = await queryOne('SELECT * FROM teams WHERE code = ?', [teamCode]); if (!team) { return { success: false, error: 'Team not found' }; } // Update user's team await run( 'UPDATE users SET team_id = ? WHERE id = ?', [team.id, userId] ); return { success: true, teamId: team.id, teamName: team.name }; } catch (error) { console.error('Join team error:', error); return { success: false, error: error.message }; } }