Add page routing and content fetchers
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
import { createDirectusConnection } from "@/lib/directus";
|
import { createDirectusConnection } from "@/lib/directus";
|
||||||
import { print } from 'graphql';
|
import { print } from 'graphql';
|
||||||
import getBlogs from '@/graphql/blogs/getBlogs.graphql';
|
import getBlogs from '@/graphql/blogs/getBlogs.graphql';
|
||||||
|
import getBlogPost from '@/graphql/blogs/getBlog.graphql';
|
||||||
import { formatDate } from "@/lib/dates";
|
import { formatDate } from "@/lib/dates";
|
||||||
|
|
||||||
export async function getAllBlogs(settings: GlobalSettings): Promise<BlogPost[]> {
|
export async function getAllBlogs(settings: GlobalSettings): Promise<BlogPost[]> {
|
||||||
@@ -23,6 +24,8 @@ export async function getAllBlogs(settings: GlobalSettings): Promise<BlogPost[]>
|
|||||||
];
|
];
|
||||||
|
|
||||||
const blog: BlogPost = {
|
const blog: BlogPost = {
|
||||||
|
type: "BlogPost",
|
||||||
|
id: blogRecord["id"],
|
||||||
lastModified: new Date(),
|
lastModified: new Date(),
|
||||||
title: blogRecord["title"],
|
title: blogRecord["title"],
|
||||||
content: blogRecord["content"],
|
content: blogRecord["content"],
|
||||||
@@ -70,3 +73,69 @@ export async function getAllBlogs(settings: GlobalSettings): Promise<BlogPost[]>
|
|||||||
|
|
||||||
return blogs;
|
return blogs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getBlog(settings: GlobalSettings, route: string): Promise<BlogPost> {
|
||||||
|
const client = await createDirectusConnection();
|
||||||
|
const result = await client.query(print(getBlogPost), {
|
||||||
|
route: route
|
||||||
|
});
|
||||||
|
|
||||||
|
const blogRecord = result["Blogs"][0];
|
||||||
|
|
||||||
|
let dates: string[] = [
|
||||||
|
settings.blog.lastModified.toISOString(),
|
||||||
|
settings.website.lastModified.toISOString(),
|
||||||
|
blogRecord["date_created"],
|
||||||
|
blogRecord["date_updated"],
|
||||||
|
blogRecord["search_engine"][0]["date_created"],
|
||||||
|
blogRecord["search_engine"][0]["date_updated"],
|
||||||
|
blogRecord["search_engine"][0]["thumbnail"]["created_on"]
|
||||||
|
];
|
||||||
|
|
||||||
|
const blog: BlogPost = {
|
||||||
|
type: "BlogPost",
|
||||||
|
id: blogRecord["id"],
|
||||||
|
lastModified: new Date(),
|
||||||
|
title: blogRecord["title"],
|
||||||
|
content: blogRecord["content"],
|
||||||
|
date: blogRecord["date"],
|
||||||
|
url: blogRecord["url"],
|
||||||
|
searchEngine: {
|
||||||
|
title: blogRecord["search_engine"][0]["title"],
|
||||||
|
description: blogRecord["search_engine"][0]["description"],
|
||||||
|
allowCrawlers: blogRecord["search_engine"][0]["allow_crawler"],
|
||||||
|
canonical: blogRecord["search_engine"][0]["canonical"],
|
||||||
|
priority: blogRecord["search_engine"][0]["priority"],
|
||||||
|
thumbnail: {
|
||||||
|
url: blogRecord["search_engine"][0]["thumbnail"]["filename_disk"],
|
||||||
|
height: blogRecord["search_engine"][0]["thumbnail"]["height"],
|
||||||
|
width: blogRecord["search_engine"][0]["thumbnail"]["width"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
tags: []
|
||||||
|
};
|
||||||
|
|
||||||
|
blogRecord["tags"].forEach((tagRecord: any) => {
|
||||||
|
blog["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) {
|
||||||
|
blog.lastModified = new Date();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const sortedDates: string[] = dates.sort((a: string, b: string) => {
|
||||||
|
return new Date(b).getTime() - new Date(a).getTime();
|
||||||
|
});
|
||||||
|
|
||||||
|
blog.lastModified = new Date(sortedDates[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return blog;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { createDirectusConnection } from "@/lib/directus";
|
|||||||
import { print } from 'graphql';
|
import { print } from 'graphql';
|
||||||
import { formatDate } from "@/lib/dates";
|
import { formatDate } from "@/lib/dates";
|
||||||
import getAllPages from "@/graphql/pages/getAllPages.graphql";
|
import getAllPages from "@/graphql/pages/getAllPages.graphql";
|
||||||
|
import getPage from "@/graphql/pages/getPage.graphql";
|
||||||
|
|
||||||
export function dataToPage(pageRecord: any): WebPage {
|
export function dataToPage(pageRecord: any): WebPage {
|
||||||
let dates: string[] = [
|
let dates: string[] = [
|
||||||
@@ -285,6 +286,7 @@ export function dataToPage(pageRecord: any): WebPage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let page: WebPage = {
|
let page: WebPage = {
|
||||||
|
type: "Webpage",
|
||||||
id: pageRecord["id"],
|
id: pageRecord["id"],
|
||||||
lastModified: lastModified,
|
lastModified: lastModified,
|
||||||
url: pageRecord["url"],
|
url: pageRecord["url"],
|
||||||
@@ -320,3 +322,13 @@ export async function getAllWebpages(): Promise<WebPage[]> {
|
|||||||
|
|
||||||
return pages;
|
return pages;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getWebpage(route: string): Promise<WebPage | null> {
|
||||||
|
const client = await createDirectusConnection();
|
||||||
|
const result = await client.query(print(getPage), {
|
||||||
|
date: formatDate(new Date(), "%Y-%M-%D"),
|
||||||
|
route: route
|
||||||
|
});
|
||||||
|
|
||||||
|
return dataToPage(result["Pages"][0]);
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { createDirectusConnection } from "@/lib/directus";
|
import { createDirectusConnection } from "@/lib/directus";
|
||||||
import { print } from "graphql";
|
import { print } from "graphql";
|
||||||
import getAlbums from '@/graphql/photos/getAlbums.graphql';
|
import getAlbums from '@/graphql/photos/getAlbums.graphql';
|
||||||
|
import getAlbumItem from '@/graphql/photos/getAlbum.graphql';
|
||||||
import { formatDate } from "@/lib/dates";
|
import { formatDate } from "@/lib/dates";
|
||||||
|
|
||||||
export async function getAllAlbums(settings: GlobalSettings): Promise<PhotoAlbum[]> {
|
export async function getAllAlbums(settings: GlobalSettings): Promise<PhotoAlbum[]> {
|
||||||
@@ -21,6 +22,7 @@ export async function getAllAlbums(settings: GlobalSettings): Promise<PhotoAlbum
|
|||||||
];
|
];
|
||||||
|
|
||||||
const album: PhotoAlbum = {
|
const album: PhotoAlbum = {
|
||||||
|
type: "PhotoAlbum",
|
||||||
title: albumRecord["title"],
|
title: albumRecord["title"],
|
||||||
description: albumRecord["description"],
|
description: albumRecord["description"],
|
||||||
url: albumRecord["url"],
|
url: albumRecord["url"],
|
||||||
@@ -78,3 +80,76 @@ export async function getAllAlbums(settings: GlobalSettings): Promise<PhotoAlbum
|
|||||||
|
|
||||||
return albums;
|
return albums;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getAlbum(settings: GlobalSettings, route: string): Promise<PhotoAlbum> {
|
||||||
|
const client = await createDirectusConnection();
|
||||||
|
const result = await client.query(print(getAlbumItem), {
|
||||||
|
route: route
|
||||||
|
});
|
||||||
|
|
||||||
|
const albumRecord = result["Photo_Albums"][0];
|
||||||
|
|
||||||
|
let dates: string[] = [
|
||||||
|
settings.website.lastModified.toISOString(),
|
||||||
|
settings.photo.lastModified.toISOString(),
|
||||||
|
albumRecord["date_created"],
|
||||||
|
albumRecord["date_updated"],
|
||||||
|
albumRecord["thumbnail"]["created_on"],
|
||||||
|
];
|
||||||
|
|
||||||
|
const album: PhotoAlbum = {
|
||||||
|
type: "PhotoAlbum",
|
||||||
|
title: albumRecord["title"],
|
||||||
|
description: albumRecord["description"],
|
||||||
|
url: albumRecord["url"],
|
||||||
|
startDate: albumRecord["start_date"],
|
||||||
|
endDate: albumRecord["end_date"],
|
||||||
|
location: albumRecord["location"],
|
||||||
|
category: {
|
||||||
|
id: albumRecord["category"][0]["Photo_Categories_id"]["id"],
|
||||||
|
title: albumRecord["category"][0]["Photo_Categories_id"]["title"],
|
||||||
|
url: albumRecord["category"][0]["Photo_Categories_id"]["url"],
|
||||||
|
thumbnail: {
|
||||||
|
url: albumRecord["category"][0]["Photo_Categories_id"]["thumbnail"]["filename_disk"],
|
||||||
|
height: albumRecord["category"][0]["Photo_Categories_id"]["thumbnail"]["height"],
|
||||||
|
width: albumRecord["category"][0]["Photo_Categories_id"]["thumbnail"]["width"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
thumbnail: {
|
||||||
|
url: albumRecord["thumbnail"]["filename_download"],
|
||||||
|
height: albumRecord["thumbnail"]["height"],
|
||||||
|
width: albumRecord["thumbnail"]["width"]
|
||||||
|
},
|
||||||
|
photos: [],
|
||||||
|
lastModified: new Date()
|
||||||
|
};
|
||||||
|
|
||||||
|
albumRecord["photos"].forEach((photoRecord: any) => {
|
||||||
|
album.photos.push({
|
||||||
|
id: photoRecord["id"],
|
||||||
|
photo: {
|
||||||
|
url: photoRecord["photo"]["filename_disk"],
|
||||||
|
width: photoRecord["photo"]["width"],
|
||||||
|
height: photoRecord["photo"]["height"]
|
||||||
|
},
|
||||||
|
text: photoRecord["text"]
|
||||||
|
});
|
||||||
|
|
||||||
|
dates.push(photoRecord["date_created"]);
|
||||||
|
dates.push(photoRecord["date_updated"]);
|
||||||
|
dates.push(photoRecord["photo"]["created_on"]);
|
||||||
|
});
|
||||||
|
|
||||||
|
if (dates.filter(e => e !== null).length === 0) {
|
||||||
|
album.lastModified = new Date();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const sortedDates: string[] = dates.sort((a: string, b: string) => {
|
||||||
|
return new Date(b).getTime() - new Date(a).getTime();
|
||||||
|
});
|
||||||
|
|
||||||
|
album.lastModified = new Date(sortedDates[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
return album;
|
||||||
|
}
|
||||||
|
|||||||
@@ -22,4 +22,4 @@ export async function getAllCategories(settings: GlobalSettings): Promise<PhotoA
|
|||||||
});
|
});
|
||||||
|
|
||||||
return categories;
|
return categories;
|
||||||
}
|
}
|
||||||
|
|||||||
30
astro/src/content/photos/photos.ts
Normal file
30
astro/src/content/photos/photos.ts
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
import { createDirectusConnection } from "@/lib/directus";
|
||||||
|
import { print } from "graphql";
|
||||||
|
import getPhotos from '@/graphql/photos/getPhotos.graphql';
|
||||||
|
import md5 from "md5";
|
||||||
|
|
||||||
|
export async function getPhotoFromHash(albumUrl: string, hash: string): Promise<PhotoAlbumPhoto | null> {
|
||||||
|
const client = await createDirectusConnection();
|
||||||
|
const result = await client.query(print(getPhotos));
|
||||||
|
|
||||||
|
result["Photo_Albums"][0]["photos"].forEach((photo: any) => {
|
||||||
|
const hashObject = md5(JSON.stringify({
|
||||||
|
id: photo.id,
|
||||||
|
url: photo.photo.url,
|
||||||
|
width: photo.photo.width,
|
||||||
|
height: photo.photo.height
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (hash.substring(hash.length - 10) === hash) {
|
||||||
|
return {
|
||||||
|
id: photo.id,
|
||||||
|
text: photo.text,
|
||||||
|
photo: {
|
||||||
|
url: photo.photo.url,
|
||||||
|
width: photo.photo.width,
|
||||||
|
height: photo.photo.height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -2,7 +2,7 @@ import { formatDate } from "@/lib/dates";
|
|||||||
import { createDirectusConnection } from "@/lib/directus";
|
import { createDirectusConnection } from "@/lib/directus";
|
||||||
import { print } from "graphql";
|
import { print } from "graphql";
|
||||||
import getProjects from '@/graphql/projects/getProjects.graphql';
|
import getProjects from '@/graphql/projects/getProjects.graphql';
|
||||||
|
import getProjectPost from '@/graphql/projects/getProject.graphql';
|
||||||
|
|
||||||
export async function getAllProjects(settings: GlobalSettings): Promise<ProjectPost[]> {
|
export async function getAllProjects(settings: GlobalSettings): Promise<ProjectPost[]> {
|
||||||
const client = await createDirectusConnection();
|
const client = await createDirectusConnection();
|
||||||
@@ -71,3 +71,67 @@ export async function getAllProjects(settings: GlobalSettings): Promise<ProjectP
|
|||||||
|
|
||||||
return projects;
|
return projects;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function getProject(settings: GlobalSettings, route: string): Promise<ProjectPost> {
|
||||||
|
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 project: ProjectPost = {
|
||||||
|
lastModified: new Date(),
|
||||||
|
title: projectRecord["title"],
|
||||||
|
content: projectRecord["content"],
|
||||||
|
date: projectRecord["date"],
|
||||||
|
url: projectRecord["url"],
|
||||||
|
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"],
|
||||||
|
height: projectRecord["search_engine"][0]["thumbnail"]["height"],
|
||||||
|
width: projectRecord["search_engine"][0]["thumbnail"]["width"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
|||||||
39
astro/src/graphql/blogs/getBlog.graphql
Normal file
39
astro/src/graphql/blogs/getBlog.graphql
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
query getAllBlogs($route: String!) {
|
||||||
|
Blogs(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, url: { _eq: $route } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
status,
|
||||||
|
title,
|
||||||
|
url,
|
||||||
|
date,
|
||||||
|
content,
|
||||||
|
tags {
|
||||||
|
Tags_id {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
text,
|
||||||
|
code,
|
||||||
|
color
|
||||||
|
}
|
||||||
|
},
|
||||||
|
search_engine {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
canonical,
|
||||||
|
allow_crawler,
|
||||||
|
priority
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
query getAllBlogs($date: String!) {
|
query getAllBlogs($date: String!) {
|
||||||
Blogs(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, date: { _gte: $date } }) {
|
Blogs(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, date: { _lte: $date } }) {
|
||||||
id,
|
id,
|
||||||
date_created,
|
date_created,
|
||||||
date_updated,
|
date_updated,
|
||||||
|
|||||||
216
astro/src/graphql/pages/getPage.graphql
Normal file
216
astro/src/graphql/pages/getPage.graphql
Normal file
@@ -0,0 +1,216 @@
|
|||||||
|
query getAllPages($date: String!, $route: String!) {
|
||||||
|
Pages(filter: { status: { _eq: "published" }, url: { _eq: $route } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
status,
|
||||||
|
url,
|
||||||
|
search_engine {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
canonical,
|
||||||
|
allow_crawler,
|
||||||
|
priority
|
||||||
|
},
|
||||||
|
components {
|
||||||
|
id,
|
||||||
|
__typename,
|
||||||
|
item {
|
||||||
|
__typename,
|
||||||
|
|
||||||
|
...on Hero {
|
||||||
|
hero_id: id,
|
||||||
|
hero_created: date_created,
|
||||||
|
hero_updated: date_updated,
|
||||||
|
hero_title: title,
|
||||||
|
hero_text: subtext,
|
||||||
|
background_image {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
hero_image: background_image {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
background_image {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Text_With_Side_Image {
|
||||||
|
twsi_id: id,
|
||||||
|
twsi_created: date_created,
|
||||||
|
twsi_updated: date_updated,
|
||||||
|
twsi_title: title,
|
||||||
|
twsi_text: text,
|
||||||
|
image {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
twsi_image_side: image_side
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Wall_Of_Text {
|
||||||
|
wot_id: id,
|
||||||
|
wot_created: date_created,
|
||||||
|
wot_updated: date_updated,
|
||||||
|
wot_title: title,
|
||||||
|
wot_text: text
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Frequently_Asked_Questions {
|
||||||
|
faq_id: id,
|
||||||
|
faq_created: date_created,
|
||||||
|
faq_updated: date_updated,
|
||||||
|
faq_title: title,
|
||||||
|
faq_text: text,
|
||||||
|
questions {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
question,
|
||||||
|
answer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Upcoming_Events {
|
||||||
|
ue_id: id,
|
||||||
|
ue_created: date_created,
|
||||||
|
ue_updated: date_updated,
|
||||||
|
ue_title: title,
|
||||||
|
ue_text: text,
|
||||||
|
events(filter: { start_date: { _gte: $date } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
location,
|
||||||
|
map_location,
|
||||||
|
start_date,
|
||||||
|
end_date
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Equipment_Table {
|
||||||
|
et_id: id,
|
||||||
|
et_created: date_created,
|
||||||
|
et_updated: date_updated,
|
||||||
|
et_title: title,
|
||||||
|
et_text: text,
|
||||||
|
items {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
text,
|
||||||
|
icon {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Review_List {
|
||||||
|
rl_id: id,
|
||||||
|
rl_created: date_created,
|
||||||
|
rl_updated: date_updated,
|
||||||
|
rl_title: title,
|
||||||
|
rl_text: text,
|
||||||
|
reviews(sort: ["date"], filter: { status: { _eq: "published" } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
name,
|
||||||
|
review,
|
||||||
|
date,
|
||||||
|
stars,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Contact {
|
||||||
|
c_id: id,
|
||||||
|
c_created: date_created,
|
||||||
|
c_updated: date_updated,
|
||||||
|
c_title: title,
|
||||||
|
c_text: text,
|
||||||
|
methods {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
text,
|
||||||
|
icon {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
color
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Last_Blogs {
|
||||||
|
lb_id: id,
|
||||||
|
lb_created: date_created,
|
||||||
|
lb_updated: date_updated,
|
||||||
|
lb_title: title,
|
||||||
|
lb_read_more_button_text: read_more_button_text,
|
||||||
|
lb_amount: amount
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Last_Projects {
|
||||||
|
lp_id: id,
|
||||||
|
lp_created: date_created,
|
||||||
|
lp_updated: date_updated,
|
||||||
|
lp_title: title,
|
||||||
|
lp_read_more_button_text: read_more_button_text,
|
||||||
|
lp_amount: amount
|
||||||
|
}
|
||||||
|
|
||||||
|
...on Last_Galleries {
|
||||||
|
lg_id: id,
|
||||||
|
lg_created: date_created,
|
||||||
|
lg_updated: date_updated,
|
||||||
|
lg_title: title,
|
||||||
|
lg_read_more_button_text: read_more_button_text,
|
||||||
|
lg_amount: amount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
51
astro/src/graphql/photos/getAlbum.graphql
Normal file
51
astro/src/graphql/photos/getAlbum.graphql
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
query getAllAlbums($route: String!) {
|
||||||
|
Photo_Albums(sort: ["-start_date", "-date_created"], filter: { status: { _eq: "published" }, url: { _eq: $route }, category: { Photo_Categories_id: { status: { _eq: "published" } } } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
url,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_download,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
start_date,
|
||||||
|
end_date,
|
||||||
|
location,
|
||||||
|
category {
|
||||||
|
Photo_Categories_id {
|
||||||
|
id,
|
||||||
|
status,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
url,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_download,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
photos(filter: { status: { _eq: "published" } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
photo {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
text,
|
||||||
|
sort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
51
astro/src/graphql/photos/getPhotos.graphql
Normal file
51
astro/src/graphql/photos/getPhotos.graphql
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
query getPhotos {
|
||||||
|
Photo_Albums(sort: ["-start_date", "-date_created"], filter: { status: { _eq: "published" }, url: { _eq: "/mirai-nexus-2026" }, category: { Photo_Categories_id: { status: { _eq: "published" } } } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
url,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_download,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
start_date,
|
||||||
|
end_date,
|
||||||
|
location,
|
||||||
|
category {
|
||||||
|
Photo_Categories_id {
|
||||||
|
id,
|
||||||
|
status,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
url,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_download,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
photos(filter: { status: { _eq: "published" } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
photo {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_disk,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
text,
|
||||||
|
sort
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
39
astro/src/graphql/projects/getProject.graphql
Normal file
39
astro/src/graphql/projects/getProject.graphql
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
query getAllProjects($route: String!) {
|
||||||
|
Projects(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, url: { _eq: $route } }) {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
status,
|
||||||
|
title,
|
||||||
|
url,
|
||||||
|
date,
|
||||||
|
content,
|
||||||
|
tags {
|
||||||
|
Tags_id {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
text,
|
||||||
|
code,
|
||||||
|
color
|
||||||
|
}
|
||||||
|
},
|
||||||
|
search_engine {
|
||||||
|
id,
|
||||||
|
date_created,
|
||||||
|
date_updated,
|
||||||
|
title,
|
||||||
|
description,
|
||||||
|
thumbnail {
|
||||||
|
id,
|
||||||
|
created_on,
|
||||||
|
filename_download,
|
||||||
|
width,
|
||||||
|
height
|
||||||
|
},
|
||||||
|
canonical,
|
||||||
|
allow_crawler,
|
||||||
|
priority
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
query getAllProjects($date: String!) {
|
query getAllProjects($date: String!) {
|
||||||
Projects(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, date: { _gte: $date } }) {
|
Projects(sort: ["-date", "-date_created"], filter: { status: { _eq: "published" }, date: { _lte: $date } }) {
|
||||||
id,
|
id,
|
||||||
date_created,
|
date_created,
|
||||||
date_updated,
|
date_updated,
|
||||||
|
|||||||
203
astro/src/lib/pages.ts
Normal file
203
astro/src/lib/pages.ts
Normal file
@@ -0,0 +1,203 @@
|
|||||||
|
import { getBlog } from "@/content/blogs/blogs";
|
||||||
|
import { getWebpage } from "@/content/pages/pages";
|
||||||
|
import { getAlbum } from "@/content/photos/albums";
|
||||||
|
import { getPhotoFromHash } from "@/content/photos/photos";
|
||||||
|
import { getProject } from "@/content/projects/projects";
|
||||||
|
|
||||||
|
export async function getPage(settings: GlobalSettings, route: string): Promise<PageType | null> {
|
||||||
|
// Blog Index
|
||||||
|
if (regexToRoute({ template: settings.blog.indexRouteTemplate, allowPagination: true }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.blog.indexRouteTemplate, allowPagination: true });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "BlogIndex",
|
||||||
|
page: {
|
||||||
|
type: "BlogIndex",
|
||||||
|
pageNumber: params["page"] !== undefined ? Number(params["page"]) : 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Blog Post
|
||||||
|
else if (regexToRoute({ template: settings.blog.blogRouteTemplate, allowPagination: false }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.blog.blogRouteTemplate, allowPagination: false });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
const blog = await getBlog(settings, `/${params["R"]}`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "BlogPost",
|
||||||
|
page: blog
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Project Index
|
||||||
|
else if (regexToRoute({ template: settings.project.indexRouteTemplate, allowPagination: true }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.project.indexRouteTemplate, allowPagination: true });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "ProjectIndex",
|
||||||
|
page: null
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Project Post
|
||||||
|
else if (regexToRoute({ template: settings.project.projectRouteTemplate, allowPagination: false }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.project.projectRouteTemplate, allowPagination: false });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
const project = await getProject(settings, `/${params["R"]}`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "ProjectPost",
|
||||||
|
page: project
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Photo Category Index
|
||||||
|
else if (regexToRoute({ template: settings.photo.categoryIndex.indexRouteTemplate, allowPagination: false }).regex.test(route)) {
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "PhotoCategoryIndex",
|
||||||
|
page: {
|
||||||
|
type: "PhotoCategoryIndex"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Photo Category / Album List
|
||||||
|
else if (regexToRoute({ template: settings.photo.category.routeTemplate, allowPagination: true }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.photo.category.routeTemplate, allowPagination: true });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "PhotoCategory",
|
||||||
|
page: {
|
||||||
|
type: "PhotoCategory",
|
||||||
|
category: params["category"],
|
||||||
|
pageNumber: params["page"] !== undefined ? Number(params["page"]) : 1
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Photo Album
|
||||||
|
else if (regexToRoute({ template: settings.photo.album.routeTemplate, allowPagination: true }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.photo.album.routeTemplate, allowPagination: true });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
const photoAlbum = await getAlbum(settings, `/${params["R"]}`);
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "PhotoAlbum",
|
||||||
|
page: photoAlbum
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// Photograph
|
||||||
|
else if (regexToRoute({ template: settings.photo.photo.routeTemplate, allowPagination: false }).regex.test(route)) {
|
||||||
|
const { regex, keys } = regexToRoute({ template: settings.photo.photo.routeTemplate, allowPagination: false });
|
||||||
|
const match = route.match(regex);
|
||||||
|
const params: Record<string, string> = {};
|
||||||
|
|
||||||
|
if (!match) return null;
|
||||||
|
|
||||||
|
keys.forEach((key, i) => {
|
||||||
|
params[key] = match[i + 1];
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log(params);
|
||||||
|
const photo = await getPhotoFromHash(`/${params["R"]}`, params["H"]);
|
||||||
|
|
||||||
|
if (photo === null) {}
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "Photo",
|
||||||
|
page: {
|
||||||
|
type: "PhotoPage",
|
||||||
|
id: photo!.id,
|
||||||
|
photo: photo!.photo,
|
||||||
|
text: photo!.text
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else if (regexToRoute({ template: "/", allowPagination: false }).regex.test(route) ||
|
||||||
|
regexToRoute({ template: "/%R", allowPagination: false }).regex.test(route)) {
|
||||||
|
const webpageContent = await getWebpage(route);
|
||||||
|
|
||||||
|
return {
|
||||||
|
route: route,
|
||||||
|
pageType: "Webpage",
|
||||||
|
page: webpageContent
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function regexToRoute(template: PageRegexMatchProps) {
|
||||||
|
const keys: string[] = [];
|
||||||
|
|
||||||
|
let pattern = template.template
|
||||||
|
.replaceAll("%Y", () => { keys.push("Y"); return "(\\d{4})"; })
|
||||||
|
.replaceAll("%M", () => { keys.push("M"); return "(\\d{2})"; })
|
||||||
|
.replaceAll("%D", () => { keys.push("D"); return "(\\d{2})"; })
|
||||||
|
.replaceAll("%R", () => { keys.push("R"); return "([^/]+)"; })
|
||||||
|
.replaceAll("%C", () => { keys.push("C"); return "([^/]+)"; })
|
||||||
|
.replaceAll("%H", () => { keys.push("H"); return "([^/]+)"; })
|
||||||
|
.replace(/\/+/g, "/");
|
||||||
|
|
||||||
|
if (template.allowPagination) {
|
||||||
|
keys.push("page");
|
||||||
|
pattern += "(?:\\/(\\d+))?";
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
regex: new RegExp(`^${pattern}$`),
|
||||||
|
keys
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -17,6 +17,15 @@ export async function getAllRoutesList(settings: GlobalSettings): Promise<string
|
|||||||
if (settings.blog.enabled) {
|
if (settings.blog.enabled) {
|
||||||
const blogs = await getAllBlogs(settings);
|
const blogs = await getAllBlogs(settings);
|
||||||
|
|
||||||
|
for (let i = 0; i < Math.ceil(blogs.length / 6); i++) {
|
||||||
|
if (i !== 0) {
|
||||||
|
routes.push(`${settings.blog.indexRouteTemplate}/${i + 1}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
routes.push(settings.blog.indexRouteTemplate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
blogs.forEach((blog) => {
|
blogs.forEach((blog) => {
|
||||||
routes.push(getBlogRoute(settings.blog, blog));
|
routes.push(getBlogRoute(settings.blog, blog));
|
||||||
});
|
});
|
||||||
@@ -24,6 +33,15 @@ export async function getAllRoutesList(settings: GlobalSettings): Promise<string
|
|||||||
if (settings.project.enabled) {
|
if (settings.project.enabled) {
|
||||||
const projects = await getAllProjects(settings);
|
const projects = await getAllProjects(settings);
|
||||||
|
|
||||||
|
for (let i = 0; i < Math.ceil(projects.length / 4); i++) {
|
||||||
|
if (i !== 0) {
|
||||||
|
routes.push(`${settings.project.indexRouteTemplate}/${i + 1}`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
routes.push(settings.project.indexRouteTemplate);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
projects.forEach((project) => {
|
projects.forEach((project) => {
|
||||||
routes.push(getProjectRoute(settings.project, project));
|
routes.push(getProjectRoute(settings.project, project));
|
||||||
});
|
});
|
||||||
@@ -32,6 +50,8 @@ export async function getAllRoutesList(settings: GlobalSettings): Promise<string
|
|||||||
const categories = await getAllCategories(settings);
|
const categories = await getAllCategories(settings);
|
||||||
const galleries = await getAllAlbums(settings);
|
const galleries = await getAllAlbums(settings);
|
||||||
|
|
||||||
|
routes.push(settings.photo.categoryIndex.indexRouteTemplate);
|
||||||
|
|
||||||
categories.forEach((category) => {
|
categories.forEach((category) => {
|
||||||
let albums = galleries.filter(g => g.category.id === category.id);
|
let albums = galleries.filter(g => g.category.id === category.id);
|
||||||
const pages = Math.ceil(albums.length / settings.photo.category.perPage);
|
const pages = Math.ceil(albums.length / settings.photo.category.perPage);
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
---
|
---
|
||||||
import { getAllWebpages } from "@/content/pages/pages";
|
|
||||||
import { getAllRoutesList } from "@/lib/routing";
|
import { getAllRoutesList } from "@/lib/routing";
|
||||||
|
import { getPage } from "@/lib/pages";
|
||||||
import { getSettings } from "@/content/settings/settings"
|
import { getSettings } from "@/content/settings/settings"
|
||||||
import WebpageLayout from "@/layouts/WebpageLayout.astro";
|
import WebpageLayout from "@/layouts/WebpageLayout.astro";
|
||||||
|
|
||||||
const settings = await getSettings();
|
const settings = await getSettings();
|
||||||
const routes = await getAllRoutesList(settings);
|
const routes = await getAllRoutesList(settings);
|
||||||
console.log(routes);
|
console.log(routes);
|
||||||
|
const page = await getPage(settings, "/album/2026/mirai-nexus-2026/6c0e4453ab");
|
||||||
|
console.log(page);
|
||||||
---
|
---
|
||||||
|
|
||||||
<WebpageLayout>
|
<WebpageLayout>
|
||||||
|
|||||||
8
astro/src/types/blogs/blog.d.ts
vendored
8
astro/src/types/blogs/blog.d.ts
vendored
@@ -1,4 +1,7 @@
|
|||||||
type BlogPost = {
|
type BlogPost = {
|
||||||
|
type: "BlogPost";
|
||||||
|
|
||||||
|
id: string;
|
||||||
title: string;
|
title: string;
|
||||||
url: string;
|
url: string;
|
||||||
date: string;
|
date: string;
|
||||||
@@ -10,3 +13,8 @@ type BlogPost = {
|
|||||||
|
|
||||||
lastModified: Date;
|
lastModified: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type BlogIndex = {
|
||||||
|
type: "BlogIndex";
|
||||||
|
pageNumber: number;
|
||||||
|
}
|
||||||
|
|||||||
19
astro/src/types/pages/page.d.ts
vendored
19
astro/src/types/pages/page.d.ts
vendored
@@ -1,4 +1,6 @@
|
|||||||
type WebPage = {
|
type WebPage = {
|
||||||
|
type: "Webpage";
|
||||||
|
|
||||||
id: string;
|
id: string;
|
||||||
lastModified: Date;
|
lastModified: Date;
|
||||||
|
|
||||||
@@ -19,3 +21,20 @@ type WebpageComponent =
|
|||||||
ReviewListComponent |
|
ReviewListComponent |
|
||||||
TextWithImageComponent |
|
TextWithImageComponent |
|
||||||
WallOfTextComponent;
|
WallOfTextComponent;
|
||||||
|
|
||||||
|
|
||||||
|
type PageRegexMatchProps = {
|
||||||
|
template: string;
|
||||||
|
allowPagination: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
type PageType = {
|
||||||
|
route: string;
|
||||||
|
pageType: "Webpage" | "BlogIndex" | "BlogPost" |
|
||||||
|
"ProjectIndex" | "ProjectPost" | "PhotoCategoryIndex" |
|
||||||
|
"PhotoCategory" | "PhotoAlbum" | "Photo";
|
||||||
|
page: WebPage | BlogPost | ProjectPost | BlogIndex |
|
||||||
|
ProjectIndex | PhotoCategoryIndex | PhotoCategory |
|
||||||
|
PhotoAlbum | PhotoPage | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
8
astro/src/types/photos/album.d.ts
vendored
8
astro/src/types/photos/album.d.ts
vendored
@@ -1,4 +1,6 @@
|
|||||||
type PhotoAlbum = {
|
type PhotoAlbum = {
|
||||||
|
type: "PhotoAlbum";
|
||||||
|
|
||||||
title: string;
|
title: string;
|
||||||
url: string;
|
url: string;
|
||||||
description: string | null;
|
description: string | null;
|
||||||
@@ -27,3 +29,9 @@ type PhotoAlbumPhoto = {
|
|||||||
photo: PhotoProps;
|
photo: PhotoProps;
|
||||||
text: string | null;
|
text: string | null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type PhotoCategory = {
|
||||||
|
type: "PhotoCategory";
|
||||||
|
category: string;
|
||||||
|
pageNumber: number;
|
||||||
|
}
|
||||||
|
|||||||
4
astro/src/types/photos/category.d.ts
vendored
4
astro/src/types/photos/category.d.ts
vendored
@@ -1,3 +1,3 @@
|
|||||||
type PhotoCategory = {
|
type PhotoCategoryIndex = {
|
||||||
|
type: "PhotoCategoryIndex";
|
||||||
}
|
}
|
||||||
|
|||||||
7
astro/src/types/photos/photo.d.ts
vendored
7
astro/src/types/photos/photo.d.ts
vendored
@@ -1,3 +1,6 @@
|
|||||||
type PhotoPhoto = {
|
type PhotoPage = {
|
||||||
|
type: "PhotoPage";
|
||||||
|
id: string;
|
||||||
|
photo: PhotoProps;
|
||||||
|
text: string | null;
|
||||||
}
|
}
|
||||||
|
|||||||
5
astro/src/types/projects/project.d.ts
vendored
5
astro/src/types/projects/project.d.ts
vendored
@@ -10,3 +10,8 @@ type ProjectPost = {
|
|||||||
|
|
||||||
lastModified: Date;
|
lastModified: Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ProjectIndex = {
|
||||||
|
type: "ProjectIndex";
|
||||||
|
pageNumber: number;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user