Make a function to get all website settings

This commit is contained in:
Quinn Hegeman
2026-03-07 19:22:06 +01:00
parent f914b7db1c
commit e23c077a05
10 changed files with 366 additions and 0 deletions

View File

@@ -0,0 +1,133 @@
import { print } from 'graphql';
import { createDirectusConnection } from "@/lib/directus";
import getSettingsQuery from '@/graphql/settings/settings.graphql';
export async function getSettings(): Promise<GlobalSettings> {
const client = await createDirectusConnection();
const result = await client.query(print(getSettingsQuery));
const websiteResults = result["Website_Settings"];
const websiteSettings: WebsiteSettings = {
domainName: websiteResults["domain_name"],
titleTemplate: websiteResults["title_template"],
applicationName: websiteResults["application_name"],
colors: {
primary: websiteResults["primary_color"],
secondary: websiteResults["secondary_color"]
},
author: {
name: websiteResults["author_name"],
url: websiteResults["author_url"]
},
owner: websiteResults["owner"],
designer: websiteResults["designer"],
developer: websiteResults["developer"],
copyright: websiteResults["copyright"],
twitter: {
id: websiteResults["twitter_id"],
handle: websiteResults["twitter_handle"]
}
};
const blogResults = result["Blog_Settings"];
const blogSettings: BlogSettings = {
enabled: blogResults["enabled"],
title: blogResults["title"],
subtext: blogResults["subtext"],
indexRouteTemplate: blogResults["index_route_template"],
blogRouteTemplate: blogResults["blog_route_template"]
};
const projectResults = result["Project_Settings"];
const projectSettings: ProjectSettings = {
enabled: projectResults["enabled"],
title: projectResults["title"],
subtext: projectResults["subtext"],
indexRouteTemplate: projectResults["index_route_template"],
projectRouteTemplate: projectResults["project_route_template"]
};
const photoResults = result["Photo_Settings"];
const photoSettings: WebsitePhotoSettings = {
enabled: photoResults["enabled"],
categoryIndex: {
indexRouteTemplate: photoResults["categories_index_route_template_url"]
},
category: {
routeTemplate: photoResults["category_route_template_url"],
perPage: photoResults["albums_per_category_page"],
icons: {
photos: {
url: photoResults["category_icons"]["photos_icon"]["filename_download"],
height: photoResults["category_icons"]["photos_icon"]["height"],
width: photoResults["category_icons"]["photos_icon"]["width"]
},
location: {
url: photoResults["category_icons"]["location_icon"]["filename_download"],
height: photoResults["category_icons"]["location_icon"]["height"],
width: photoResults["category_icons"]["location_icon"]["width"]
},
date: {
url: photoResults["category_icons"]["date_icon"]["filename_download"],
height: photoResults["category_icons"]["date_icon"]["height"],
width: photoResults["category_icons"]["date_icon"]["width"]
}
}
},
album: {
routeTemplate: photoResults["album_route_template_url"],
perPage: photoResults["photos_per_album_page"]
},
photo: {
routeTemplate: photoResults["photo_route_template_url"],
icons: {
previous: {
url: photoResults["photo_icons"]["previous_icon"]["filename_download"],
height: photoResults["photo_icons"]["previous_icon"]["height"],
width: photoResults["photo_icons"]["previous_icon"]["width"]
},
next: {
url: photoResults["photo_icons"]["next_icon"]["filename_download"],
height: photoResults["photo_icons"]["next_icon"]["height"],
width: photoResults["photo_icons"]["next_icon"]["width"]
},
close: {
url: photoResults["photo_icons"]["close_icon"]["filename_download"],
height: photoResults["photo_icons"]["close_icon"]["height"],
width: photoResults["photo_icons"]["close_icon"]["width"]
},
download: {
url: photoResults["photo_icons"]["download_icon"]["filename_download"],
height: photoResults["photo_icons"]["download_icon"]["height"],
width: photoResults["photo_icons"]["download_icon"]["width"]
}
}
}
};
const sitemapResults = result["Sitemap_Settings"];
const sitemapSettings: SitemapSettings = {
perPage: sitemapResults["per_page"]
};
const pluginResults = result["Plugin_Settings"];
const pluginSettings: PluginSettings = {
swetrix: {
id: pluginResults["swetrix_id"],
url: pluginResults["swetrix_url"]
}
}
if (pluginResults["swetrix_id"] === null && pluginResults["swetrix_url"] === null) {
pluginSettings.swetrix = null;
}
return {
website: websiteSettings,
blog: blogSettings,
project: projectSettings,
photo: photoSettings,
sitemap: sitemapSettings,
plugins: pluginSettings
}
}

View File

@@ -0,0 +1,124 @@
query getAllSettings {
Website_Settings {
id,
date_created,
date_updated,
domain_name,
title_template,
application_name,
primary_color,
secondary_color,
author_name,
author_url,
designer,
developer,
owner,
copyright,
twitter_id,
twitter_handle
},
Blog_Settings {
id,
date_created,
date_updated,
enabled,
title,
subtext,
index_route_template,
blog_route_template
},
Project_Settings {
id,
date_created,
date_updated,
enabled,
title,
subtext,
index_route_template,
project_route_template
},
Photo_Settings {
id,
date_created,
date_updated,
enabled,
categories_index_route_template_url,
category_route_template_url,
albums_per_category_page,
category_icons {
id,
date_created,
date_updated,
photos_icon {
id,
created_on,
filename_download,
width,
height
},
location_icon {
id,
created_on,
filename_download,
width,
height
},
date_icon {
id,
created_on,
filename_download,
width,
height
}
},
album_route_template_url,
photos_per_album_page,
photo_route_template_url,
photo_icons {
id,
date_created,
date_updated,
previous_icon {
id,
created_on,
filename_download,
width,
height
},
next_icon {
id,
created_on,
filename_download,
width,
height
},
close_icon {
id,
created_on,
filename_download,
width,
height
},
download_icon {
id,
created_on,
filename_download,
width,
height
}
}
},
Sitemap_Settings {
id,
date_created,
date_updated,
per_page
},
Plugin_Settings {
id,
date_created,
date_updated,
swetrix_id,
swetrix_url
}
}

View File

@@ -1,5 +1,8 @@
---
import { getSettings } from "@/content/settings/settings"
const settings = await getSettings();
console.log(settings);
---
<html lang="en">

9
astro/src/types/settings/blog.d.ts vendored Normal file
View File

@@ -0,0 +1,9 @@
type BlogSettings = {
enabled: string;
title: string;
subtext: string | null;
indexRouteTemplate: string;
blogRouteTemplate: string;
}

37
astro/src/types/settings/photo.d.ts vendored Normal file
View File

@@ -0,0 +1,37 @@
type WebsitePhotoSettings = {
enabled: boolean;
categoryIndex: WebsitePhotoSettingsCategoryIndex;
category: WebsitePhotoSettingsCategory;
album: WebsitePhotoSettingsAlbum;
photo: WebsitePhotoSettingsPhoto;
}
type WebsitePhotoSettingsCategoryIndex = {
indexRouteTemplate: string;
}
type WebsitePhotoSettingsCategory = {
routeTemplate: string;
perPage: number;
icons: {
photos: PhotoProps;
location: PhotoProps;
date: PhotoProps;
}
}
type WebsitePhotoSettingsAlbum = {
routeTemplate: string;
perPage: number;
}
type WebsitePhotoSettingsPhoto = {
routeTemplate: string;
icons: {
previous: PhotoProps;
next: PhotoProps;
close: PhotoProps;
download: PhotoProps;
}
}

8
astro/src/types/settings/plugin.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
type PluginSettings = {
swetrix: PluginSettingsSwetrix | null;
}
type PluginSettingsSwetrix = {
id: string | null;
url: string | null;
}

9
astro/src/types/settings/project.d.ts vendored Normal file
View File

@@ -0,0 +1,9 @@
type ProjectSettings = {
enabled: string;
title: string;
subtext: string | null;
indexRouteTemplate: string;
projectRouteTemplate: string;
}

8
astro/src/types/settings/setting.d.ts vendored Normal file
View File

@@ -0,0 +1,8 @@
type GlobalSettings = {
website: WebsiteSettings;
blog: BlogSettings;
project: ProjectSettings;
photo: WebsitePhotoSettings;
sitemap: SitemapSettings;
plugins: PluginSettings;
}

3
astro/src/types/settings/sitemap.d.ts vendored Normal file
View File

@@ -0,0 +1,3 @@
type SitemapSettings = {
perPage: number;
}

32
astro/src/types/settings/website.d.ts vendored Normal file
View File

@@ -0,0 +1,32 @@
type WebsiteSettings = {
domainName: string;
titleTemplate: string;
applicationName: string;
colors: WebsiteSettingsColors;
author: WebsiteSettingsAuthor;
owner: string;
designer: string;
developer: string;
copyright: string;
twitter: WebsiteSettingsTwitter;
}
type WebsiteSettingsColors = {
primary: string;
secondary: string | null;
}
type WebsiteSettingsAuthor = {
name: string;
url: string;
}
type WebsiteSettingsTwitter = {
id: string;
handle: string;
}