Improve type gates
This commit is contained in:
parent
a4ad2d0f21
commit
d5132e9e25
|
@ -3,7 +3,7 @@ import { Collections } from "../../../constants";
|
|||
import { EndpointAudio, PayloadMedia } from "../../../sdk";
|
||||
import { Audio } from "../../../types/collections";
|
||||
import { CollectionEndpoint } from "../../../types/payload";
|
||||
import { isNotEmpty, isValidPayloadImage, isValidPayloadMedia } from "../../../utils/asserts";
|
||||
import { isAudio, isMediaThumbnail, isNotEmpty } from "../../../utils/asserts";
|
||||
import {
|
||||
convertAttributesToEndpointAttributes,
|
||||
convertCreditsToEndpointCredits,
|
||||
|
@ -36,7 +36,7 @@ export const getByID: CollectionEndpoint = {
|
|||
id: req.params.id,
|
||||
});
|
||||
|
||||
if (!isValidPayloadMedia(result)) {
|
||||
if (!isAudio(result)) {
|
||||
return res.sendStatus(404);
|
||||
}
|
||||
|
||||
|
@ -78,7 +78,7 @@ export const convertAudioToEndpointAudio = ({
|
|||
...(isNotEmpty(description) ? { description: convertRTCToEndpointRTC(description) } : {}),
|
||||
})) ?? [],
|
||||
duration,
|
||||
...(isValidPayloadImage(thumbnail)
|
||||
...(isMediaThumbnail(thumbnail)
|
||||
? { thumbnail: convertMediaThumbnailToEndpointMediaThumbnail(thumbnail) }
|
||||
: {}),
|
||||
credits: convertCreditsToEndpointCredits(credits),
|
||||
|
|
|
@ -3,13 +3,15 @@ import { createGetByEndpoint } from "../../../endpoints/createGetByEndpoint";
|
|||
import { EndpointCollectible } from "../../../sdk";
|
||||
import { Collectible } from "../../../types/collections";
|
||||
import {
|
||||
isAudio,
|
||||
isDefined,
|
||||
isImage,
|
||||
isNotEmpty,
|
||||
isPayloadArrayType,
|
||||
isPayloadType,
|
||||
isPublished,
|
||||
isValidPayloadImage,
|
||||
isValidPayloadMedia,
|
||||
isScan,
|
||||
isVideo,
|
||||
} from "../../../utils/asserts";
|
||||
import {
|
||||
convertAttributesToEndpointAttributes,
|
||||
|
@ -67,10 +69,8 @@ export const convertCollectibleToEndpointCollectible = ({
|
|||
languages:
|
||||
languages?.map((language) => (isPayloadType(language) ? language.id : language)) ?? [],
|
||||
...(isDefined(releaseDate) ? { releaseDate } : {}),
|
||||
...(isValidPayloadImage(thumbnail)
|
||||
? { thumbnail: convertImageToEndpointImage(thumbnail) }
|
||||
: {}),
|
||||
...(isValidPayloadImage(backgroundImage)
|
||||
...(isImage(thumbnail) ? { thumbnail: convertImageToEndpointImage(thumbnail) } : {}),
|
||||
...(isImage(backgroundImage)
|
||||
? { backgroundImage: convertImageToEndpointImage(backgroundImage) }
|
||||
: {}),
|
||||
attributes: convertAttributesToEndpointAttributes(attributes),
|
||||
|
@ -143,7 +143,7 @@ const handlePageInfo = (
|
|||
|
||||
const handleGallery = (gallery: Collectible["gallery"]): EndpointCollectible["gallery"] => {
|
||||
const thumbnail = gallery?.[0]?.image;
|
||||
if (!thumbnail || !isValidPayloadImage(thumbnail)) return;
|
||||
if (!thumbnail || !isImage(thumbnail)) return;
|
||||
return { count: gallery.length, thumbnail: convertImageToEndpointImage(thumbnail) };
|
||||
};
|
||||
|
||||
|
@ -158,20 +158,21 @@ const handleScans = (scans: Collectible["scans"]): EndpointCollectible["scans"]
|
|||
|
||||
const result =
|
||||
scans?.pages?.flatMap(({ image, page }) => {
|
||||
if (!isValidPayloadImage(image)) return [];
|
||||
if (!isScan(image)) return [];
|
||||
return { image, index: page.toString() };
|
||||
}) ?? [];
|
||||
|
||||
if (isValidPayloadImage(scans?.cover?.front)) {
|
||||
if (isScan(scans?.cover?.front)) {
|
||||
result.push({ image: scans.cover.front, index: "cover-front" });
|
||||
}
|
||||
|
||||
if (isValidPayloadImage(scans?.dustjacket?.front)) {
|
||||
if (isScan(scans?.dustjacket?.front)) {
|
||||
result.push({ image: scans.dustjacket.front, index: "dustjacket-front" });
|
||||
}
|
||||
|
||||
const thumbnail = result?.[0];
|
||||
if (!thumbnail || !isValidPayloadImage(thumbnail.image)) return;
|
||||
if (!thumbnail) return;
|
||||
|
||||
return {
|
||||
count: totalCount,
|
||||
thumbnail: convertScanToEndpointScanImage(thumbnail.image, thumbnail.index),
|
||||
|
@ -233,12 +234,12 @@ const handleContents = (contents: Collectible["contents"]): EndpointCollectible[
|
|||
: undefined;
|
||||
|
||||
case Collections.Audios:
|
||||
return isPayloadType(content.value) && isValidPayloadMedia(content.value)
|
||||
return isAudio(content.value)
|
||||
? { relationTo: Collections.Audios, value: convertAudioToEndpointAudio(content.value) }
|
||||
: undefined;
|
||||
|
||||
case Collections.Videos:
|
||||
return isPayloadType(content.value) && isValidPayloadMedia(content.value)
|
||||
return isVideo(content.value)
|
||||
? { relationTo: Collections.Videos, value: convertVideoToEndpointVideo(content.value) }
|
||||
: undefined;
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
import { Collections } from "../../../constants";
|
||||
import { createGetByEndpoint } from "../../../endpoints/createGetByEndpoint";
|
||||
import { EndpointCollectibleGallery } from "../../../sdk";
|
||||
import { isNotEmpty, isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isImage, isNotEmpty, isPayloadType } from "../../../utils/asserts";
|
||||
import { convertSourceToEndpointSource } from "../../../utils/endpoints";
|
||||
import { convertImageToEndpointImage } from "../../Images/endpoints/getByID";
|
||||
|
||||
|
@ -22,12 +22,10 @@ export const getBySlugEndpointGallery = createGetByEndpoint({
|
|||
...(isNotEmpty(subtitle) ? { subtitle } : {}),
|
||||
...(isNotEmpty(description) ? { description } : {}),
|
||||
})) ?? [],
|
||||
...(isValidPayloadImage(thumbnail)
|
||||
? { thumbnail: convertImageToEndpointImage(thumbnail) }
|
||||
: {}),
|
||||
...(isImage(thumbnail) ? { thumbnail: convertImageToEndpointImage(thumbnail) } : {}),
|
||||
images:
|
||||
gallery?.flatMap(({ image }) =>
|
||||
isValidPayloadImage(image) ? convertImageToEndpointImage(image) : []
|
||||
isImage(image) ? convertImageToEndpointImage(image) : []
|
||||
) ?? [],
|
||||
parentPages: convertSourceToEndpointSource({ collectibles: [collectible] }),
|
||||
};
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Collections } from "../../../constants";
|
|||
import { EndpointCollectibleGalleryImage } from "../../../sdk";
|
||||
import { Collectible, Image } from "../../../types/collections";
|
||||
import { CollectionEndpoint } from "../../../types/payload";
|
||||
import { isDefined, isNotEmpty, isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isDefined, isImage, isNotEmpty, isPayloadType } from "../../../utils/asserts";
|
||||
import { convertSourceToEndpointSource } from "../../../utils/endpoints";
|
||||
import { convertImageToEndpointImage } from "../../Images/endpoints/getByID";
|
||||
|
||||
|
@ -43,7 +43,7 @@ export const getBySlugEndpointGalleryImage: CollectionEndpoint = {
|
|||
|
||||
const image = getImageFromIndex(index, collectible.gallery);
|
||||
|
||||
if (!image || !isValidPayloadImage(image)) {
|
||||
if (!isImage(image)) {
|
||||
return res.sendStatus(404);
|
||||
}
|
||||
|
||||
|
@ -54,7 +54,7 @@ export const getBySlugEndpointGalleryImage: CollectionEndpoint = {
|
|||
image: convertImageToEndpointImage(image),
|
||||
parentPages: convertSourceToEndpointSource({ gallery: [collectible] }),
|
||||
slug,
|
||||
...(isValidPayloadImage(collectible.thumbnail)
|
||||
...(isImage(collectible.thumbnail)
|
||||
? { thumbnail: convertImageToEndpointImage(collectible.thumbnail) }
|
||||
: {}),
|
||||
translations:
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Collections } from "../../../constants";
|
|||
import { EndpointCollectibleScanPage } from "../../../sdk";
|
||||
import { Collectible, Scan } from "../../../types/collections";
|
||||
import { CollectionEndpoint } from "../../../types/payload";
|
||||
import { isDefined, isNotEmpty, isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isDefined, isImage, isNotEmpty, isPayloadType, isScan } from "../../../utils/asserts";
|
||||
import {
|
||||
convertScanToEndpointScanImage,
|
||||
convertSourceToEndpointSource,
|
||||
|
@ -44,9 +44,9 @@ export const getBySlugEndpointScanPage: CollectionEndpoint = {
|
|||
return res.sendStatus(404);
|
||||
}
|
||||
|
||||
const image = getImageFromIndex(index, collectible.scans);
|
||||
const scan = getScanFromIndex(index, collectible.scans);
|
||||
|
||||
if (!image || !isValidPayloadImage(image)) {
|
||||
if (!isScan(scan)) {
|
||||
return res.sendStatus(404);
|
||||
}
|
||||
|
||||
|
@ -54,10 +54,10 @@ export const getBySlugEndpointScanPage: CollectionEndpoint = {
|
|||
const nextIndex = getNextIndex(index, collectible.scans);
|
||||
|
||||
const scanPage: EndpointCollectibleScanPage = {
|
||||
image: convertScanToEndpointScanImage(image, index),
|
||||
image: convertScanToEndpointScanImage(scan, index),
|
||||
parentPages: convertSourceToEndpointSource({ scans: [collectible] }),
|
||||
slug,
|
||||
...(isValidPayloadImage(collectible.thumbnail)
|
||||
...(isImage(collectible.thumbnail)
|
||||
? { thumbnail: convertImageToEndpointImage(collectible.thumbnail) }
|
||||
: {}),
|
||||
translations:
|
||||
|
@ -102,7 +102,7 @@ const getNextIndex = (
|
|||
return page.page.toString();
|
||||
};
|
||||
|
||||
const getImageFromIndex = (
|
||||
const getScanFromIndex = (
|
||||
index: string,
|
||||
scans: NonNullable<Collectible["scans"]>
|
||||
): string | Scan | null | undefined => {
|
||||
|
|
|
@ -2,7 +2,7 @@ import { Collections } from "../../../constants";
|
|||
import { createGetByEndpoint } from "../../../endpoints/createGetByEndpoint";
|
||||
import { EndpointCollectibleScans } from "../../../sdk";
|
||||
import { Collectible } from "../../../types/collections";
|
||||
import { isNotEmpty, isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isImage, isNotEmpty, isPayloadType, isScan } from "../../../utils/asserts";
|
||||
import {
|
||||
convertCreditsToEndpointCredits,
|
||||
convertScanToEndpointScanImage,
|
||||
|
@ -27,9 +27,7 @@ export const getBySlugEndpointScans = createGetByEndpoint({
|
|||
...(isNotEmpty(subtitle) ? { subtitle } : {}),
|
||||
...(isNotEmpty(description) ? { description } : {}),
|
||||
})) ?? [],
|
||||
...(isValidPayloadImage(thumbnail)
|
||||
? { thumbnail: convertImageToEndpointImage(thumbnail) }
|
||||
: {}),
|
||||
...(isImage(thumbnail) ? { thumbnail: convertImageToEndpointImage(thumbnail) } : {}),
|
||||
...(scansEnabled && scans ? handleScans(scans) : { credits: [], pages: [] }),
|
||||
parentPages: convertSourceToEndpointSource({ collectibles: [collectible] }),
|
||||
};
|
||||
|
@ -52,7 +50,7 @@ const handleScans = ({
|
|||
credits: convertCreditsToEndpointCredits(credits),
|
||||
pages:
|
||||
pages?.flatMap(({ image, page }) =>
|
||||
isValidPayloadImage(image) ? convertScanToEndpointScanImage(image, page.toString()) : []
|
||||
isScan(image) ? convertScanToEndpointScanImage(image, page.toString()) : []
|
||||
) ?? [],
|
||||
...(coverEnabled && cover ? { cover: handleCover(cover) } : {}),
|
||||
...(dustjacketEnabled && dustjacket ? { dustjacket: handleDustjacket(dustjacket) } : {}),
|
||||
|
@ -70,35 +68,29 @@ const handleCover = ({
|
|||
insideFront,
|
||||
spine,
|
||||
}: NonNullable<NonNullable<Collectible["scans"]>["cover"]>): EndpointCollectibleScans["cover"] => ({
|
||||
...(isValidPayloadImage(back)
|
||||
? { back: convertScanToEndpointScanImage(back, "cover-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(flapBack)
|
||||
...(isScan(back) ? { back: convertScanToEndpointScanImage(back, "cover-back") } : {}),
|
||||
...(isScan(flapBack)
|
||||
? { flapBack: convertScanToEndpointScanImage(flapBack, "cover-flap-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(flapFront)
|
||||
...(isScan(flapFront)
|
||||
? { flapFront: convertScanToEndpointScanImage(flapFront, "cover-flap-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(front)
|
||||
? { front: convertScanToEndpointScanImage(front, "cover-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideBack)
|
||||
...(isScan(front) ? { front: convertScanToEndpointScanImage(front, "cover-front") } : {}),
|
||||
...(isScan(insideBack)
|
||||
? { insideBack: convertScanToEndpointScanImage(insideBack, "cover-inside-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFlapBack)
|
||||
...(isScan(insideFlapBack)
|
||||
? { insideFlapBack: convertScanToEndpointScanImage(insideFlapBack, "cover-inside-flap-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFlapFront)
|
||||
...(isScan(insideFlapFront)
|
||||
? {
|
||||
insideFlapFront: convertScanToEndpointScanImage(insideFlapFront, "cover-inside-flap-front"),
|
||||
}
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFront)
|
||||
...(isScan(insideFront)
|
||||
? { insideFront: convertScanToEndpointScanImage(insideFront, "cover-inside-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(spine)
|
||||
? { spine: convertScanToEndpointScanImage(spine, "cover-spine") }
|
||||
: {}),
|
||||
...(isScan(spine) ? { spine: convertScanToEndpointScanImage(spine, "cover-spine") } : {}),
|
||||
});
|
||||
|
||||
const handleDustjacket = ({
|
||||
|
@ -115,22 +107,18 @@ const handleDustjacket = ({
|
|||
}: NonNullable<
|
||||
NonNullable<Collectible["scans"]>["dustjacket"]
|
||||
>): EndpointCollectibleScans["dustjacket"] => ({
|
||||
...(isValidPayloadImage(back)
|
||||
? { back: convertScanToEndpointScanImage(back, "dustjacket-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(flapBack)
|
||||
...(isScan(back) ? { back: convertScanToEndpointScanImage(back, "dustjacket-back") } : {}),
|
||||
...(isScan(flapBack)
|
||||
? { flapBack: convertScanToEndpointScanImage(flapBack, "dustjacket-flap-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(flapFront)
|
||||
...(isScan(flapFront)
|
||||
? { flapFront: convertScanToEndpointScanImage(flapFront, "dustjacket-flap-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(front)
|
||||
? { front: convertScanToEndpointScanImage(front, "dustjacket-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideBack)
|
||||
...(isScan(front) ? { front: convertScanToEndpointScanImage(front, "dustjacket-front") } : {}),
|
||||
...(isScan(insideBack)
|
||||
? { insideBack: convertScanToEndpointScanImage(insideBack, "dustjacket-inside-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFlapBack)
|
||||
...(isScan(insideFlapBack)
|
||||
? {
|
||||
insideFlapBack: convertScanToEndpointScanImage(
|
||||
insideFlapBack,
|
||||
|
@ -138,7 +126,7 @@ const handleDustjacket = ({
|
|||
),
|
||||
}
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFlapFront)
|
||||
...(isScan(insideFlapFront)
|
||||
? {
|
||||
insideFlapFront: convertScanToEndpointScanImage(
|
||||
insideFlapFront,
|
||||
|
@ -146,13 +134,11 @@ const handleDustjacket = ({
|
|||
),
|
||||
}
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFront)
|
||||
...(isScan(insideFront)
|
||||
? { insideFront: convertScanToEndpointScanImage(insideFront, "dustjacket-inside-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(spine)
|
||||
? { spine: convertScanToEndpointScanImage(spine, "dustjacket-spine") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideSpine)
|
||||
...(isScan(spine) ? { spine: convertScanToEndpointScanImage(spine, "dustjacket-spine") } : {}),
|
||||
...(isScan(insideSpine)
|
||||
? { insideSpine: convertScanToEndpointScanImage(insideSpine, "dustjacket-inside-spine") }
|
||||
: {}),
|
||||
});
|
||||
|
@ -169,32 +155,28 @@ const handleObi = ({
|
|||
insideSpine,
|
||||
spine,
|
||||
}: NonNullable<NonNullable<Collectible["scans"]>["obi"]>): EndpointCollectibleScans["obi"] => ({
|
||||
...(isValidPayloadImage(back) ? { back: convertScanToEndpointScanImage(back, "obi-back") } : {}),
|
||||
...(isValidPayloadImage(flapBack)
|
||||
...(isScan(back) ? { back: convertScanToEndpointScanImage(back, "obi-back") } : {}),
|
||||
...(isScan(flapBack)
|
||||
? { flapBack: convertScanToEndpointScanImage(flapBack, "obi-flap-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(flapFront)
|
||||
...(isScan(flapFront)
|
||||
? { flapFront: convertScanToEndpointScanImage(flapFront, "obi-flap-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(front)
|
||||
? { front: convertScanToEndpointScanImage(front, "obi-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideBack)
|
||||
...(isScan(front) ? { front: convertScanToEndpointScanImage(front, "obi-front") } : {}),
|
||||
...(isScan(insideBack)
|
||||
? { insideBack: convertScanToEndpointScanImage(insideBack, "obi-inside-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFlapBack)
|
||||
...(isScan(insideFlapBack)
|
||||
? { insideFlapBack: convertScanToEndpointScanImage(insideFlapBack, "obi-inside-flap-back") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFlapFront)
|
||||
...(isScan(insideFlapFront)
|
||||
? { insideFlapFront: convertScanToEndpointScanImage(insideFlapFront, "obi-inside-flap-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideFront)
|
||||
...(isScan(insideFront)
|
||||
? { insideFront: convertScanToEndpointScanImage(insideFront, "obi-inside-front") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(spine)
|
||||
? { spine: convertScanToEndpointScanImage(spine, "obi-spine") }
|
||||
: {}),
|
||||
...(isValidPayloadImage(insideSpine)
|
||||
...(isScan(spine) ? { spine: convertScanToEndpointScanImage(spine, "obi-spine") } : {}),
|
||||
...(isScan(insideSpine)
|
||||
? { insideSpine: convertScanToEndpointScanImage(insideSpine, "obi-inside-spine") }
|
||||
: {}),
|
||||
});
|
||||
|
|
|
@ -3,12 +3,13 @@ import { createGetByEndpoint } from "../../../endpoints/createGetByEndpoint";
|
|||
import { EndpointFolder } from "../../../sdk";
|
||||
import { Folder, Language } from "../../../types/collections";
|
||||
import {
|
||||
isAudio,
|
||||
isDefined,
|
||||
isImage,
|
||||
isNotEmpty,
|
||||
isPayloadType,
|
||||
isPublished,
|
||||
isValidPayloadImage,
|
||||
isValidPayloadMedia,
|
||||
isVideo,
|
||||
} from "../../../utils/asserts";
|
||||
import { convertSourceToEndpointSource, getLanguageId } from "../../../utils/endpoints";
|
||||
import { convertAudioToEndpointAudio } from "../../Audios/endpoints/getByID";
|
||||
|
@ -76,13 +77,13 @@ export const convertFolderToEndpointFolder = ({
|
|||
return [{ relationTo: Collections.Pages, value: convertPageToEndpointPage(value) }];
|
||||
// TODO: handle media type files
|
||||
case Collections.Images:
|
||||
if (!isValidPayloadImage(value)) return [];
|
||||
if (!isImage(value)) return [];
|
||||
return [{ relationTo: Collections.Images, value: convertImageToEndpointImage(value) }];
|
||||
case Collections.Audios:
|
||||
if (!isValidPayloadMedia(value)) return [];
|
||||
if (!isAudio(value)) return [];
|
||||
return [{ relationTo: Collections.Audios, value: convertAudioToEndpointAudio(value) }];
|
||||
case Collections.Videos:
|
||||
if (!isValidPayloadMedia(value)) return [];
|
||||
if (!isVideo(value)) return [];
|
||||
return [{ relationTo: Collections.Videos, value: convertVideoToEndpointVideo(value) }];
|
||||
default:
|
||||
return [];
|
||||
|
|
|
@ -3,12 +3,12 @@ import { Collections } from "../../../constants";
|
|||
import { EndpointImage, PayloadImage } from "../../../sdk";
|
||||
import { Image } from "../../../types/collections";
|
||||
import { CollectionEndpoint } from "../../../types/payload";
|
||||
import { isNotEmpty, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isImage, isNotEmpty, isPayloadImage } from "../../../utils/asserts";
|
||||
import {
|
||||
convertAttributesToEndpointAttributes,
|
||||
convertCreditsToEndpointCredits,
|
||||
convertRTCToEndpointRTC,
|
||||
convertSizesToEndpointImageSize,
|
||||
convertSizesToPayloadImages,
|
||||
getLanguageId,
|
||||
} from "../../../utils/endpoints";
|
||||
|
||||
|
@ -36,7 +36,7 @@ export const getByID: CollectionEndpoint = {
|
|||
id: req.params.id,
|
||||
});
|
||||
|
||||
if (!isValidPayloadImage(result)) {
|
||||
if (!isImage(result)) {
|
||||
return res.sendStatus(404);
|
||||
}
|
||||
|
||||
|
@ -81,7 +81,7 @@ export const convertImageToEndpointImage = ({
|
|||
...(isNotEmpty(description) ? { description: convertRTCToEndpointRTC(description) } : {}),
|
||||
})) ?? [],
|
||||
credits: convertCreditsToEndpointCredits(credits),
|
||||
sizes: convertSizesToEndpointImageSize(
|
||||
sizes: convertSizesToPayloadImages(
|
||||
[
|
||||
sizes?.["200w"],
|
||||
sizes?.["320w"],
|
||||
|
|
|
@ -9,7 +9,7 @@ import {
|
|||
import { createGetByEndpoint } from "../../../endpoints/createGetByEndpoint";
|
||||
import { EndpointPage, TableOfContentEntry } from "../../../sdk";
|
||||
import { Page } from "../../../types/collections";
|
||||
import { isNotEmpty, isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isImage, isNotEmpty, isPayloadType } from "../../../utils/asserts";
|
||||
import {
|
||||
convertAttributesToEndpointAttributes,
|
||||
convertCreditsToEndpointCredits,
|
||||
|
@ -38,8 +38,8 @@ export const convertPageToEndpointPage = ({
|
|||
updatedBy,
|
||||
}: Page): EndpointPage => ({
|
||||
slug,
|
||||
...(isValidPayloadImage(thumbnail) ? { thumbnail: convertImageToEndpointImage(thumbnail) } : {}),
|
||||
...(isValidPayloadImage(backgroundImage)
|
||||
...(isImage(thumbnail) ? { thumbnail: convertImageToEndpointImage(thumbnail) } : {}),
|
||||
...(isImage(backgroundImage)
|
||||
? { backgroundImage: convertImageToEndpointImage(backgroundImage) }
|
||||
: {}),
|
||||
attributes: convertAttributesToEndpointAttributes(attributes),
|
||||
|
|
|
@ -3,7 +3,7 @@ import { Collections } from "../../../constants";
|
|||
import { EndpointRecorder } from "../../../sdk";
|
||||
import { Recorder } from "../../../types/collections";
|
||||
import { CollectionEndpoint } from "../../../types/payload";
|
||||
import { isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isImage, isPayloadType } from "../../../utils/asserts";
|
||||
import { convertRTCToEndpointRTC } from "../../../utils/endpoints";
|
||||
import { convertImageToEndpointImage } from "../../Images/endpoints/getByID";
|
||||
|
||||
|
@ -49,7 +49,7 @@ export const convertRecorderToEndpointRecorder = ({
|
|||
id,
|
||||
languages: languages?.map((language) => (isPayloadType(language) ? language.id : language)) ?? [],
|
||||
username: anonymize ? `Recorder#${id.substring(0, 5)}` : username,
|
||||
...(isValidPayloadImage(avatar) ? { avatar: convertImageToEndpointImage(avatar) } : {}),
|
||||
...(isImage(avatar) ? { avatar: convertImageToEndpointImage(avatar) } : {}),
|
||||
translations:
|
||||
translations?.map(({ language, biography }) => ({
|
||||
language: isPayloadType(language) ? language.id : language,
|
||||
|
|
|
@ -6,11 +6,11 @@ import { CollectionEndpoint } from "../../../types/payload";
|
|||
import {
|
||||
isDefined,
|
||||
isEmpty,
|
||||
isMediaThumbnail,
|
||||
isNotEmpty,
|
||||
isPayloadType,
|
||||
isUndefined,
|
||||
isValidPayloadImage,
|
||||
isValidPayloadMedia,
|
||||
isVideo,
|
||||
} from "../../../utils/asserts";
|
||||
import {
|
||||
convertAttributesToEndpointAttributes,
|
||||
|
@ -44,7 +44,7 @@ export const getByID: CollectionEndpoint = {
|
|||
id: req.params.id,
|
||||
});
|
||||
|
||||
if (!isValidPayloadMedia(result)) {
|
||||
if (!isVideo(result)) {
|
||||
return res.sendStatus(404);
|
||||
}
|
||||
|
||||
|
@ -89,7 +89,7 @@ export const convertVideoToEndpointVideo = ({
|
|||
})) ?? [],
|
||||
|
||||
duration,
|
||||
...(isValidPayloadImage(thumbnail)
|
||||
...(isMediaThumbnail(thumbnail)
|
||||
? { thumbnail: convertMediaThumbnailToEndpointMediaThumbnail(thumbnail) }
|
||||
: {}),
|
||||
...(platformEnabled && isDefined(platform) && isPayloadType(platform.channel)
|
||||
|
|
|
@ -2,7 +2,7 @@ import payload from "payload";
|
|||
import { Collections } from "../../../constants";
|
||||
import { EndpointWebsiteConfig } from "../../../sdk";
|
||||
import { CollectionEndpoint } from "../../../types/payload";
|
||||
import { isPayloadType, isValidPayloadImage } from "../../../utils/asserts";
|
||||
import { isImage, isPayloadType } from "../../../utils/asserts";
|
||||
import { convertFolderToEndpointFolder } from "../../Folders/endpoints/getBySlugEndpoint";
|
||||
import { convertImageToEndpointImage } from "../../Images/endpoints/getByID";
|
||||
|
||||
|
@ -50,7 +50,7 @@ export const getConfigEndpoint: CollectionEndpoint = {
|
|||
|
||||
const endpointWebsiteConfig: EndpointWebsiteConfig = {
|
||||
home: {
|
||||
...(isValidPayloadImage(homeBackgroundImage)
|
||||
...(isImage(homeBackgroundImage)
|
||||
? { backgroundImage: convertImageToEndpointImage(homeBackgroundImage) }
|
||||
: {}),
|
||||
folders:
|
||||
|
@ -58,17 +58,17 @@ export const getConfigEndpoint: CollectionEndpoint = {
|
|||
if (!isPayloadType(folder)) return [];
|
||||
return {
|
||||
...convertFolderToEndpointFolder(folder),
|
||||
...(isValidPayloadImage(darkThumbnail)
|
||||
...(isImage(darkThumbnail)
|
||||
? { darkThumbnail: convertImageToEndpointImage(darkThumbnail) }
|
||||
: {}),
|
||||
...(isValidPayloadImage(lightThumbnail)
|
||||
...(isImage(lightThumbnail)
|
||||
? { lightThumbnail: convertImageToEndpointImage(lightThumbnail) }
|
||||
: {}),
|
||||
};
|
||||
}) ?? [],
|
||||
},
|
||||
timeline: {
|
||||
...(isValidPayloadImage(timelineBackgroundImage)
|
||||
...(isImage(timelineBackgroundImage)
|
||||
? { backgroundImage: convertImageToEndpointImage(timelineBackgroundImage) }
|
||||
: {}),
|
||||
breaks: timeline?.breaks ?? [],
|
||||
|
@ -83,7 +83,7 @@ export const getConfigEndpoint: CollectionEndpoint = {
|
|||
};
|
||||
}) ?? [],
|
||||
},
|
||||
...(isValidPayloadImage(defaultOpenGraphImage)
|
||||
...(isImage(defaultOpenGraphImage)
|
||||
? { defaultOpenGraphImage: convertImageToEndpointImage(defaultOpenGraphImage) }
|
||||
: {}),
|
||||
};
|
||||
|
|
13
src/sdk.ts
13
src/sdk.ts
|
@ -346,7 +346,7 @@ export type EndpointCollectibleScanPage = {
|
|||
|
||||
export type EndpointScanImage = PayloadImage & {
|
||||
index: string;
|
||||
sizes: EndpointImageSize[];
|
||||
sizes: PayloadImage[];
|
||||
};
|
||||
|
||||
export type TableOfContentEntry = {
|
||||
|
@ -411,17 +411,10 @@ export type EndpointMedia = {
|
|||
credits: EndpointCredit[];
|
||||
};
|
||||
|
||||
export type EndpointImageSize = {
|
||||
width: number;
|
||||
height: number;
|
||||
url: string;
|
||||
wSize: number;
|
||||
};
|
||||
|
||||
export type EndpointImage = EndpointMedia & {
|
||||
width: number;
|
||||
height: number;
|
||||
sizes: EndpointImageSize[];
|
||||
sizes: PayloadImage[];
|
||||
};
|
||||
|
||||
export type EndpointAudio = EndpointMedia & {
|
||||
|
@ -451,7 +444,7 @@ export type EndpointVideo = EndpointMedia & {
|
|||
};
|
||||
|
||||
export type EndpointMediaThumbnail = PayloadImage & {
|
||||
sizes: EndpointImageSize[];
|
||||
sizes: PayloadImage[];
|
||||
};
|
||||
|
||||
export type PayloadMedia = {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
import { RichTextContent, isNodeParagraphNode } from "../constants";
|
||||
import { PayloadImage, PayloadMedia } from "../sdk";
|
||||
import { Image } from "../types/collections";
|
||||
import { Audio, Image, MediaThumbnail, Scan, Video } from "../types/collections";
|
||||
|
||||
export const isDefined = <T>(value: T | null | undefined): value is T =>
|
||||
value !== null && value !== undefined;
|
||||
|
@ -24,32 +24,6 @@ const isEmptyRichText = (value: RichTextContent) =>
|
|||
|
||||
export const hasDuplicates = <T>(list: T[]): boolean => list.length !== new Set(list).size;
|
||||
|
||||
export const isValidPayloadImage = (
|
||||
image: string | Image | null | undefined
|
||||
): image is Image & PayloadImage => {
|
||||
if (typeof image === "string") return false;
|
||||
if (!isValidPayloadMedia(image)) return false;
|
||||
if (isUndefined(image.width)) return false;
|
||||
if (isUndefined(image.height)) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
export const isValidPayloadMedia = (
|
||||
media:
|
||||
| Partial<{ [K in keyof PayloadMedia]: null | undefined | PayloadMedia[K] }>
|
||||
| undefined
|
||||
| null
|
||||
| string
|
||||
): media is PayloadMedia => {
|
||||
if (isUndefined(media)) return false;
|
||||
if (typeof media === "string") return false;
|
||||
if (isEmpty(media.filename)) return false;
|
||||
if (isEmpty(media.url)) return false;
|
||||
if (isEmpty(media.mimeType)) return false;
|
||||
if (isUndefined(media.filesize)) return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
export const isPayloadType = <T extends Object>(value: string | T): value is T =>
|
||||
typeof value === "object";
|
||||
|
||||
|
@ -61,31 +35,35 @@ export const isPublished = <T extends { _status?: ("draft" | "published") | null
|
|||
object: T
|
||||
): boolean => object._status === "published";
|
||||
|
||||
export type ImageSize = {
|
||||
url?: string | null;
|
||||
width?: number | null;
|
||||
height?: number | null;
|
||||
mimeType?: string | null;
|
||||
filesize?: number | null;
|
||||
filename?: string | null;
|
||||
};
|
||||
export const isImage = (image: string | Image | null | undefined): image is PayloadImage & Image =>
|
||||
isPayloadImage(image);
|
||||
|
||||
export type ValidImageSize = {
|
||||
url: string;
|
||||
width: number;
|
||||
height: number;
|
||||
mimeType: string;
|
||||
filesize: number;
|
||||
filename: string;
|
||||
};
|
||||
export const isScan = (image: string | Scan | null | undefined): image is PayloadImage & Scan =>
|
||||
isPayloadImage(image);
|
||||
|
||||
export const isValidImageSize = (size: ImageSize | undefined): size is ValidImageSize => {
|
||||
if (isUndefined(size)) return false;
|
||||
if (isUndefined(size.url)) return false;
|
||||
if (isUndefined(size.width)) return false;
|
||||
if (isUndefined(size.height)) return false;
|
||||
if (isUndefined(size.mimeType)) return false;
|
||||
if (isUndefined(size.filesize)) return false;
|
||||
if (isUndefined(size.filename)) return false;
|
||||
export const isMediaThumbnail = (
|
||||
image: string | MediaThumbnail | null | undefined
|
||||
): image is PayloadImage & MediaThumbnail => isPayloadImage(image);
|
||||
|
||||
export const isPayloadImage = (image: unknown): image is PayloadImage => {
|
||||
if (!isPayloadMedia(image)) return false;
|
||||
if (!("width" in image) || typeof image.width !== "number") return false;
|
||||
if (!("height" in image) || typeof image.height !== "number") return false;
|
||||
return true;
|
||||
};
|
||||
|
||||
export const isVideo = (video: string | Video | null | undefined): video is PayloadMedia & Video =>
|
||||
isPayloadMedia(video);
|
||||
|
||||
export const isAudio = (video: string | Audio | null | undefined): video is PayloadMedia & Audio =>
|
||||
isPayloadMedia(video);
|
||||
|
||||
const isPayloadMedia = (media: unknown): media is PayloadMedia => {
|
||||
if (typeof media !== "object") return false;
|
||||
if (isUndefined(media)) return false;
|
||||
if (!("url" in media) || typeof media.url !== "string") return false;
|
||||
if (!("mimeType" in media) || typeof media.mimeType !== "string") return false;
|
||||
if (!("filename" in media) || typeof media.filename !== "string") return false;
|
||||
if (!("filesize" in media) || typeof media.filesize !== "number") return false;
|
||||
return true;
|
||||
};
|
||||
|
|
|
@ -22,7 +22,6 @@ import {
|
|||
import {
|
||||
EndpointAttribute,
|
||||
EndpointCredit,
|
||||
EndpointImageSize,
|
||||
EndpointMediaThumbnail,
|
||||
EndpointRole,
|
||||
EndpointScanImage,
|
||||
|
@ -47,16 +46,15 @@ import {
|
|||
Video,
|
||||
} from "../types/collections";
|
||||
import {
|
||||
ImageSize,
|
||||
ValidImageSize,
|
||||
isAudio,
|
||||
isDefined,
|
||||
isEmpty,
|
||||
isImage,
|
||||
isPayloadArrayType,
|
||||
isPayloadImage,
|
||||
isPayloadType,
|
||||
isPublished,
|
||||
isValidImageSize,
|
||||
isValidPayloadImage,
|
||||
isValidPayloadMedia,
|
||||
isVideo,
|
||||
} from "./asserts";
|
||||
|
||||
const convertTagToEndpointTag = ({ slug, page, translations }: Tag): EndpointTag => ({
|
||||
|
@ -109,21 +107,21 @@ export const convertRTCToEndpointRTC = (
|
|||
};
|
||||
if (isUploadNodeImageNode(node)) {
|
||||
const value = node.value as unknown as Image | string;
|
||||
if (!isPayloadType(value) || !isValidPayloadImage(value)) return errorUploadNode;
|
||||
if (!isImage(value)) return errorUploadNode;
|
||||
return {
|
||||
...node,
|
||||
value: convertImageToEndpointImage(value),
|
||||
};
|
||||
} else if (isUploadNodeAudioNode(node)) {
|
||||
const value = node.value as unknown as Audio | string;
|
||||
if (!isPayloadType(value) || !isValidPayloadMedia(value)) return errorUploadNode;
|
||||
if (!isAudio(value)) return errorUploadNode;
|
||||
return {
|
||||
...node,
|
||||
value: convertAudioToEndpointAudio(value),
|
||||
};
|
||||
} else if (isUploadNodeVideoNode(node)) {
|
||||
const value = node.value as unknown as Video | string;
|
||||
if (!isPayloadType(value) || !isValidPayloadMedia(value)) return errorUploadNode;
|
||||
if (!isVideo(value)) return errorUploadNode;
|
||||
return {
|
||||
...node,
|
||||
value: convertVideoToEndpointVideo(value),
|
||||
|
@ -282,14 +280,16 @@ const convertAttributeToEndpointAttribute = (
|
|||
}
|
||||
};
|
||||
|
||||
export const convertSizesToEndpointImageSize = (
|
||||
sizes: (ImageSize | undefined)[],
|
||||
targetSizes: number[]
|
||||
): EndpointImageSize[] => {
|
||||
if (!sizes) return [];
|
||||
const processedSizes = sizes.filter(isValidImageSize);
|
||||
type Nullable<T> = { [P in keyof T]?: T[P] | undefined | null };
|
||||
|
||||
const targetBins: { min: number; target: number; max: number; image: ValidImageSize }[] = [];
|
||||
export const convertSizesToPayloadImages = (
|
||||
sizes: (Nullable<PayloadImage> | undefined)[],
|
||||
targetSizes: number[]
|
||||
): PayloadImage[] => {
|
||||
if (!sizes) return [];
|
||||
const processedSizes = sizes.filter(isPayloadImage);
|
||||
|
||||
const images: PayloadImage[] = [];
|
||||
for (let index = 0; index < targetSizes.length; index++) {
|
||||
const previous = targetSizes[index - 1];
|
||||
const current = targetSizes[index]!;
|
||||
|
@ -305,15 +305,10 @@ export const convertSizesToEndpointImageSize = (
|
|||
const smallestImage = images[0];
|
||||
if (!smallestImage) continue;
|
||||
|
||||
targetBins.push({ min, target: current, max, image: smallestImage });
|
||||
images.push(smallestImage);
|
||||
}
|
||||
|
||||
return targetBins.map(({ target, image: { height, width, url } }) => ({
|
||||
width,
|
||||
height,
|
||||
url,
|
||||
wSize: target,
|
||||
}));
|
||||
return images;
|
||||
};
|
||||
|
||||
export const convertScanToEndpointScanImage = (
|
||||
|
@ -327,7 +322,7 @@ export const convertScanToEndpointScanImage = (
|
|||
filename,
|
||||
filesize,
|
||||
mimeType,
|
||||
sizes: convertSizesToEndpointImageSize(
|
||||
sizes: convertSizesToPayloadImages(
|
||||
[
|
||||
sizes?.["200w"],
|
||||
sizes?.["320w"],
|
||||
|
@ -354,7 +349,7 @@ export const convertMediaThumbnailToEndpointMediaThumbnail = ({
|
|||
filename,
|
||||
filesize,
|
||||
mimeType,
|
||||
sizes: convertSizesToEndpointImageSize(
|
||||
sizes: convertSizesToPayloadImages(
|
||||
[
|
||||
sizes?.["200w"],
|
||||
sizes?.["320w"],
|
||||
|
|
Loading…
Reference in New Issue