Move library album and track operations into shared server modules

This commit is contained in:
2026-09-25 01:15:04 +02:00
parent 797bed8e7d
commit 7cac6ff446
14 changed files with 229 additions and 139 deletions
@@ -0,0 +1,56 @@
import { fail, redirect } from '@sveltejs/kit';
import { formFile, formIds, formString } from '$lib/server/forms/fields';
import { parseAlbumForm } from '$lib/server/forms/albumForm';
import { tagged } from '$lib/server/actions/tagged';
import {
ALBUMS_SECTION_URL,
createAlbum,
deleteAlbum,
syncAlbumTracks,
updateAlbum,
uploadAlbumCover
} from '$lib/server/albums';
export const saveAlbum = tagged('saveAlbum', async ({ api, form }) => {
const parsed = parseAlbumForm(form);
if ('failMessage' in parsed) return fail(400, { message: parsed.failMessage });
const existingId = formString(form, 'albumId');
const cover = await uploadAlbumCover(api, formFile(form, 'cover'));
if ('failMessage' in cover)
return fail(502, { message: cover.failMessage, detail: cover.detail });
let albumId = existingId;
if (existingId) {
const failure = await updateAlbum(api, existingId, parsed.body, cover.intentId);
if (failure) return failure;
} else {
if (!cover.intentId) return fail(400, { message: 'La portada es obligatoria.' });
const created = await createAlbum(api, parsed.body, cover.intentId);
if ('failMessage' in created) return fail(502, { message: created.failMessage });
albumId = created.id;
}
const failure = await syncAlbumTracks(
api,
albumId,
formIds(form, 'addTrackIds'),
formIds(form, 'removeTrackIds')
);
if (failure && !existingId) {
return fail(502, {
message: 'El álbum se creó, pero no se pudieron añadir las canciones. Inténtalo de nuevo.',
albumId
});
}
return failure ?? { saved: true };
});
export const removeAlbum = tagged('deleteAlbum', async ({ api, form }) => {
const albumId = formString(form, 'albumId');
if (!albumId) return fail(400, { message: 'Falta el álbum.' });
const failure = await deleteAlbum(api, albumId);
if (failure) return failure;
redirect(303, ALBUMS_SECTION_URL);
});
@@ -0,0 +1,14 @@
import { fail, isActionFailure } from '@sveltejs/kit';
import { authedAction, type ActionContext } from '$lib/server/actions/authedAction';
export function tagged<T extends object>(
action: string,
handler: (context: ActionContext) => Promise<T>
) {
return authedAction(async (context) => {
const result = await handler(context);
return isActionFailure(result)
? fail(result.status, { ...(result.data as Record<string, unknown> | undefined), action })
: { ...result, action };
});
}