import { formatDate } from "@/lib/dates"; import { createDirectusConnection } from "@/lib/directus"; import { print } from "graphql"; import getProjects from '@/graphql/projects/getProjects.graphql'; import getProjectPost from '@/graphql/projects/getProject.graphql'; import getLastProjectsQuery from '@/graphql/projects/getLastProjects.graphql'; import { getImageSize, getImageUrl } from "@/lib/images"; import { getImage } from "astro:assets"; export async function getAllProjects(settings: GlobalSettings): Promise { const client = await createDirectusConnection(); const result = await client.query(print(getProjects), { date: formatDate(new Date(), "%Y-%M-%D") }); let projects: ProjectPost[] = []; result["Projects"].forEach((projectRecord: any) => { let dates: string[] = [ settings.project.lastModified.toISOString(), settings.website.lastModified.toISOString(), projectRecord["date_created"], projectRecord["date_updated"], projectRecord["search_engine"][0]["date_created"], projectRecord["search_engine"][0]["date_updated"], projectRecord["search_engine"][0]["thumbnail"]["created_on"] ]; const projectThumbnailImage = getImageSize(projectRecord["search_engine"][0]["thumbnail"]["width"], projectRecord["search_engine"][0]["thumbnail"]["height"], 0.756); const project: ProjectPost = { exists: true, type: "ProjectPost", lastModified: new Date(), id: projectRecord["id"], title: projectRecord["title"], content: projectRecord["content"], date: projectRecord["date"], url: projectRecord["url"], thumbnail: { url: getImageUrl(projectRecord["search_engine"][0]["thumbnail"]["filename_disk"]), width: projectRecord["search_engine"][0]["thumbnail"]["width"], height: projectRecord["search_engine"][0]["thumbnail"]["height"] }, searchEngine: { title: projectRecord["search_engine"][0]["title"], description: projectRecord["search_engine"][0]["description"], allowCrawlers: projectRecord["search_engine"][0]["allow_crawler"], canonical: projectRecord["search_engine"][0]["canonical"], priority: projectRecord["search_engine"][0]["priority"], thumbnail: { url: getImageUrl(projectRecord["search_engine"][0]["thumbnail"]["filename_disk"]), width: projectThumbnailImage.width, height: projectThumbnailImage.height } }, tags: [] }; projectRecord["tags"].forEach((tagRecord: any) => { project["tags"].push({ text: tagRecord["Tags_id"]["text"], code: tagRecord["Tags_id"]["code"], color: tagRecord["Tags_id"]["color"] }); dates.push(tagRecord["Tags_id"]["date_created"]); dates.push(tagRecord["Tags_id"]["date_updated"]); }); if (dates.filter(e => e !== null).length === 0) { project.lastModified = new Date(); } else { const sortedDates: string[] = dates.sort((a: string, b: string) => { return new Date(b).getTime() - new Date(a).getTime(); }); project.lastModified = new Date(sortedDates[0]); } projects.push(project); }); return projects; } export async function getProject(settings: GlobalSettings, route: string): Promise { const client = await createDirectusConnection(); const result = await client.query(print(getProjectPost), { route: route }); const projectRecord = result["Projects"][0]; let dates: string[] = [ settings.project.lastModified.toISOString(), settings.website.lastModified.toISOString(), projectRecord["date_created"], projectRecord["date_updated"], projectRecord["search_engine"][0]["date_created"], projectRecord["search_engine"][0]["date_updated"], projectRecord["search_engine"][0]["thumbnail"]["created_on"] ]; const projectThumbnailImage = getImageSize(projectRecord["search_engine"][0]["thumbnail"]["width"], projectRecord["search_engine"][0]["thumbnail"]["height"], 0.756); const thumbnail = await getImage({ src: getImageUrl(projectRecord["search_engine"][0]["thumbnail"]["filename_disk"]), width: projectThumbnailImage.width, height: projectThumbnailImage.height, format: "jpeg" }); const project: ProjectPost = { type: "ProjectPost", exists: true, lastModified: new Date(), id: projectRecord["id"], title: projectRecord["title"], content: projectRecord["content"], date: projectRecord["date"], url: projectRecord["url"], thumbnail: { url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], width: projectRecord["search_engine"][0]["thumbnail"]["width"], height: projectRecord["search_engine"][0]["thumbnail"]["height"] }, searchEngine: { title: projectRecord["search_engine"][0]["title"], description: projectRecord["search_engine"][0]["description"], allowCrawlers: projectRecord["search_engine"][0]["allow_crawler"], canonical: projectRecord["search_engine"][0]["canonical"], priority: projectRecord["search_engine"][0]["priority"], thumbnail: { url: `${settings.website.domainName}${thumbnail.src}`, width: projectThumbnailImage.width, height: projectThumbnailImage.height } }, tags: [] }; projectRecord["tags"].forEach((tagRecord: any) => { project["tags"].push({ text: tagRecord["Tags_id"]["text"], code: tagRecord["Tags_id"]["code"], color: tagRecord["Tags_id"]["color"] }); dates.push(tagRecord["Tags_id"]["date_created"]); dates.push(tagRecord["Tags_id"]["date_updated"]); }); if (dates.filter(e => e !== null).length === 0) { project.lastModified = new Date(); } else { const sortedDates: string[] = dates.sort((a: string, b: string) => { return new Date(b).getTime() - new Date(a).getTime(); }); project.lastModified = new Date(sortedDates[0]); } return project; } export async function getLastProjects(amount: number): Promise { const client = await createDirectusConnection(); const result = await client.query(print(getLastProjectsQuery), { date: formatDate(new Date(), "%Y-%M-%D"), amount: amount }); let projects: ProjectPost[] = []; result["Projects"].forEach((projectRecord: any) => { let dates: string[] = [ projectRecord["date_created"], projectRecord["date_updated"], projectRecord["search_engine"][0]["date_created"], projectRecord["search_engine"][0]["date_updated"], projectRecord["search_engine"][0]["thumbnail"]["created_on"] ]; const projectThumbnailImage = getImageSize(projectRecord["search_engine"][0]["thumbnail"]["width"], projectRecord["search_engine"][0]["thumbnail"]["height"], 0.756) const project: ProjectPost = { exists: true, type: "ProjectPost", lastModified: new Date(), id: projectRecord["id"], title: projectRecord["title"], content: projectRecord["content"], date: projectRecord["date"], url: projectRecord["url"], thumbnail: { url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], width: projectRecord["search_engine"][0]["thumbnail"]["width"], height: projectRecord["search_engine"][0]["thumbnail"]["height"] }, searchEngine: { title: projectRecord["search_engine"][0]["title"], description: projectRecord["search_engine"][0]["description"], allowCrawlers: projectRecord["search_engine"][0]["allow_crawler"], canonical: projectRecord["search_engine"][0]["canonical"], priority: projectRecord["search_engine"][0]["priority"], thumbnail: { url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], width: projectThumbnailImage.width, height: projectThumbnailImage.height } }, tags: [] }; projectRecord["tags"].forEach((tagRecord: any) => { project["tags"].push({ text: tagRecord["Tags_id"]["text"], code: tagRecord["Tags_id"]["code"], color: tagRecord["Tags_id"]["color"] }); dates.push(tagRecord["Tags_id"]["date_created"]); dates.push(tagRecord["Tags_id"]["date_updated"]); }); if (dates.filter(e => e !== null).length === 0) { project.lastModified = new Date(); } else { const sortedDates: string[] = dates.sort((a: string, b: string) => { return new Date(b).getTime() - new Date(a).getTime(); }); project.lastModified = new Date(sortedDates[0]); } projects.push(project); }); return projects; } export async function getAllPaginatedProjects(settings: GlobalSettings, page: number): Promise { const client = await createDirectusConnection(); const result = await client.query(print(getProjects), { date: formatDate(new Date(), "%Y-%M-%D"), limit: 6, pageNumber: page }); let projects: ProjectPost[] = []; result["Projects"].forEach((projectRecord: any) => { let dates: string[] = [ settings.project.lastModified.toISOString(), settings.website.lastModified.toISOString(), projectRecord["date_created"], projectRecord["date_updated"], projectRecord["search_engine"][0]["date_created"], projectRecord["search_engine"][0]["date_updated"], projectRecord["search_engine"][0]["thumbnail"]["created_on"] ]; const projectThumbnailImage = getImageSize(projectRecord["search_engine"][0]["thumbnail"]["width"], projectRecord["search_engine"][0]["thumbnail"]["height"], 0.756) const project: ProjectPost = { exists: true, type: "ProjectPost", lastModified: new Date(), id: projectRecord["id"], title: projectRecord["title"], content: projectRecord["content"], date: projectRecord["date"], url: projectRecord["url"], thumbnail: { url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], width: projectRecord["search_engine"][0]["thumbnail"]["width"], height: projectRecord["search_engine"][0]["thumbnail"]["height"] }, searchEngine: { title: projectRecord["search_engine"][0]["title"], description: projectRecord["search_engine"][0]["description"], allowCrawlers: projectRecord["search_engine"][0]["allow_crawler"], canonical: projectRecord["search_engine"][0]["canonical"], priority: projectRecord["search_engine"][0]["priority"], thumbnail: { url: projectRecord["search_engine"][0]["thumbnail"]["filename_disk"], width: projectThumbnailImage.width, height: projectThumbnailImage.height } }, tags: [] }; projectRecord["tags"].forEach((tagRecord: any) => { project["tags"].push({ text: tagRecord["Tags_id"]["text"], code: tagRecord["Tags_id"]["code"], color: tagRecord["Tags_id"]["color"] }); dates.push(tagRecord["Tags_id"]["date_created"]); dates.push(tagRecord["Tags_id"]["date_updated"]); }); if (dates.filter(e => e !== null).length === 0) { project.lastModified = new Date(); } else { const sortedDates: string[] = dates.sort((a: string, b: string) => { return new Date(b).getTime() - new Date(a).getTime(); }); project.lastModified = new Date(sortedDates[0]); } projects.push(project); }); return projects; }