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
	 DrMint
						DrMint