mirror of
https://github.com/kikootwo/ReadMeABook.git
synced 2026-06-03 04:40:09 +00:00
Add filesystem scan trigger and version badge features
Implements optional filesystem scan triggering for Plex and Audiobookshelf after file organization, with new settings in the admin UI, setup wizard, and API. Updates documentation to reflect scan trigger options and improved file organization/cleanup logic. Refactors dropdown menus to use smart positioning and portals for better UX. Adds a version API route and a VersionBadge component to display build info in the header. Updates Docker build to inject version metadata.
This commit is contained in:
@@ -12,7 +12,7 @@ export async function PUT(request: NextRequest) {
|
||||
return requireAdmin(req, async () => {
|
||||
try {
|
||||
const body = await request.json();
|
||||
const { serverUrl, apiToken, libraryId } = body;
|
||||
const { serverUrl, apiToken, libraryId, triggerScanAfterImport } = body;
|
||||
|
||||
const { getConfigService } = await import('@/lib/services/config.service');
|
||||
const configService = getConfigService();
|
||||
@@ -21,6 +21,7 @@ export async function PUT(request: NextRequest) {
|
||||
const updates: ConfigUpdate[] = [
|
||||
{ key: 'audiobookshelf.server_url', value: serverUrl || '' },
|
||||
{ key: 'audiobookshelf.library_id', value: libraryId || '' },
|
||||
{ key: 'audiobookshelf.trigger_scan_after_import', value: triggerScanAfterImport === true ? 'true' : 'false' },
|
||||
];
|
||||
|
||||
// Only update API token if it's not the masked placeholder
|
||||
|
||||
@@ -12,7 +12,7 @@ export async function PUT(request: NextRequest) {
|
||||
return requireAuth(request, async (req: AuthenticatedRequest) => {
|
||||
return requireAdmin(req, async () => {
|
||||
try {
|
||||
const { url, token, libraryId } = await request.json();
|
||||
const { url, token, libraryId, triggerScanAfterImport } = await request.json();
|
||||
|
||||
if (!url || !token || !libraryId) {
|
||||
return NextResponse.json(
|
||||
@@ -43,6 +43,13 @@ export async function PUT(request: NextRequest) {
|
||||
create: { key: 'plex_audiobook_library_id', value: libraryId },
|
||||
});
|
||||
|
||||
// Save trigger_scan_after_import setting
|
||||
await prisma.configuration.upsert({
|
||||
where: { key: 'plex.trigger_scan_after_import' },
|
||||
update: { value: triggerScanAfterImport === true ? 'true' : 'false' },
|
||||
create: { key: 'plex.trigger_scan_after_import', value: triggerScanAfterImport === true ? 'true' : 'false' },
|
||||
});
|
||||
|
||||
// Fetch and save machine identifier (for server-specific access tokens)
|
||||
// This is needed for BookDate per-user rating functionality
|
||||
try {
|
||||
|
||||
@@ -37,11 +37,13 @@ export async function GET(request: NextRequest) {
|
||||
url: configMap.get('plex_url') || '',
|
||||
token: maskValue('token', configMap.get('plex_token')),
|
||||
libraryId: configMap.get('plex_audiobook_library_id') || '',
|
||||
triggerScanAfterImport: configMap.get('plex.trigger_scan_after_import') === 'true',
|
||||
},
|
||||
audiobookshelf: {
|
||||
serverUrl: configMap.get('audiobookshelf.server_url') || '',
|
||||
apiToken: maskValue('api_token', configMap.get('audiobookshelf.api_token')),
|
||||
libraryId: configMap.get('audiobookshelf.library_id') || '',
|
||||
triggerScanAfterImport: configMap.get('audiobookshelf.trigger_scan_after_import') === 'true',
|
||||
},
|
||||
oidc: {
|
||||
enabled: configMap.get('oidc.enabled') === 'true',
|
||||
|
||||
@@ -188,6 +188,13 @@ export async function POST(request: NextRequest) {
|
||||
create: { key: 'plex_machine_identifier', value: machineIdentifier },
|
||||
});
|
||||
}
|
||||
|
||||
// Save trigger_scan_after_import setting
|
||||
await prisma.configuration.upsert({
|
||||
where: { key: 'plex.trigger_scan_after_import' },
|
||||
update: { value: plex.trigger_scan_after_import === true ? 'true' : 'false' },
|
||||
create: { key: 'plex.trigger_scan_after_import', value: plex.trigger_scan_after_import === true ? 'true' : 'false' },
|
||||
});
|
||||
} else {
|
||||
// Audiobookshelf configuration
|
||||
await prisma.configuration.upsert({
|
||||
@@ -209,6 +216,13 @@ export async function POST(request: NextRequest) {
|
||||
create: { key: 'audiobookshelf.library_id', value: audiobookshelf.library_id },
|
||||
});
|
||||
|
||||
// Save trigger_scan_after_import setting
|
||||
await prisma.configuration.upsert({
|
||||
where: { key: 'audiobookshelf.trigger_scan_after_import' },
|
||||
update: { value: audiobookshelf.trigger_scan_after_import === true ? 'true' : 'false' },
|
||||
create: { key: 'audiobookshelf.trigger_scan_after_import', value: audiobookshelf.trigger_scan_after_import === true ? 'true' : 'false' },
|
||||
});
|
||||
|
||||
// OIDC configuration (if enabled)
|
||||
if (authMethod === 'oidc' || authMethod === 'both') {
|
||||
await prisma.configuration.upsert({
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* Component: Version API Route
|
||||
* Documentation: documentation/backend/services/version.md
|
||||
*/
|
||||
|
||||
import { NextResponse } from 'next/server';
|
||||
|
||||
export async function GET() {
|
||||
const gitCommit = process.env.APP_VERSION || 'unknown';
|
||||
const buildDate = process.env.BUILD_DATE || 'unknown';
|
||||
|
||||
// Get short commit hash (first 7 characters)
|
||||
const shortCommit = gitCommit !== 'unknown' && gitCommit.length >= 7
|
||||
? gitCommit.substring(0, 7)
|
||||
: gitCommit;
|
||||
|
||||
return NextResponse.json({
|
||||
version: `v.${shortCommit}`,
|
||||
commit: gitCommit,
|
||||
shortCommit,
|
||||
buildDate,
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user