2024-05-23 13:24:21 +02:00

183 lines
6.3 KiB
TypeScript

import { Collections } from "../../../constants";
import { createGetByEndpoint } from "../../../endpoints/createGetByEndpoint";
import { EndpointCollectibleScans } from "../../../sdk";
import { Collectible } from "../../../types/collections";
import { isImage, isNotEmpty, isPayloadType, isScan } from "../../../utils/asserts";
import {
convertCreditsToEndpointCredits,
convertScanToEndpointScanImage,
convertSourceToEndpointSource,
} from "../../../utils/endpoints";
import { convertImageToEndpointImage } from "../../Images/endpoints/getByID";
export const getBySlugEndpointScans = createGetByEndpoint({
collection: Collections.Collectibles,
attribute: "slug",
suffix: "/scans",
depth: 3,
handler: (collectible): EndpointCollectibleScans => {
const { slug, thumbnail, translations, scans, scansEnabled } = collectible;
return {
slug,
translations:
translations?.map(({ language, title, description, pretitle, subtitle }) => ({
language: isPayloadType(language) ? language.id : language,
title,
...(isNotEmpty(pretitle) ? { pretitle } : {}),
...(isNotEmpty(subtitle) ? { subtitle } : {}),
...(isNotEmpty(description) ? { description } : {}),
})) ?? [],
...(isImage(thumbnail) ? { thumbnail: convertImageToEndpointImage(thumbnail) } : {}),
...(scansEnabled && scans ? handleScans(scans) : { credits: [], pages: [] }),
parentPages: convertSourceToEndpointSource({ collectibles: [collectible] }),
};
},
});
const handleScans = ({
credits,
cover,
coverEnabled,
dustjacket,
dustjacketEnabled,
obi,
obiEnabled,
pages,
}: NonNullable<Collectible["scans"]>): Pick<
EndpointCollectibleScans,
"cover" | "obi" | "dustjacket" | "pages" | "credits"
> => ({
credits: convertCreditsToEndpointCredits(credits),
pages:
pages?.flatMap(({ image, page }) =>
isScan(image) ? convertScanToEndpointScanImage(image, page.toString()) : []
) ?? [],
...(coverEnabled && cover ? { cover: handleCover(cover) } : {}),
...(dustjacketEnabled && dustjacket ? { dustjacket: handleDustjacket(dustjacket) } : {}),
...(obiEnabled && obi ? { obi: handleObi(obi) } : {}),
});
const handleCover = ({
back,
flapBack,
flapFront,
front,
insideBack,
insideFlapBack,
insideFlapFront,
insideFront,
spine,
}: NonNullable<NonNullable<Collectible["scans"]>["cover"]>): EndpointCollectibleScans["cover"] => ({
...(isScan(back) ? { back: convertScanToEndpointScanImage(back, "cover-back") } : {}),
...(isScan(flapBack)
? { flapBack: convertScanToEndpointScanImage(flapBack, "cover-flap-back") }
: {}),
...(isScan(flapFront)
? { flapFront: convertScanToEndpointScanImage(flapFront, "cover-flap-front") }
: {}),
...(isScan(front) ? { front: convertScanToEndpointScanImage(front, "cover-front") } : {}),
...(isScan(insideBack)
? { insideBack: convertScanToEndpointScanImage(insideBack, "cover-inside-back") }
: {}),
...(isScan(insideFlapBack)
? { insideFlapBack: convertScanToEndpointScanImage(insideFlapBack, "cover-inside-flap-back") }
: {}),
...(isScan(insideFlapFront)
? {
insideFlapFront: convertScanToEndpointScanImage(insideFlapFront, "cover-inside-flap-front"),
}
: {}),
...(isScan(insideFront)
? { insideFront: convertScanToEndpointScanImage(insideFront, "cover-inside-front") }
: {}),
...(isScan(spine) ? { spine: convertScanToEndpointScanImage(spine, "cover-spine") } : {}),
});
const handleDustjacket = ({
back,
flapBack,
flapFront,
front,
insideBack,
insideFlapBack,
insideFlapFront,
insideFront,
insideSpine,
spine,
}: NonNullable<
NonNullable<Collectible["scans"]>["dustjacket"]
>): EndpointCollectibleScans["dustjacket"] => ({
...(isScan(back) ? { back: convertScanToEndpointScanImage(back, "dustjacket-back") } : {}),
...(isScan(flapBack)
? { flapBack: convertScanToEndpointScanImage(flapBack, "dustjacket-flap-back") }
: {}),
...(isScan(flapFront)
? { flapFront: convertScanToEndpointScanImage(flapFront, "dustjacket-flap-front") }
: {}),
...(isScan(front) ? { front: convertScanToEndpointScanImage(front, "dustjacket-front") } : {}),
...(isScan(insideBack)
? { insideBack: convertScanToEndpointScanImage(insideBack, "dustjacket-inside-back") }
: {}),
...(isScan(insideFlapBack)
? {
insideFlapBack: convertScanToEndpointScanImage(
insideFlapBack,
"dustjacket-inside-flap-back"
),
}
: {}),
...(isScan(insideFlapFront)
? {
insideFlapFront: convertScanToEndpointScanImage(
insideFlapFront,
"dustjacket-inside-flap-front"
),
}
: {}),
...(isScan(insideFront)
? { insideFront: convertScanToEndpointScanImage(insideFront, "dustjacket-inside-front") }
: {}),
...(isScan(spine) ? { spine: convertScanToEndpointScanImage(spine, "dustjacket-spine") } : {}),
...(isScan(insideSpine)
? { insideSpine: convertScanToEndpointScanImage(insideSpine, "dustjacket-inside-spine") }
: {}),
});
const handleObi = ({
back,
flapBack,
flapFront,
front,
insideBack,
insideFlapBack,
insideFlapFront,
insideFront,
insideSpine,
spine,
}: NonNullable<NonNullable<Collectible["scans"]>["obi"]>): EndpointCollectibleScans["obi"] => ({
...(isScan(back) ? { back: convertScanToEndpointScanImage(back, "obi-back") } : {}),
...(isScan(flapBack)
? { flapBack: convertScanToEndpointScanImage(flapBack, "obi-flap-back") }
: {}),
...(isScan(flapFront)
? { flapFront: convertScanToEndpointScanImage(flapFront, "obi-flap-front") }
: {}),
...(isScan(front) ? { front: convertScanToEndpointScanImage(front, "obi-front") } : {}),
...(isScan(insideBack)
? { insideBack: convertScanToEndpointScanImage(insideBack, "obi-inside-back") }
: {}),
...(isScan(insideFlapBack)
? { insideFlapBack: convertScanToEndpointScanImage(insideFlapBack, "obi-inside-flap-back") }
: {}),
...(isScan(insideFlapFront)
? { insideFlapFront: convertScanToEndpointScanImage(insideFlapFront, "obi-inside-flap-front") }
: {}),
...(isScan(insideFront)
? { insideFront: convertScanToEndpointScanImage(insideFront, "obi-inside-front") }
: {}),
...(isScan(spine) ? { spine: convertScanToEndpointScanImage(spine, "obi-spine") } : {}),
...(isScan(insideSpine)
? { insideSpine: convertScanToEndpointScanImage(insideSpine, "obi-inside-spine") }
: {}),
});