diff --git a/astro/src/content/pages/pages.ts b/astro/src/content/pages/pages.ts index 26cc4d2..9d18155 100644 --- a/astro/src/content/pages/pages.ts +++ b/astro/src/content/pages/pages.ts @@ -3,6 +3,309 @@ import { print } from 'graphql'; import { formatDate } from "@/lib/dates"; import getAllPages from "@/graphql/pages/getAllPages.graphql"; +export function dataToPage(pageRecord: any): WebPage { + let dates: string[] = [ + pageRecord["date_created"], + pageRecord["date_updated"], + pageRecord["search_engine"][0]["date_created"], + pageRecord["search_engine"][0]["date_updated"] + ]; + + const searchEngine = pageRecord["search_engine"][0]; + + let components: WebpageComponent[] = []; + + pageRecord["components"].forEach((componentRecord: any) => { + const component = componentRecord["item"]; + + switch (componentRecord["item"]["__typename"]) { + case "Hero": + let heroComponent: HeroComponent = { + component: "Hero", + id: component["hero_id"], + title: component["hero_title"], + text: component["hero_text"], + backgroundImage: { + url: component["background_image"]["filename_disk"], + width: component["background_image"]["width"], + height: component["background_image"]["height"] + } + }; + + components.push(heroComponent); + dates.push(component["hero_created"]); + dates.push(component["hero_updated"]); + dates.push(component["background_image"]["created_on"]); + + break; + case "Text_With_Side_Image": + let textWithImageComponent: TextWithImageComponent = { + component: "TextWithImage", + id: component["twsi_id"], + title: component["twsi_title"], + text: component["twsi_text"], + imageSide: component["twsi_image_side"], + image: { + url: component["image"]["filename_disk"], + width: component["image"]["width"], + height: component["image"]["height"] + } + }; + + components.push(textWithImageComponent); + dates.push(component["twsi_created"]); + dates.push(component["twsi_updated"]); + dates.push(component["image"]["created_on"]); + + break; + case "Wall_Of_Text": + let wallOfTextComponent: WallOfTextComponent = { + component: "WallOfText", + id: component["wot_id"], + title: component["wot_title"], + text: component["wot_text"] + }; + + components.push(wallOfTextComponent); + dates.push(component["wot_created"]); + dates.push(component["wot_updated"]); + + break; + case "Frequently_Asked_Questions": + let faqComponent: FrequentlyAskedQuestionsComponent = { + component: "FrequentlyAskedQuestions", + id: component["faq_id"], + title: component["faq_title"], + text: component["faq_text"], + questions: [] + }; + + component["questions"].forEach((faqQuestionRecord: any) => { + faqComponent.questions.push({ + id: faqQuestionRecord["id"], + question: faqQuestionRecord["question"], + answer: faqQuestionRecord["answer"] + }); + + dates.push(faqQuestionRecord["date_created"]); + dates.push(faqQuestionRecord["date_updated"]); + }); + + components.push(faqComponent); + dates.push(component["faq_created"]); + dates.push(component["faq_updated"]); + + break; + case "Upcoming_Events": + let upcomingEventsComponent: UpcomingEventsComponent = { + component: "UpcomingEvents", + id: component["ue_id"], + title: component["ue_title"], + text: component["ue_text"], + events: [] + }; + + component["events"].forEach((eventRecord: any) => { + upcomingEventsComponent.events.push({ + id: eventRecord["id"], + title: eventRecord["title"], + description: eventRecord["description"], + location: eventRecord["location"], + mapLocation: [ + eventRecord["map_location"]["coordinates"][1], + eventRecord["map_location"]["coordinates"][0] + ], + startDate: eventRecord["start_date"], + endDate: eventRecord["end_date"] + }); + + dates.push(eventRecord["date_created"]); + dates.push(eventRecord["date_updated"]); + }); + + components.push(upcomingEventsComponent); + dates.push(component["ue_created"]); + dates.push(component["ue_updated"]); + + break; + case "Equipment_Table": + let equipmentTableComponent: EquipmentTableComponent = { + component: "EquipmentTable", + id: component["et_id"], + title: component["et_title"], + text: component["et_text"], + items: [] + }; + + component["items"].forEach((itemRecord: any) => { + equipmentTableComponent.items.push({ + id: itemRecord["id"], + title: itemRecord["title"], + text: itemRecord["text"], + icon: { + url: itemRecord["icon"]["filename_disk"], + width: itemRecord["icon"]["width"], + height: itemRecord["icon"]["height"] + } + }); + + dates.push(itemRecord["date_created"]); + dates.push(itemRecord["date_updated"]); + dates.push(itemRecord["icon"]["created_on"]); + }); + + components.push(equipmentTableComponent); + dates.push(component["et_created"]); + dates.push(component["et_updated"]); + + break; + case "Review_List": + let reviewsComponent: ReviewListComponent = { + component: "Reviews", + id: component["rl_id"], + title: component["rl_title"], + text: component["rl_text"], + reviews: [] + }; + + component["reviews"].forEach((reviewRecord: any) => { + reviewsComponent.reviews.push({ + id: reviewRecord["id"], + name: reviewRecord["name"], + review: reviewRecord["review"], + stars: reviewRecord["stars"], + date: reviewRecord["date"], + thumbnail: { + url: reviewRecord["thumbnail"]["filename_disk"], + width: reviewRecord["thumbnail"]["width"], + height: reviewRecord["thumbnail"]["height"] + } + }); + + dates.push(reviewRecord["date_created"]); + dates.push(reviewRecord["date_updated"]); + dates.push(reviewRecord["thumbnail"]["created_on"]); + }); + + components.push(reviewsComponent); + dates.push(component["rl_created"]); + dates.push(component["rl_updated"]); + + break; + case "Contact": + let contactComponent: ContactComponent = { + component: "Contact", + id: component["c_id"], + title: component["c_title"], + text: component["c_text"], + methods: [] + }; + + component["methods"].forEach((contactMethodRecord: any) => { + contactComponent.methods.push({ + id: contactMethodRecord["id"], + title: contactMethodRecord["title"], + text: contactMethodRecord["text"], + color: contactMethodRecord["color"], + icon: { + url: contactMethodRecord["icon"]["filename_disk"], + width: contactMethodRecord["icon"]["width"], + height: contactMethodRecord["icon"]["height"] + } + }); + + dates.push(contactMethodRecord["date_created"]); + dates.push(contactMethodRecord["date_updated"]); + dates.push(contactMethodRecord["icon"]["created_on"]); + }); + + components.push(contactComponent); + dates.push(component["c_created"]); + dates.push(component["c_updated"]); + + break; + case "Last_Blogs": + let lastBlogsComponent: LastBlogsComponent = { + component: "LastBlogs", + id: component["lb_id"], + title: component["lb_title"], + readMoreButtonText: component["lb_read_more_button_text"], + amount: component["lb_amount"] + }; + + components.push(lastBlogsComponent); + dates.push(component["lb_created"]); + dates.push(component["lb_updated"]); + + break; + case "Last_Projects": + let lastProjectsComponent: LastProjectsComponent = { + component: "LastProjects", + id: component["lp_id"], + title: component["lp_title"], + readMoreButtonText: component["lp_read_more_button_text"], + amount: component["lp_amount"] + }; + + components.push(lastProjectsComponent); + dates.push(component["lp_created"]); + dates.push(component["lp_updated"]); + + break; + case "Last_Galleries": + let lastGalleriesComponent: LastGalleriesComponent = { + component: "LastGalleries", + id: component["lg_id"], + title: component["lg_title"], + readMoreButtonText: component["lg_read_more_button_text"], + amount: component["lg_amount"] + }; + + components.push(lastGalleriesComponent); + dates.push(component["lg_created"]); + dates.push(component["lg_updated"]); + + break; + default: + break; + } + }); + + let lastModified: Date; + + if (dates.filter(e => e !== null).length === 0) { + lastModified = new Date(); + } + else { + const sortedDates: string[] = dates.sort((a: string, b: string) => { + return new Date(b).getTime() - new Date(a).getTime(); + }); + + lastModified = new Date(sortedDates[0]); + } + + let page: WebPage = { + id: pageRecord["id"], + lastModified: lastModified, + url: pageRecord["url"], + searchEngine: { + title: searchEngine["title"], + description: searchEngine["description"], + canonical: searchEngine["canonical"], + allowCrawlers: searchEngine["allow_crawler"], + priority: searchEngine["priority"], + thumbnail: { + url: searchEngine["thumbnail"]["filename_disk"], + height: searchEngine["thumbnail"]["height"], + width: searchEngine["thumbnail"]["width"] + } + }, + components: components + } + + return page; +} + export async function getAllWebpages(): Promise { const client = await createDirectusConnection(); const result = await client.query(print(getAllPages), { @@ -12,306 +315,7 @@ export async function getAllWebpages(): Promise { let pages: WebPage[] = []; result["Pages"].forEach((pageRecord: any) => { - let dates: string[] = [ - pageRecord["date_created"], - pageRecord["date_updated"], - pageRecord["search_engine"][0]["date_created"], - pageRecord["search_engine"][0]["date_updated"] - ]; - - const searchEngine = pageRecord["search_engine"][0]; - - let components: WebpageComponent[] = []; - - pageRecord["components"].forEach((componentRecord: any) => { - const component = componentRecord["item"]; - - switch (componentRecord["item"]["__typename"]) { - case "Hero": - let heroComponent: HeroComponent = { - component: "Hero", - id: component["hero_id"], - title: component["hero_title"], - text: component["hero_text"], - backgroundImage: { - url: component["background_image"]["filename_disk"], - width: component["background_image"]["width"], - height: component["background_image"]["height"] - } - }; - - components.push(heroComponent); - dates.push(component["hero_created"]); - dates.push(component["hero_updated"]); - dates.push(component["background_image"]["created_on"]); - - break; - case "Text_With_Side_Image": - let textWithImageComponent: TextWithImageComponent = { - component: "TextWithImage", - id: component["twsi_id"], - title: component["twsi_title"], - text: component["twsi_text"], - imageSide: component["twsi_image_side"], - image: { - url: component["image"]["filename_disk"], - width: component["image"]["width"], - height: component["image"]["height"] - } - }; - - components.push(textWithImageComponent); - dates.push(component["twsi_created"]); - dates.push(component["twsi_updated"]); - dates.push(component["image"]["created_on"]); - - break; - case "Wall_Of_Text": - let wallOfTextComponent: WallOfTextComponent = { - component: "WallOfText", - id: component["wot_id"], - title: component["wot_title"], - text: component["wot_text"] - }; - - components.push(wallOfTextComponent); - dates.push(component["wot_created"]); - dates.push(component["wot_updated"]); - - break; - case "Frequently_Asked_Questions": - let faqComponent: FrequentlyAskedQuestionsComponent = { - component: "FrequentlyAskedQuestions", - id: component["faq_id"], - title: component["faq_title"], - text: component["faq_text"], - questions: [] - }; - - component["questions"].forEach((faqQuestionRecord: any) => { - faqComponent.questions.push({ - id: faqQuestionRecord["id"], - question: faqQuestionRecord["question"], - answer: faqQuestionRecord["answer"] - }); - - dates.push(faqQuestionRecord["date_created"]); - dates.push(faqQuestionRecord["date_updated"]); - }); - - components.push(faqComponent); - dates.push(component["faq_created"]); - dates.push(component["faq_updated"]); - - break; - case "Upcoming_Events": - let upcomingEventsComponent: UpcomingEventsComponent = { - component: "UpcomingEvents", - id: component["ue_id"], - title: component["ue_title"], - text: component["ue_text"], - events: [] - }; - - component["events"].forEach((eventRecord: any) => { - upcomingEventsComponent.events.push({ - id: eventRecord["id"], - title: eventRecord["title"], - description: eventRecord["description"], - location: eventRecord["location"], - mapLocation: [ - eventRecord["map_location"]["coordinates"][1], - eventRecord["map_location"]["coordinates"][0] - ], - startDate: eventRecord["start_date"], - endDate: eventRecord["end_date"] - }); - - dates.push(eventRecord["date_created"]); - dates.push(eventRecord["date_updated"]); - }); - - components.push(upcomingEventsComponent); - dates.push(component["ue_created"]); - dates.push(component["ue_updated"]); - - break; - case "Equipment_Table": - let equipmentTableComponent: EquipmentTableComponent = { - component: "EquipmentTable", - id: component["et_id"], - title: component["et_title"], - text: component["et_text"], - items: [] - }; - - component["items"].forEach((itemRecord: any) => { - equipmentTableComponent.items.push({ - id: itemRecord["id"], - title: itemRecord["title"], - text: itemRecord["text"], - icon: { - url: itemRecord["icon"]["filename_disk"], - width: itemRecord["icon"]["width"], - height: itemRecord["icon"]["height"] - } - }); - - dates.push(itemRecord["date_created"]); - dates.push(itemRecord["date_updated"]); - dates.push(itemRecord["icon"]["created_on"]); - }); - - components.push(equipmentTableComponent); - dates.push(component["et_created"]); - dates.push(component["et_updated"]); - - break; - case "Review_List": - let reviewsComponent: ReviewListComponent = { - component: "Reviews", - id: component["rl_id"], - title: component["rl_title"], - text: component["rl_text"], - reviews: [] - }; - - component["reviews"].forEach((reviewRecord: any) => { - reviewsComponent.reviews.push({ - id: reviewRecord["id"], - name: reviewRecord["name"], - review: reviewRecord["review"], - stars: reviewRecord["stars"], - date: reviewRecord["date"], - thumbnail: { - url: reviewRecord["thumbnail"]["filename_disk"], - width: reviewRecord["thumbnail"]["width"], - height: reviewRecord["thumbnail"]["height"] - } - }); - - dates.push(reviewRecord["date_created"]); - dates.push(reviewRecord["date_updated"]); - dates.push(reviewRecord["thumbnail"]["created_on"]); - }); - - components.push(reviewsComponent); - dates.push(component["rl_created"]); - dates.push(component["rl_updated"]); - - break; - case "Contact": - let contactComponent: ContactComponent = { - component: "Contact", - id: component["c_id"], - title: component["c_title"], - text: component["c_text"], - methods: [] - }; - - component["methods"].forEach((contactMethodRecord: any) => { - contactComponent.methods.push({ - id: contactMethodRecord["id"], - title: contactMethodRecord["title"], - text: contactMethodRecord["text"], - color: contactMethodRecord["color"], - icon: { - url: contactMethodRecord["icon"]["filename_disk"], - width: contactMethodRecord["icon"]["width"], - height: contactMethodRecord["icon"]["height"] - } - }); - - dates.push(contactMethodRecord["date_created"]); - dates.push(contactMethodRecord["date_updated"]); - dates.push(contactMethodRecord["icon"]["created_on"]); - }); - - components.push(contactComponent); - dates.push(component["c_created"]); - dates.push(component["c_updated"]); - - break; - case "Last_Blogs": - let lastBlogsComponent: LastBlogsComponent = { - component: "LastBlogs", - id: component["lb_id"], - title: component["lb_title"], - readMoreButtonText: component["lb_read_more_button_text"], - amount: component["lb_amount"] - }; - - components.push(lastBlogsComponent); - dates.push(component["lb_created"]); - dates.push(component["lb_updated"]); - - break; - case "Last_Projects": - let lastProjectsComponent: LastProjectsComponent = { - component: "LastProjects", - id: component["lp_id"], - title: component["lp_title"], - readMoreButtonText: component["lp_read_more_button_text"], - amount: component["lp_amount"] - }; - - components.push(lastProjectsComponent); - dates.push(component["lp_created"]); - dates.push(component["lp_updated"]); - - break; - case "Last_Galleries": - let lastGalleriesComponent: LastGalleriesComponent = { - component: "LastGalleries", - id: component["lg_id"], - title: component["lg_title"], - readMoreButtonText: component["lg_read_more_button_text"], - amount: component["lg_amount"] - }; - - components.push(lastGalleriesComponent); - dates.push(component["lg_created"]); - dates.push(component["lg_updated"]); - - break; - default: - break; - } - }); - - let lastModified: Date; - - if (dates.filter(e => e !== null).length === 0) { - lastModified = new Date(); - } - else { - const sortedDates: string[] = dates.sort((a: string, b: string) => { - return new Date(b).getTime() - new Date(a).getTime(); - }); - - lastModified = new Date(sortedDates[0]); - } - - let page: WebPage = { - id: pageRecord["id"], - lastModified: lastModified, - url: pageRecord["url"], - searchEngine: { - title: searchEngine["title"], - description: searchEngine["description"], - canonical: searchEngine["canonical"], - allowCrawlers: searchEngine["allow_crawler"], - priority: searchEngine["priority"], - thumbnail: { - url: searchEngine["thumbnail"]["filename_disk"], - height: searchEngine["thumbnail"]["height"], - width: searchEngine["thumbnail"]["width"] - } - }, - components: components - } - - pages.push(page); + pages.push(dataToPage(pageRecord)); }); return pages;