Move library album and track operations into shared server modules
This commit is contained in:
@@ -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 };
|
||||
});
|
||||
}
|
||||
Reference in New Issue
Block a user