Files
ReadMeABook/src/app/api/admin/settings/audible/route.ts
T
kikootwo 4c1d1c89e8 Audible regions: isEnglish flag + UI warnings
Add an isEnglish flag to AUDIBLE_REGIONS and update region handling across the app. UI: populate Audible region selects from AUDIBLE_REGIONS and mark non-English regions with a '*' and an amber warning explaining limited feature support. Service: set axios default param language=english on Audible requests (simplifies/fixes locale handling) and remove the previous locale-correction flow. API: validate regions dynamically from AUDIBLE_REGIONS. Also bump package version to 1.0.2. These changes make region metadata explicit and inform users about limited support for non-English regions while forcing English content where supported.
2026-02-06 11:48:00 -05:00

81 lines
2.9 KiB
TypeScript

/**
* Component: Audible Settings API
* Documentation: documentation/integrations/audible.md
*/
import { NextRequest, NextResponse } from 'next/server';
import { requireAuth, requireAdmin, AuthenticatedRequest } from '@/lib/middleware/auth';
import { getConfigService } from '@/lib/services/config.service';
import { getAudibleService } from '@/lib/integrations/audible.service';
import { getJobQueueService } from '@/lib/services/job-queue.service';
import { AUDIBLE_REGIONS } from '@/lib/types/audible';
import { RMABLogger } from '@/lib/utils/logger';
const logger = RMABLogger.create('API.Admin.Settings.Audible');
const VALID_REGIONS = Object.keys(AUDIBLE_REGIONS);
export async function PUT(request: NextRequest) {
return requireAuth(request, async (req: AuthenticatedRequest) => {
return requireAdmin(req, async () => {
try {
const { region } = await request.json();
// Validate region
if (!region || !VALID_REGIONS.includes(region)) {
logger.warn('Invalid region provided', { region });
return NextResponse.json(
{ success: false, error: `Invalid Audible region. Must be one of: ${VALID_REGIONS.join(', ')}` },
{ status: 400 }
);
}
// Save region to configuration
const configService = getConfigService();
await configService.setMany([
{
key: 'audible.region',
value: region,
category: 'system',
description: 'Audible region for metadata and search',
},
]);
// Clear config cache to ensure new region is loaded immediately
configService.clearCache('audible.region');
// Force AudibleService to re-initialize with new region
const audibleService = getAudibleService();
audibleService.forceReinitialize();
logger.info('Audible region updated, triggering data refresh', { region });
// Trigger audible_refresh job to fetch data for new region
try {
const jobQueueService = getJobQueueService();
await jobQueueService.addAudibleRefreshJob();
logger.info('Audible refresh job triggered');
} catch (jobError) {
logger.warn('Failed to trigger audible refresh job', {
error: jobError instanceof Error ? jobError.message : String(jobError),
});
// Don't fail the request if job trigger fails
}
return NextResponse.json({
success: true,
message: `Audible region set to ${region.toUpperCase()}. Data refresh job triggered.`,
});
} catch (error) {
logger.error('Failed to update Audible region', {
error: error instanceof Error ? error.message : String(error),
});
return NextResponse.json(
{ success: false, error: 'Failed to update Audible region settings' },
{ status: 500 }
);
}
});
});
}