import { NextRequest, NextResponse } from 'next/server';
import { getUserEmail, getDatabase } from '@/lib/auth';
function getErrorMessage(error: any): string {
const errorMessage = error.message || 'Unknown error';
// Check for specific error patterns and return user-friendly messages
if (errorMessage.includes('credentials not configured')) {
return 'Database credentials not configured. Please visit Settings to configure your Turso database and OpenAI API credentials.';
}
if (errorMessage.includes('UNAUTHORIZED') || errorMessage.includes('401')) {
return 'Invalid database credentials. Please check your Turso auth token in Settings.';
}
if (errorMessage.includes('HTTP status 400') || errorMessage.includes('Bad Request')) {
return 'Invalid database connection. Please verify your Turso URL and auth token in Settings.';
}
if (errorMessage.includes('HTTP status 403') || errorMessage.includes('Forbidden')) {
return 'Access denied. Your Turso auth token may have expired. Please generate a new token in Settings.';
}
if (errorMessage.includes('ECONNREFUSED') || errorMessage.includes('ENOTFOUND')) {
return 'Cannot connect to database. Please check your internet connection and verify your Turso URL in Settings.';
}
if (errorMessage.includes('timeout') || errorMessage.includes('ETIMEDOUT')) {
return 'Database connection timeout. Please check your internet connection or try again later.';
}
if (errorMessage.includes('OpenAI') || errorMessage.includes('API key')) {
return 'OpenAI API error. Please verify your OpenAI API key in Settings.';
}
// Return original message if no pattern matches
return errorMessage;
}
// GET /api/memories - List memories (paginated)
export async function GET(request: NextRequest) {
try {
const userEmail = await getUserEmail();
const searchParams = request.nextUrl.searchParams;
const limit = parseInt(searchParams.get('limit') || '20');
const query = searchParams.get('query') || '';
const source = searchParams.get('source');
const week = searchParams.get('week');
const database = await getDatabase();
let memories = await database.getMemories(userEmail, { limit, query });
// Filter by metadata if parameters provided
if (source || week) {
memories = memories.filter((m: any) => {
if (source && m.metadata?.source !== source) return false;
if (week && m.metadata?.week_identifier !== week) return false;
return true;
});
}
return NextResponse.json({
success: true,
data: memories,
});
} catch (error: any) {
console.error('GET /api/memories error:', error);
const userFriendlyMessage = getErrorMessage(error);
return NextResponse.json({
success: false,
error: userFriendlyMessage
}, { status: 500 });
}
}
// POST /api/memories - Create memory
export async function POST(request: NextRequest) {
try {
const userEmail = await getUserEmail();
const body = await request.json();
const { title, content, memoryType, importance, tags, metadata } = body;
if (!title || !content) {
return NextResponse.json(
{ success: false, error: 'Title and content are required' },
{ status: 400 }
);
}
const database = await getDatabase();
const result = await database.createMemory(userEmail, {
title,
content,
memoryType: memoryType || 'MEMORY',
importance: importance !== undefined ? parseFloat(importance) : 0.5,
tags: tags || [],
metadata: metadata || {},
});
return NextResponse.json(
{
success: true,
data: result,
message: 'Memory created successfully',
},
{ status: 201 }
);
} catch (error: any) {
console.error('POST /api/memories error:', error);
const userFriendlyMessage = getErrorMessage(error);
return NextResponse.json({
success: false,
error: userFriendlyMessage
}, { status: 500 });
}
}