hypermedia blog

static site generator

hypermedia blog

src/models/blog.ts


import { db, isEmpty, quit } from "./db.js";

/*  ___     _   _  __
 *   | \_/ |_) |_ (_
 *   |  |  |   |_ __)
 */
export type BlogCats = {
	blog_cat_id: number;
	name: string;
	url: string;
}[];

export type BlogTags = {
	tag_id: number;
	name: string;
	url: string;
	count: number;
}[];

export type BlogMeta = {
	main: BlogCats;
	base: BlogCats;
	cats: BlogCats;
	tags: BlogTags;
};

export type BlogPost = {
	post_id: number;
	url: string;
	title: string;
	subtitle: string;
	excerpt: string;
	content: string;
	date: number;
	live: number;
	meta: BlogMeta;
}[];

/*   _           _ ___    _        __
 *  |_ | | |\ | /   |  | / \ |\ | (_
 *  |  |_| | \| \_  |  | \_/ | \| __)
 */
const getPostsRange = (limit: number, offset: number): BlogPost => {
	const results: any = db
		.query(
			`
SELECT * FROM blog_posts
WHERE live = 1
ORDER BY date DESC
LIMIT $offset, $limit;
    `,
		)
		.all({ $limit: limit, $offset: offset });
	return results;
};

export const getPost = (post_url: string): BlogPost => {
	const results: any = db
		.query(
			`
SELECT post_id, url, title, subtitle, excerpt, content, date, live
FROM blog_posts
WHERE url = $post_url
LIMIT 1;
    `,
		)
		.all({ $post_url: post_url });
	return results;
};

export const getPostCats = (post_id: number): BlogCats => {
	const results: any = db
		.query(
			`
SELECT c.blog_cat_id, c.name, c.url
FROM blog_meta m INNER JOIN blog_categories c
ON m.meta_val = c.blog_cat_id
WHERE m.blog_id = $post_id AND m.meta_key = "category";
`,
		)
		.all({ $post_id: post_id });
	if (isEmpty(results)) {
		return [
			{
				blog_cat_id: 0,
				name: "uncategorized",
				url: "uncategorized",
			},
		];
	}
	return results;
};

export const getMainCat = (cat_id: number, parent:boolean): BlogCats => {
	const results: any = db
		.query(
			`
SELECT blog_cat_id, name, url
FROM blog_categories
WHERE blog_cat_id = $cat_id LIMIT 0,1;
`,
		)
		.all({ $cat_id: parent ? Math.floor(cat_id) : cat_id });
	if (isEmpty(results)) {
		return [
			{
				blog_cat_id: 0,
				name: "uncategorized",
				url: "uncategorized",
			},
		];
	}
	return results;
};

export const getPostTags = (post_id: number): BlogTags => {
	const results: any = db
		.query(
			`
SELECT t.tag_id, t.name, t.url, t.tag_count as count
FROM blog_meta m INNER JOIN blog_tags t
ON m.meta_val = t.tag_id
WHERE m.blog_id = $post_id AND m.meta_key = 'tag';
`,
		)
		.all({ $post_id: post_id });
	if (isEmpty(results)) {
		return [
			{
				tag_id: 0,
				name: "",
				url: "",
				count: 0,
			},
		];
	}
	return results;
};

export const getCategories = (): BlogCats => {
	const results: any = db
		.query(
			`
SELECT blog_cat_id, name, url
FROM blog_categories
ORDER BY blog_cat_id ASC;
`,
		)
		.all({});
	if (isEmpty(results)) {
		return [
			{
				blog_cat_id: 0,
				name: "uncategorized",
				url: "uncategorized",
			},
		];
	}
	return results;
};

export const getCategoryByID = (cat_id: number): BlogCats => {
	const results: any = db
		.query(
			`
SELECT blog_cat_id, name, url
FROM blog_categories
WHERE blog_cat_id = $cat_id
LIMIT 1;
`,
		)
		.all({ $cat_id: cat_id });
	return results;
};

export const getTags = (): BlogTags => {
	const results: any = db
		.query(
			`
SELECT tag_id, name, url, tag_count as count
FROM blog_tags
ORDER BY url ASC;
`,
		)
		.all({});
	if (isEmpty(results)) {
		return [
			{
				tag_id: 0,
				name: "untagged",
				url: "untagged",
				count: 0,
			},
		];
	}
	return results;
};
export const getTotalPostCount = (): number => {
	const results = db
		.query(
			`
SELECT post_id AS total
FROM blog_posts
WHERE live = 1;
`,
		)
		.all({});
	return results.length;
};

export const getTotalPostCountByCat = (cat_id: number): number => {
	const results = db
		.query(
			`
SELECT DISTINCT(blog_id)
FROM blog_meta
WHERE meta_key = 'category'
AND meta_val >= $greater AND meta_val < $less;
`,
		)
		.all({ $greater: cat_id, $less: cat_id + 1 });
	return results.length;
};
export const getTotalPostCountBySubCat = (subcat_id: number): number => {
	const results = db
		.query(
			`
SELECT DISTINCT(blog_id)
FROM blog_meta
WHERE meta_key = 'category'
AND meta_val = $subcat_id;
`,
		)
		.all({ $subcat_id: subcat_id });
	return results.length;
};

export const getTotalPostCountByTag = (tag_id: number): number => {
	const results = db
		.query(
			`
SELECT blog_id as total
FROM blog_meta
WHERE meta_key = 'tag'
AND meta_val = $tag_id;
`,
		)
		.all({ $tag_id: tag_id });
	return results.length;
};
export const getCatByName = (cat_name: string) => {
	const results: any = db
		.query(
			`
SELECT blog_cat_id
FROM blog_categories
WHERE url = $cat_name
LIMIT 1;
`,
		)
		.all({ $cat_name: cat_name });
	return parseFloat(results[0].blog_cat_id);
};
export const getTagByName = (tag_name: string) => {
	const results: any = db
		.query(
			`
SELECT tag_id
FROM blog_tags
WHERE url = $tag_name
LIMIT 1;",
`,
		)
		.all({ $tag_name: tag_name });
	return parseInt(results[0].tag_id);
};
const getPostsByCat = (cat_id: number, limit: number, offset: number) => {
	const results = db
		.query(
			`
SELECT p.post_id, p.url, p.title, p.subtitle, p.excerpt, p.content, p.date
FROM blog_meta as m
INNER JOIN blog_posts as p
ON m.blog_id = p.post_id
WHERE m.meta_key = 'category'
AND m.meta_val >= $greater AND m.meta_val < $less AND p.live = 1
GROUP BY p.post_id
ORDER BY p.date DESC
LIMIT $offset, $limit;
`,
		)
		.all({
			$greater: cat_id,
			$less: cat_id + 1,
			$limit: limit,
			$offset: offset,
		});
	return results;
};

const getPostsBySubCat = (subcat_id: number, limit: number, offset: number) => {
	const results = db
		.query(
			`
SELECT p.post_id, p.url, p.title, p.subtitle, p.excerpt, p.content, p.date
FROM blog_meta as m
INNER JOIN blog_posts as p
ON m.blog_id = p.post_id
WHERE m.meta_key = 'category'
AND m.meta_val = $subcat_id AND p.live = 1
GROUP BY p.post_id
ORDER BY p.date DESC
LIMIT $offset, $limit;
`,
		)
		.all({
			$subcat_id: subcat_id,
			$limit: limit,
			$offset: offset,
		});
	return results;
};
const getPostsByTag = (tag_id: number, limit: number, offset: number) => {
	const results = db
		.query(
			`
SELECT p.post_id, p.url, p.title, p.subtitle, p.excerpt, p.content, p.date
FROM blog_meta as m
INNER JOIN blog_posts as p
ON m.blog_id = p.post_id
WHERE m.meta_key = 'tag' AND m.meta_val = $tag_id AND p.live = 1
GROUP BY p.post_id
ORDER BY p.date DESC
LIMIT $offset, $limit;
		`,
		)
		.all({
			$tag_id: tag_id,
			$limit: limit,
			$offset: offset,
		});
	return results;
};

/*   _     _   _   _ ___ __
 *  |_ \/ |_) / \ |_) | (_
 *  |_ /\ |   \_/ | \ | __)
 */
export const getPostByURL = (url: string): BlogPost => {
	let post = getPost(url);
	post.forEach((post) => {
		const cats = getPostCats(post.post_id);
		const tags = getPostTags(post.post_id);
		const main = getMainCat(cats[0].blog_cat_id, true);
		const base = getMainCat(cats[0].blog_cat_id, false);
		post.meta = { cats, tags, main, base };
	});
	return post;
};

export const getPosts = (limit: number, offset: number): BlogPost => {
	let posts = getPostsRange(limit, offset);
	posts.forEach((post) => {
		const cats = getPostCats(post.post_id);
		const tags = getPostTags(post.post_id);
		const main = getMainCat(cats[0].blog_cat_id, true);
		const base = getMainCat(cats[0].blog_cat_id, false);
		post.meta = { cats, tags, main, base };
	});
	return posts;
};

export const getPostsByCatID = (
	cat_id: number,
	limit: number,
	offset: number,
) => {
	let posts = getPostsByCat(cat_id, limit, offset);
	posts.forEach((post: any) => {
		const cats = getPostCats(post.post_id);
		const tags = getPostTags(post.post_id);
		const main = getMainCat(cats[0].blog_cat_id, true);
		const base = getMainCat(cats[0].blog_cat_id, false);
		post.meta = { cats, tags, main, base };
	});
	return posts;
};

export const getPostsBySubCatID = (
	subcat_id: number,
	limit: number,
	offset: number,
) => {
	let posts = getPostsBySubCat(subcat_id, limit, offset);
	posts.forEach((post: any) => {
		const cats = getPostCats(post.post_id);
		const tags = getPostTags(post.post_id);
		const main = getMainCat(cats[0].blog_cat_id, true);
		const base = getMainCat(cats[0].blog_cat_id, false);
		post.meta = { cats, tags, main, base };
	});
	return posts;
};

export const getPostsByTagID = (
	tag_id: number,
	limit: number,
	offset: number,
) => {
	let posts = getPostsByTag(tag_id, limit, offset);
	posts.forEach((post: any) => {
		const cats = getPostCats(post.post_id);
		const tags = getPostTags(post.post_id);
		const main = getMainCat(cats[0].blog_cat_id, true);
		const base = getMainCat(cats[0].blog_cat_id, false);
		post.meta = { cats, tags, main, base };
	});
	return posts;
};

export { quit };

Download

raw zip tar