Added back the data checkups in their own separate page
This commit is contained in:
parent
0e130da9ea
commit
379ed4ce20
85
src/graphql/operations/devGetContents.graphql
Normal file
85
src/graphql/operations/devGetContents.graphql
Normal file
@ -0,0 +1,85 @@
|
||||
query devGetContents {
|
||||
contents(pagination: { limit: -1 }) {
|
||||
data {
|
||||
id
|
||||
attributes {
|
||||
slug
|
||||
categories {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
type {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
titles {
|
||||
language {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
title
|
||||
description
|
||||
}
|
||||
ranged_contents {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
text_set {
|
||||
language {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
source_language {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
status
|
||||
transcribers {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
translators {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
proofreaders {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
text
|
||||
}
|
||||
video_set {
|
||||
id
|
||||
}
|
||||
audio_set {
|
||||
id
|
||||
}
|
||||
thumbnail {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
next_recommended {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
previous_recommended {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
183
src/graphql/operations/devGetLibraryItems.graphql
Normal file
183
src/graphql/operations/devGetLibraryItems.graphql
Normal file
@ -0,0 +1,183 @@
|
||||
query devGetLibraryItems {
|
||||
libraryItems(pagination: { limit: -1 }) {
|
||||
data {
|
||||
id
|
||||
attributes {
|
||||
slug
|
||||
thumbnail {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
subitems {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
subitem_of {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
root_item
|
||||
price {
|
||||
amount
|
||||
currency {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
metadata {
|
||||
__typename
|
||||
}
|
||||
size {
|
||||
width
|
||||
height
|
||||
thickness
|
||||
}
|
||||
release_date {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
descriptions {
|
||||
description
|
||||
language {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
contents {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
digital
|
||||
categories {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
urls {
|
||||
url
|
||||
}
|
||||
images {
|
||||
language {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
source_language {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
status
|
||||
scanners {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
cleaners {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
typesetters {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
cover {
|
||||
front {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
spine {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
back {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
full {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
dust_jacket {
|
||||
front {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
spine {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
back {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
flap_front {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
flap_back {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
full {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
obi_belt {
|
||||
front {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
spine {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
back {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
flap_front {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
flap_back {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
full {
|
||||
data {
|
||||
id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -1,595 +0,0 @@
|
||||
import AppLayout from "components/AppLayout";
|
||||
import {
|
||||
GetChronologyItemsQuery,
|
||||
GetContentTextQuery,
|
||||
GetErasQuery,
|
||||
GetLibraryItemQuery,
|
||||
} from "graphql/generated";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
import { NextRouter, useRouter } from "next/router";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
import { sortContent } from "queries/helpers";
|
||||
|
||||
interface Props extends AppStaticProps {}
|
||||
|
||||
export default function Checkup(props: Props): JSX.Element {
|
||||
return <AppLayout navTitle={"Checkup"} {...props} />;
|
||||
}
|
||||
|
||||
export async function getStaticProps(
|
||||
context: GetStaticPropsContext
|
||||
): Promise<{ notFound: boolean } | { props: Props }> {
|
||||
const props: Props = {
|
||||
...(await getAppStaticProps(context)),
|
||||
};
|
||||
return {
|
||||
props: props,
|
||||
};
|
||||
}
|
||||
|
||||
function prettyTestWarning(
|
||||
router: NextRouter,
|
||||
message: string,
|
||||
subCategory: string[],
|
||||
url: string
|
||||
): void {
|
||||
prettyTestWritter(TestingLevel.Warning, router, message, subCategory, url);
|
||||
}
|
||||
|
||||
function prettyTestError(
|
||||
router: NextRouter,
|
||||
message: string,
|
||||
subCategory: string[],
|
||||
url: string
|
||||
): void {
|
||||
prettyTestWritter(TestingLevel.Error, router, message, subCategory, url);
|
||||
}
|
||||
|
||||
enum TestingLevel {
|
||||
Warning = "warn",
|
||||
Error = "error",
|
||||
}
|
||||
|
||||
function prettyTestWritter(
|
||||
level: TestingLevel,
|
||||
{ asPath, locale }: NextRouter,
|
||||
message: string,
|
||||
subCategory: string[],
|
||||
url: string
|
||||
): void {
|
||||
const line = [
|
||||
level,
|
||||
`${process.env.NEXT_PUBLIC_URL_SELF}/${locale}${asPath}`,
|
||||
locale,
|
||||
subCategory.join(" -> "),
|
||||
message,
|
||||
process.env.NEXT_PUBLIC_URL_CMS + url,
|
||||
];
|
||||
|
||||
if (process.env.ENABLE_TESTING_LOG) {
|
||||
if (level === TestingLevel.Warning) {
|
||||
console.warn(line.join("\t"));
|
||||
} else {
|
||||
console.error(line.join("\t"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function useTestingContent(props: {
|
||||
content: Exclude<
|
||||
GetContentTextQuery["contents"],
|
||||
null | undefined
|
||||
>["data"][number]["attributes"];
|
||||
contentId: Exclude<
|
||||
GetContentTextQuery["contents"],
|
||||
null | undefined
|
||||
>["data"][number]["id"];
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const { content, contentId } = props;
|
||||
|
||||
const contentURL = `/admin/content-manager/collectionType/api::content.content/${contentId}`;
|
||||
|
||||
if (router.locale === "en") {
|
||||
if (content?.categories?.data.length === 0) {
|
||||
prettyTestError(router, "Missing categories", ["content"], contentURL);
|
||||
}
|
||||
}
|
||||
|
||||
if (content?.ranged_contents?.data.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Unconnected to any source",
|
||||
["content"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
|
||||
if (content?.text_set?.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Has no textset, nor audioset, nor videoset",
|
||||
["content"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
|
||||
if (content?.text_set && content.text_set.length > 1) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"More than one textset for this language",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
|
||||
if (content?.text_set?.length === 1) {
|
||||
const textset = content.text_set[0];
|
||||
|
||||
if (!textset?.text) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing text",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
if (!textset?.source_language?.data) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing source language",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
} else if (
|
||||
textset.source_language.data.attributes?.code === router.locale
|
||||
) {
|
||||
// This is a transcript
|
||||
if (textset.transcribers?.data.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing transcribers attribution",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
if (textset.translators && textset.translators.data.length > 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Transcripts shouldn't have translators",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// This is a translation
|
||||
if (textset.translators?.data.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing translators attribution",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
if (textset.transcribers && textset.transcribers.data.length > 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Translations shouldn't have transcribers",
|
||||
["content", "text_set"],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function useTestingLibrary(props: {
|
||||
item: Exclude<
|
||||
GetLibraryItemQuery["libraryItems"],
|
||||
null | undefined
|
||||
>["data"][number]["attributes"];
|
||||
itemId: Exclude<
|
||||
GetLibraryItemQuery["libraryItems"],
|
||||
null | undefined
|
||||
>["data"][number]["id"];
|
||||
}) {
|
||||
const { item, itemId } = props;
|
||||
const router = useRouter();
|
||||
|
||||
const libraryItemURL = `/admin/content-manager/collectionType/api::library-item.library-item/${itemId}`;
|
||||
|
||||
sortContent(item?.contents);
|
||||
|
||||
if (router.locale === "en") {
|
||||
if (!item?.thumbnail?.data) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing thumbnail",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (item?.metadata?.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing metadata",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
} else if (
|
||||
item?.metadata?.[0]?.__typename === "ComponentMetadataGroup" &&
|
||||
(item.metadata[0].subtype?.data?.attributes?.slug === "relation-set" ||
|
||||
item.metadata[0].subtype?.data?.attributes?.slug === "variant-set")
|
||||
) {
|
||||
// This is a group type item
|
||||
if (item.price) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Group-type items shouldn't have price",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (item.size) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Group-type items shouldn't have size",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (item.release_date) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Group-type items shouldn't have release_date",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (item.contents && item.contents.data.length > 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Group-type items shouldn't have contents",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (item.subitems && item.subitems.data.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Group-type items should have subitems",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
// This is a normal item
|
||||
|
||||
if (item?.metadata?.[0]?.__typename === "ComponentMetadataGroup") {
|
||||
if (item.subitems?.data.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Group-type item should have subitems",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (item?.price) {
|
||||
if (!item.price.amount) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing amount",
|
||||
["libraryItem", "price"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (!item.price.currency) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing currency",
|
||||
["libraryItem", "price"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing price",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
|
||||
if (!item?.digital) {
|
||||
if (item?.size) {
|
||||
if (!item.size.width) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing width",
|
||||
["libraryItem", "size"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (!item.size.height) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing height",
|
||||
["libraryItem", "size"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (!item.size.thickness) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing thickness",
|
||||
["libraryItem", "size"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing size",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (item?.release_date) {
|
||||
if (!item.release_date.year) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing year",
|
||||
["libraryItem", "release_date"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (!item.release_date.month) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing month",
|
||||
["libraryItem", "release_date"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
if (!item.release_date.day) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing day",
|
||||
["libraryItem", "release_date"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing release_date",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
|
||||
if (item?.contents?.data.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing contents",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
} else {
|
||||
let currentRangePage = 0;
|
||||
item?.contents?.data.map((content) => {
|
||||
const contentURL = `/admin/content-manager/collectionType/api::content.content/${content.id}`;
|
||||
|
||||
if (content.attributes?.scan_set?.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing scan_set",
|
||||
["libraryItem", "content", content.id ?? ""],
|
||||
contentURL
|
||||
);
|
||||
}
|
||||
if (content.attributes?.range.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing range",
|
||||
["libraryItem", "content", content.id ?? ""],
|
||||
contentURL
|
||||
);
|
||||
} else if (
|
||||
content.attributes?.range[0]?.__typename ===
|
||||
"ComponentRangePageRange"
|
||||
) {
|
||||
if (
|
||||
content.attributes.range[0].starting_page <
|
||||
currentRangePage + 1
|
||||
) {
|
||||
prettyTestError(
|
||||
router,
|
||||
`Overlapping pages ${content.attributes.range[0].starting_page} to ${currentRangePage}`,
|
||||
["libraryItem", "content", content.id ?? "", "range"],
|
||||
libraryItemURL
|
||||
);
|
||||
} else if (
|
||||
content.attributes.range[0].starting_page >
|
||||
currentRangePage + 1
|
||||
) {
|
||||
prettyTestError(
|
||||
router,
|
||||
`Missing pages ${currentRangePage + 1} to ${
|
||||
content.attributes.range[0].starting_page - 1
|
||||
}`,
|
||||
["libraryItem", "content", content.id ?? "", "range"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
|
||||
if (!content.attributes.content?.data) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing content",
|
||||
["libraryItem", "content", content.id ?? "", "range"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
|
||||
currentRangePage = content.attributes.range[0].ending_page;
|
||||
}
|
||||
});
|
||||
|
||||
if (item?.metadata?.[0]?.__typename === "ComponentMetadataBooks") {
|
||||
if (item.metadata[0].languages?.data.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing language",
|
||||
["libraryItem", "metadata"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
|
||||
if (item.metadata[0].page_count) {
|
||||
if (currentRangePage < item.metadata[0].page_count) {
|
||||
prettyTestError(
|
||||
router,
|
||||
`Missing pages ${currentRangePage + 1} to ${
|
||||
item.metadata[0].page_count
|
||||
}`,
|
||||
["libraryItem", "content"],
|
||||
libraryItemURL
|
||||
);
|
||||
} else if (currentRangePage > item.metadata[0].page_count) {
|
||||
prettyTestError(
|
||||
router,
|
||||
`Page overflow, content references pages up to ${currentRangePage} when the highest expected was ${item.metadata[0].page_count}`,
|
||||
["libraryItem", "content"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
} else {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing page_count",
|
||||
["libraryItem", "metadata"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!item?.root_item && item?.subitem_of?.data.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"This item is inaccessible (not root item and not subitem of another item)",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
|
||||
if (item?.gallery?.data.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing gallery",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
if (item?.descriptions?.length === 0) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"Missing description",
|
||||
["libraryItem"],
|
||||
libraryItemURL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function useTestingChronology(props: {
|
||||
chronologyItems: Exclude<
|
||||
GetChronologyItemsQuery["chronologyItems"],
|
||||
null | undefined
|
||||
>["data"];
|
||||
chronologyEras: Exclude<
|
||||
GetErasQuery["chronologyEras"],
|
||||
null | undefined
|
||||
>["data"];
|
||||
}) {
|
||||
const router = useRouter();
|
||||
const { chronologyItems, chronologyEras } = props;
|
||||
chronologyEras.map((era) => {
|
||||
const chronologyErasURL = `/admin/content-manager/collectionType/api::chronology-era.chronology-era/${chronologyItems[0].id}`;
|
||||
|
||||
if (era.attributes?.title?.length === 0) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing translation for title and description, using slug instead",
|
||||
["chronologyEras", era.attributes.slug],
|
||||
chronologyErasURL
|
||||
);
|
||||
} else if (era.attributes?.title && era.attributes.title.length > 1) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"More than one title and description",
|
||||
["chronologyEras", era.attributes.slug],
|
||||
chronologyErasURL
|
||||
);
|
||||
} else {
|
||||
if (!era.attributes?.title?.[0]?.title)
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing title, using slug instead",
|
||||
["chronologyEras", era.attributes?.slug ?? ""],
|
||||
chronologyErasURL
|
||||
);
|
||||
if (!era.attributes?.title?.[0]?.description)
|
||||
prettyTestError(
|
||||
router,
|
||||
"Missing description",
|
||||
["chronologyEras", era.attributes?.slug ?? ""],
|
||||
chronologyErasURL
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
chronologyItems.map((item) => {
|
||||
const chronologyItemsURL = `/admin/content-manager/collectionType/api::chronology-item.chronology-item/${chronologyItems[0].id}`;
|
||||
|
||||
const date = `${item.attributes?.year}/${item.attributes?.month}/${item.attributes?.day}`;
|
||||
|
||||
if (item.attributes?.events && item.attributes.events.length > 0) {
|
||||
item.attributes.events.map((event) => {
|
||||
if (!event?.source?.data) {
|
||||
prettyTestError(
|
||||
router,
|
||||
"No source for this event",
|
||||
["chronologyItems", date, event?.id ?? ""],
|
||||
chronologyItemsURL
|
||||
);
|
||||
}
|
||||
if (!(event?.translations && event.translations.length > 0)) {
|
||||
prettyTestWarning(
|
||||
router,
|
||||
"No translation for this event",
|
||||
["chronologyItems", date, event?.id ?? ""],
|
||||
chronologyItemsURL
|
||||
);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
prettyTestError(
|
||||
router,
|
||||
"No events for this date",
|
||||
["chronologyItems", date],
|
||||
chronologyItemsURL
|
||||
);
|
||||
}
|
||||
});
|
||||
}
|
486
src/pages/dev/checkup/contents.tsx
Normal file
486
src/pages/dev/checkup/contents.tsx
Normal file
@ -0,0 +1,486 @@
|
||||
import AppLayout from "components/AppLayout";
|
||||
import Chip from "components/Chip";
|
||||
import Button from "components/Inputs/Button";
|
||||
import ContentPanel, {
|
||||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import ToolTip from "components/ToolTip";
|
||||
import {
|
||||
DevGetContentsQuery,
|
||||
Enum_Componentsetstextset_Status,
|
||||
} from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
|
||||
interface Props extends AppStaticProps {
|
||||
contents: DevGetContentsQuery;
|
||||
}
|
||||
|
||||
export default function CheckupContents(props: Props): JSX.Element {
|
||||
const { contents } = props;
|
||||
const testReport = testingContent(contents);
|
||||
|
||||
const contentPanel = (
|
||||
<ContentPanel width={ContentPanelWidthSizes.large}>
|
||||
{<h2 className="text-2xl">{testReport.title}</h2>}
|
||||
|
||||
<div className="grid grid-cols-[2em,3em,2fr,1fr,0.5fr,0.5fr,2fr] gap-2 items-center my-4">
|
||||
<p></p>
|
||||
<p></p>
|
||||
<p className="font-headers">Ref</p>
|
||||
<p className="font-headers">Name</p>
|
||||
<p className="font-headers">Type</p>
|
||||
<p className="font-headers">Severity</p>
|
||||
<p className="font-headers">Description</p>
|
||||
</div>
|
||||
|
||||
{testReport.lines.map((line, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className="grid grid-cols-[2em,3em,2fr,1fr,0.5fr,0.5fr,2fr] gap-2 items-center mb-2 justify-items-start"
|
||||
>
|
||||
<Button
|
||||
href={line.frontendUrl}
|
||||
target="_blank"
|
||||
className="text-xs w-4"
|
||||
>
|
||||
F
|
||||
</Button>
|
||||
<Button
|
||||
href={line.backendUrl}
|
||||
target="_blank"
|
||||
className="text-xs w-4"
|
||||
>
|
||||
B
|
||||
</Button>
|
||||
<p>{line.subitems.join(" -> ")}</p>
|
||||
<p>{line.name}</p>
|
||||
<Chip>{line.type}</Chip>
|
||||
<Chip
|
||||
className={
|
||||
line.severity === "Very High"
|
||||
? "bg-[#f00] !opacity-100 font-bold"
|
||||
: line.severity === "High"
|
||||
? "bg-[#ff6600] !opacity-100 font-bold"
|
||||
: line.severity === "Medium"
|
||||
? "bg-[#fff344] !opacity-100"
|
||||
: ""
|
||||
}
|
||||
>
|
||||
{line.severity}
|
||||
</Chip>
|
||||
<ToolTip content={line.recommandation} placement="left">
|
||||
<p>{line.description}</p>
|
||||
</ToolTip>
|
||||
</div>
|
||||
))}
|
||||
</ContentPanel>
|
||||
);
|
||||
return (
|
||||
<AppLayout navTitle={"Checkup"} contentPanel={contentPanel} {...props} />
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps(
|
||||
context: GetStaticPropsContext
|
||||
): Promise<{ notFound: boolean } | { props: Props }> {
|
||||
const sdk = getReadySdk();
|
||||
const contents = await sdk.devGetContents();
|
||||
const props: Props = {
|
||||
...(await getAppStaticProps(context)),
|
||||
contents: contents,
|
||||
};
|
||||
return {
|
||||
props: props,
|
||||
};
|
||||
}
|
||||
|
||||
type Report = {
|
||||
title: string;
|
||||
lines: ReportLine[];
|
||||
};
|
||||
|
||||
type ReportLine = {
|
||||
subitems: string[];
|
||||
name: string;
|
||||
type: "Error" | "Improvement" | "Missing";
|
||||
severity: "High" | "Low" | "Medium" | "Very High" | "Very Low";
|
||||
description: string;
|
||||
recommandation: string;
|
||||
backendUrl: string;
|
||||
frontendUrl: string;
|
||||
};
|
||||
|
||||
function testingContent(contents: Props["contents"]): Report {
|
||||
const report: Report = {
|
||||
title: "Contents",
|
||||
lines: [],
|
||||
};
|
||||
|
||||
contents.contents?.data.map((content) => {
|
||||
if (content.attributes) {
|
||||
const backendUrl = `${process.env.NEXT_PUBLIC_URL_CMS}/admin/content-manager/collectionType/api::content.content/${content.id}`;
|
||||
const frontendUrl = `${process.env.NEXT_PUBLIC_URL_SELF}/contents/${content.attributes.slug}`;
|
||||
|
||||
if (content.attributes.categories?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Category",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "The Content has no Category.",
|
||||
recommandation: "Select a Category in relation with the Content",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (!content.attributes.type?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Category",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "The Content has no Type.",
|
||||
recommandation: 'If unsure, use the "Other" Type.',
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (content.attributes.ranged_contents?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Ranged Content",
|
||||
type: "Improvement",
|
||||
severity: "Low",
|
||||
description: "The Content has no Ranged Content.",
|
||||
recommandation:
|
||||
"If this Content is available in one or multiple Library Item(s), create a Range Content to connect the Content to its Library Item(s).",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
content.attributes.next_recommended?.data?.id === content.id ||
|
||||
content.attributes.previous_recommended?.data?.id === content.id
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "Self Recommendation",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description:
|
||||
"The Content is referring to itself as a Next or Previous Recommended.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (!content.attributes.thumbnail?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Thumbnail",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description: "The Content has no Thumbnail.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (content.attributes.titles?.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Titles",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description: "The Content has no Titles.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
const titleLanguages: string[] = [];
|
||||
|
||||
content.attributes.titles?.map((title, titleIndex) => {
|
||||
if (title && content.attributes) {
|
||||
if (title.language?.data?.id) {
|
||||
if (title.language.data.id in titleLanguages) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`Title ${titleIndex.toString()}`,
|
||||
],
|
||||
name: "Duplicate Language",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
titleLanguages.push(title.language.data.id);
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`Title ${titleIndex.toString()}`,
|
||||
],
|
||||
name: "No Language",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!title.description) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`Title ${titleIndex.toString()}`,
|
||||
],
|
||||
name: "No Description",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
content.attributes.text_set?.length === 0 &&
|
||||
content.attributes.audio_set?.length === 0 &&
|
||||
content.attributes.video_set?.length === 0
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Sets",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "The Content has no Sets.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
if (content.attributes.video_set?.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Video Sets",
|
||||
type: "Missing",
|
||||
severity: "Very Low",
|
||||
description: "The Content has no Video Sets.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (content.attributes.audio_set?.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Audio Sets",
|
||||
type: "Missing",
|
||||
severity: "Very Low",
|
||||
description: "The Content has no Audio Sets.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (content.attributes.text_set?.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [content.attributes.slug],
|
||||
name: "No Text Set",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "The Content has no Text Set.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
const textSetLanguages: string[] = [];
|
||||
|
||||
content.attributes.text_set?.map((textSet, textSetIndex) => {
|
||||
if (content.attributes && textSet) {
|
||||
if (textSet.language?.data?.id) {
|
||||
if (textSet.language.data.id in textSetLanguages) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "Duplicate Language",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
textSetLanguages.push(textSet.language.data.id);
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "No Language",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (!textSet.source_language?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "No Source Language",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (textSet.status !== Enum_Componentsetstextset_Status.Done) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "Not Done Status",
|
||||
type: "Improvement",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (!textSet.text || textSet.text.length < 10) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "No Text",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
textSet.source_language?.data?.id === textSet.language?.data?.id
|
||||
) {
|
||||
if (textSet.transcribers?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "No Transcribers",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Content is a Transcription but doesn't credit any Transcribers.",
|
||||
recommandation: "Add the appropriate Transcribers.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (
|
||||
textSet.translators?.data &&
|
||||
textSet.translators.data.length > 0
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "Credited Translators",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Content is a Transcription but credits one or more Translators.",
|
||||
recommandation:
|
||||
"If appropriate, create a Translation Text Set with the Translator credited there.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (textSet.translators?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "No Translators",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Content is a Transcription but doesn't credit any Translators.",
|
||||
recommandation: "Add the appropriate Translators.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (
|
||||
textSet.transcribers?.data &&
|
||||
textSet.transcribers.data.length > 0
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
content.attributes.slug,
|
||||
`TextSet ${textSetIndex.toString()}`,
|
||||
],
|
||||
name: "Credited Transcribers",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Content is a Translation but credits one or more Transcribers.",
|
||||
recommandation:
|
||||
"If appropriate, create a Transcription Text Set with the Transcribers credited there.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
return report;
|
||||
}
|
757
src/pages/dev/checkup/libraryitems.tsx
Normal file
757
src/pages/dev/checkup/libraryitems.tsx
Normal file
@ -0,0 +1,757 @@
|
||||
import AppLayout from "components/AppLayout";
|
||||
import Chip from "components/Chip";
|
||||
import Button from "components/Inputs/Button";
|
||||
import ContentPanel, {
|
||||
ContentPanelWidthSizes,
|
||||
} from "components/Panels/ContentPanel";
|
||||
import ToolTip from "components/ToolTip";
|
||||
import {
|
||||
DevGetLibraryItemsQuery,
|
||||
Enum_Componentcollectionscomponentlibraryimages_Status,
|
||||
} from "graphql/generated";
|
||||
import { getReadySdk } from "graphql/sdk";
|
||||
import { GetStaticPropsContext } from "next";
|
||||
import { AppStaticProps, getAppStaticProps } from "queries/getAppStaticProps";
|
||||
|
||||
interface Props extends AppStaticProps {
|
||||
libraryItems: DevGetLibraryItemsQuery;
|
||||
}
|
||||
|
||||
export default function CheckupLibraryItems(props: Props): JSX.Element {
|
||||
const { libraryItems } = props;
|
||||
const testReport = testingLibraryItem(libraryItems);
|
||||
|
||||
const contentPanel = (
|
||||
<ContentPanel width={ContentPanelWidthSizes.large}>
|
||||
{<h2 className="text-2xl">{testReport.title}</h2>}
|
||||
|
||||
<div className="grid grid-cols-[2em,3em,2fr,1fr,0.5fr,0.5fr,2fr] gap-2 items-center my-4">
|
||||
<p></p>
|
||||
<p></p>
|
||||
<p className="font-headers">Ref</p>
|
||||
<p className="font-headers">Name</p>
|
||||
<p className="font-headers">Type</p>
|
||||
<p className="font-headers">Severity</p>
|
||||
<p className="font-headers">Description</p>
|
||||
</div>
|
||||
|
||||
{testReport.lines.map((line, index) => (
|
||||
<div
|
||||
key={index}
|
||||
className="grid grid-cols-[2em,3em,2fr,1fr,0.5fr,0.5fr,2fr] gap-2 items-center mb-2 justify-items-start"
|
||||
>
|
||||
<Button
|
||||
href={line.frontendUrl}
|
||||
target="_blank"
|
||||
className="text-xs w-4"
|
||||
>
|
||||
F
|
||||
</Button>
|
||||
<Button
|
||||
href={line.backendUrl}
|
||||
target="_blank"
|
||||
className="text-xs w-4"
|
||||
>
|
||||
B
|
||||
</Button>
|
||||
<p>{line.subitems.join(" -> ")}</p>
|
||||
<p>{line.name}</p>
|
||||
<Chip>{line.type}</Chip>
|
||||
<Chip
|
||||
className={
|
||||
line.severity === "Very High"
|
||||
? "bg-[#f00] !opacity-100 font-bold"
|
||||
: line.severity === "High"
|
||||
? "bg-[#ff6600] !opacity-100 font-bold"
|
||||
: line.severity === "Medium"
|
||||
? "bg-[#fff344] !opacity-100"
|
||||
: ""
|
||||
}
|
||||
>
|
||||
{line.severity}
|
||||
</Chip>
|
||||
<ToolTip content={line.recommandation} placement="left">
|
||||
<p>{line.description}</p>
|
||||
</ToolTip>
|
||||
</div>
|
||||
))}
|
||||
</ContentPanel>
|
||||
);
|
||||
return (
|
||||
<AppLayout navTitle={"Checkup"} contentPanel={contentPanel} {...props} />
|
||||
);
|
||||
}
|
||||
|
||||
export async function getStaticProps(
|
||||
context: GetStaticPropsContext
|
||||
): Promise<{ notFound: boolean } | { props: Props }> {
|
||||
const sdk = getReadySdk();
|
||||
const libraryItems = await sdk.devGetLibraryItems();
|
||||
const props: Props = {
|
||||
...(await getAppStaticProps(context)),
|
||||
libraryItems: libraryItems,
|
||||
};
|
||||
return {
|
||||
props: props,
|
||||
};
|
||||
}
|
||||
|
||||
type Report = {
|
||||
title: string;
|
||||
lines: ReportLine[];
|
||||
};
|
||||
|
||||
type ReportLine = {
|
||||
subitems: string[];
|
||||
name: string;
|
||||
type: "Error" | "Improvement" | "Missing";
|
||||
severity: "High" | "Low" | "Medium" | "Very High" | "Very Low";
|
||||
description: string;
|
||||
recommandation: string;
|
||||
backendUrl: string;
|
||||
frontendUrl: string;
|
||||
};
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
function testingLibraryItem(libraryItems: Props["libraryItems"]): Report {
|
||||
const report: Report = {
|
||||
title: "Contents",
|
||||
lines: [],
|
||||
};
|
||||
|
||||
libraryItems.libraryItems?.data.map((item) => {
|
||||
if (item.attributes) {
|
||||
const backendUrl = `${process.env.NEXT_PUBLIC_URL_CMS}/admin/content-manager/collectionType/api::library-item.library-item/${item.id}`;
|
||||
const frontendUrl = `${process.env.NEXT_PUBLIC_URL_SELF}/library/${item.attributes.slug}`;
|
||||
|
||||
if (item.attributes.categories?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "No Category",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "The Item has no Category.",
|
||||
recommandation: "Select a Category in relation with the Item",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
!item.attributes.root_item &&
|
||||
item.attributes.subitem_of?.data.length === 0
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "Disconnected Item",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description:
|
||||
"The Item is neither a Root Item, nor is it a subitem of another item.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (item.attributes.contents?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "No Contents",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "The Item has no Contents.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (!item.attributes.thumbnail?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "No Thumbnail",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description: "The Item has no Thumbnail.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (item.attributes.images?.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "No Images",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "The Item has no Images.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
item.attributes.images?.map((image, imageIndex) => {
|
||||
const imagesLanguages: string[] = [];
|
||||
|
||||
if (image && item.attributes) {
|
||||
if (image.language?.data?.id) {
|
||||
if (image.language.data.id in imagesLanguages) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "Duplicate Language",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
imagesLanguages.push(image.language.data.id);
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Language",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (!image.source_language?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Source Language",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
image.status !==
|
||||
Enum_Componentcollectionscomponentlibraryimages_Status.Done
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "Not Done Status",
|
||||
type: "Improvement",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (image.source_language?.data?.id === image.language?.data?.id) {
|
||||
if (image.scanners?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Scanners",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Item is a Scan but doesn't credit any Scanners.",
|
||||
recommandation: "Add the appropriate Scanners.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (image.cleaners?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Cleaners",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Item is a Scan but doesn't credit any Cleaners.",
|
||||
recommandation: "Add the appropriate Cleaners.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (
|
||||
image.typesetters?.data &&
|
||||
image.typesetters.data.length > 0
|
||||
) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "Credited Typesetters",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Item is a Scan but credits one or more Typesetters.",
|
||||
recommandation:
|
||||
"If appropriate, create a Scanlation Images Set Set with the Typesetters credited there.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
if (image.typesetters?.data.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Typesetters",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Item is a Scanlation but doesn't credit any Typesetters.",
|
||||
recommandation: "Add the appropriate Typesetters.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (image.scanners?.data && image.scanners.data.length > 0) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "Credited Scanners",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description:
|
||||
"The Item is a Scanlation but credits one or more Scanners.",
|
||||
recommandation:
|
||||
"If appropriate, create a Scanners Images Set Set with the Scanners credited there.",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (image.cover) {
|
||||
if (!image.cover.front?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Cover",
|
||||
],
|
||||
name: "No Front",
|
||||
type: "Missing",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.cover.spine?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Cover",
|
||||
],
|
||||
name: "No spine",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.cover.back?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Cover",
|
||||
],
|
||||
name: "No Back",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.cover.full?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Cover",
|
||||
],
|
||||
name: "No Full",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Cover",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (image.dust_jacket) {
|
||||
if (!image.dust_jacket.front?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Dust Jacket",
|
||||
],
|
||||
name: "No Front",
|
||||
type: "Missing",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.dust_jacket.spine?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Dust Jacket",
|
||||
],
|
||||
name: "No spine",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.dust_jacket.back?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Dust Jacket",
|
||||
],
|
||||
name: "No Back",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.dust_jacket.full?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Dust Jacket",
|
||||
],
|
||||
name: "No Full",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.dust_jacket.flap_front?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Dust Jacket",
|
||||
],
|
||||
name: "No Flap Front",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.dust_jacket.flap_back?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Dust Jacket",
|
||||
],
|
||||
name: "No Flap Back",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Dust Jacket",
|
||||
type: "Missing",
|
||||
severity: "Very Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (image.obi_belt) {
|
||||
if (!image.obi_belt.front?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Obi Belt",
|
||||
],
|
||||
name: "No Front",
|
||||
type: "Missing",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.obi_belt.spine?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Obi Belt",
|
||||
],
|
||||
name: "No spine",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.obi_belt.back?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Obi Belt",
|
||||
],
|
||||
name: "No Back",
|
||||
type: "Missing",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.obi_belt.full?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Obi Belt",
|
||||
],
|
||||
name: "No Full",
|
||||
type: "Missing",
|
||||
severity: "Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.obi_belt.flap_front?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Obi Belt",
|
||||
],
|
||||
name: "No Flap Front",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
if (!image.obi_belt.flap_back?.data?.id) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
"Obi Belt",
|
||||
],
|
||||
name: "No Flap Back",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Images ${imageIndex.toString()}`,
|
||||
],
|
||||
name: "No Obi Belt",
|
||||
type: "Missing",
|
||||
severity: "Very Low",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (
|
||||
item.attributes.descriptions &&
|
||||
item.attributes.descriptions.length > 0
|
||||
) {
|
||||
const descriptionLanguages: string[] = [];
|
||||
|
||||
item.attributes.descriptions?.map((description, descriptionIndex) => {
|
||||
if (description && item.attributes) {
|
||||
if (description?.description.length < 10) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Description ${descriptionIndex}`,
|
||||
],
|
||||
name: "No Text",
|
||||
type: "Missing",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (description.language?.data?.id) {
|
||||
if (description.language.data.id in descriptionLanguages) {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Description ${descriptionIndex}`,
|
||||
],
|
||||
name: "Duplicate Language",
|
||||
type: "Error",
|
||||
severity: "High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
} else {
|
||||
descriptionLanguages.push(description.language.data.id);
|
||||
}
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [
|
||||
item.attributes.slug,
|
||||
`Description ${descriptionIndex}`,
|
||||
],
|
||||
name: "No Language",
|
||||
type: "Error",
|
||||
severity: "Very High",
|
||||
description: "",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
} else {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "No Description",
|
||||
type: "Missing",
|
||||
severity: "Medium",
|
||||
description: "The Item has no Description.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
if (item.attributes.urls?.length === 0) {
|
||||
report.lines.push({
|
||||
subitems: [item.attributes.slug],
|
||||
name: "No URLs",
|
||||
type: "Missing",
|
||||
severity: "Very Low",
|
||||
description: "The Item has no URLs.",
|
||||
recommandation: "",
|
||||
backendUrl: backendUrl,
|
||||
frontendUrl: frontendUrl,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
return report;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user