use ghost api for blogposts

This commit is contained in:
2023-01-01 01:21:53 +02:00
parent 817cd937a6
commit 31df1859cb
18 changed files with 84 additions and 408 deletions

View File

@@ -2,5 +2,4 @@
<div class="col">
<a href="/admin/announcements">Announcements</a>
<a href="/admin/blog">Blog</a>
</div>

View File

@@ -1,143 +0,0 @@
import type { Actions, PageServerLoad } from "./$types";
import db from "$lib/db";
import Joi from "joi";
import { fail } from "@sveltejs/kit";
 
export const load = ( async () => {
const Posts = db.model("Posts");
return {
postTitles: await Posts.findAll({ attributes: ["title"] }).then((docs) => {
const titles = docs.map((doc) => doc.get("title"));
return titles;
})
}
}) satisfies PageServerLoad;
export const actions: Actions = {
add: async ({ request }) => {
const formData = await request.formData();
const AddPostTypeSchema = Joi.object({
title: Joi.string().required(),
content: Joi.string().required(),
tags: Joi.string().optional().allow(""),
author: Joi.string().required()
});
if (AddPostTypeSchema.validate(Object.fromEntries(formData.entries())).error) {
return fail(400, { addError: true, addMessage: String(AddPostTypeSchema.validate(Object.fromEntries(formData.entries())).error) });
} else {
const Posts = db.model("Posts");
//@ts-ignore
const words = formData.get("content")!.trim().split(/\s+/).length;
//@ts-ignore
const tags = formData.get("tags") ? formData.get("tags").split(" ") : [];
const now = Math.floor(Date.now() / 1000);
const data = {
title: formData.get("title"),
content: formData.get("content"),
tags: tags,
author: formData.get("author"),
created: now,
words: words,
readingTime: Math.ceil(words / 225)
};
if (await Posts.findOne({ where: { title: data.title } })) {
return fail(409, { addError: true, addMessage: "A post with that title already exists." });
} else {
await Posts.create(data);
return { addSuccess: true, addMessage: "Your post has been posted." };
}
}
},
delete: async ({ request }) => {
const Posts = db.model("Posts");
const formData = await request.formData();
const deleteFromDb = await Posts.destroy({ where: { title: formData.get("title") } });
if (!deleteFromDb) {
return fail(404, { deleteError: true, deleteMessage: "A post with that title does not exist." });
} else {
return { deleteSuccess: true, deleteMessage: "Your post has been deleted." };
}
},
edit: async ({ request }) => {
const EditPostTypeSchema = Joi.object({
title: Joi.string().required(),
newTitle: Joi.string().optional().allow(""),
content: Joi.string().optional().allow(""),
tags: Joi.string().optional().allow(""),
area: Joi.string().required().allow("title", "content", "tags")
});
const formData = await request.formData();
if (EditPostTypeSchema.validate(Object.fromEntries(formData.entries())).error) {
return fail(400, { editError: true, editMessage: String(EditPostTypeSchema.validate(Object.fromEntries(formData.entries())).error) });
} else {
if (formData.get("area") === "title") {
const Posts = db.model("Posts");
const updateOnDb = await Posts.update(
{ title: formData.get("newTitle") },
{ where: { title: formData.get("title") } }
);
if (updateOnDb[0] === 0) {
return fail(404, { editError: true, editMessage: "A post with that title does not exist." });
} else {
return { editSuccess: true, editMessage: "Your post has been edited." };
}
} else if (formData.get("area") === "content") {
const Posts = db.model("Posts");
//@ts-ignore
const words = formData.get("content")!.trim().split(/\s+/).length;
const now = Math.floor(Date.now() / 1000);
const updateonDb = await Posts.update(
{
content: formData.get("content"),
words: words,
readingTime: Math.ceil(words / 225),
updated: now
},
{ where: { title: formData.get("title") } }
);
if (updateonDb[0] === 0) {
return fail(404, { editError: true, editMessage: "A post with that title does not exist." });
} else {
return { editSuccess: true, editMessage: "Your post has been edited." };
}
} else if (formData.get("area") === "tags") {
const Posts = db.model("Posts");
//@ts-ignore
const tags = formData.get("tags") ? formData.get("tags").split(" ") : [];
const updateOnDb = await Posts.update(
{ tags: tags
},
{ where: { title: formData.get("title") } }
);
if (updateOnDb[0] === 0) {
return fail(404, { editError: true, editMessage: "A post with that title does not exist." });
} else {
return { editSuccess: true, editMessage: "Your post has been edited." };
}
}
}
}
}

View File

@@ -1,81 +0,0 @@
<script lang="ts">
import type { ActionData, PageData } from '.$/types';
export let data: PageData;
export let form: ActionData;
</script>
<h1>Add post</h1>
<form action="?/add" method="POST" class="col">
<input type="text" name="title" placeholder="Title" required />
<textarea
name="content"
placeholder="Content"
rows="4"
cols="25"
required
></textarea>
<input type="text" name="tags" placeholder="Tags" />
<input type="text" name="author" placeholder="Author" required />
{#if form?.addSuccess}
{form.addMessage}
{/if}
{#if form?.addError}
{form.addMessage}
{/if}
<button type="submit">Submit</button>
</form>
<h1>Delete post</h1>
<form action="?/delete" method="POST" class="col">
<select name="title" required>
{#each data.postTitles as title}
<option value="{title}">{title}</option>
{/each}
</select>
{#if form?.deleteSuccess}
{form.deleteMessage}
{/if}
{#if form?.deleteError}
{form.deleteMessage}
{/if}
<button type="submit">Submit</button>
</form>
<h1>Edit post</h1>
<form action="?/edit" method="POST" class="col">
<select name="title" required>
<option disabled>Post title</option>
{#each data.postTitles as title}
<option value="{title}">{title}</option>
{/each}
</select>
<select name="area">
<option disabled>Area to change</option>
<option value="title">Title</option>
<option value="content">Content</option>
<option value="tags">Tags</option>
</select>
<input type="text" name="newTitle" placeholder="New title" />
<textarea
name="content"
placeholder="New content"
rows="4"
cols="25"
></textarea>
<input type="text" name="tags" placeholder="New tags" />
{#if form?.editSuccess}
{form.editMessage}
{/if}
{#if form?.editError}
{form.editMessage}
{/if}
<button type="submit">Submit</button>
</form>