mirror of
https://github.com/JonasunderscoreJones/rss.jonasjones.dev.git
synced 2025-10-22 19:49:18 +02:00
added many features lol
This commit is contained in:
parent
515ad0b7e5
commit
af9eccb50d
1 changed files with 154 additions and 4 deletions
158
src/index.js
158
src/index.js
|
@ -1,10 +1,24 @@
|
|||
addEventListener('fetch', event => {
|
||||
event.respondWith(handleRequest(event.request));
|
||||
});
|
||||
event.respondWith(handleRequest(event.request, event.env));
|
||||
});
|
||||
|
||||
async function handleRequest(request) {
|
||||
const headersCORS = {
|
||||
'Access-Control-Allow-Origin': '*',
|
||||
'Access-Control-Allow-Methods': 'GET, POST, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers': 'Content-Type, x-Custom-Auth-Key',
|
||||
};
|
||||
|
||||
async function handleRequest(request, env) {
|
||||
const url = new URL(request.url);
|
||||
|
||||
if (request.method === 'OPTIONS') {
|
||||
// Handle CORS preflight request
|
||||
return new Response(null, {
|
||||
status: 204,
|
||||
headers: headersCORS
|
||||
});
|
||||
}
|
||||
|
||||
// Check if the path is /blog
|
||||
if (url.pathname === '/blog') {
|
||||
// Fetch the index.json file from your CDN
|
||||
|
@ -18,11 +32,147 @@ addEventListener('fetch', event => {
|
|||
return new Response(rssFeed, {
|
||||
headers: { 'Content-Type': 'application/rss+xml' },
|
||||
});
|
||||
|
||||
} else if (url.pathname === '/blog/new_post') {
|
||||
if (request.method === 'POST') {
|
||||
|
||||
if (!hasValidHeader(request)) {
|
||||
return new Response('Unauthorized', { status: 401, headers: headersCORS});
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const formData = await request.formData();
|
||||
const formFields = {};
|
||||
for (const [key, value] of formData.entries()) {
|
||||
formFields[key] = value;
|
||||
}
|
||||
|
||||
const fileName = formFields['id'] + '.md';
|
||||
const posttitle = formFields['title'];
|
||||
const postauthor = formFields['author'];
|
||||
const postdate = formFields['date'];
|
||||
const postdescription = formFields['description'];
|
||||
|
||||
const year = postdate.split('-')[0];
|
||||
const month = postdate.split('-')[1];
|
||||
const day = postdate.split('-')[2].split(' ')[0];
|
||||
|
||||
const fileContent = new TextEncoder().encode(
|
||||
`[title]: ${posttitle}
|
||||
[author]: ${postauthor}
|
||||
[date]: ${postdate}
|
||||
[description]: ${postdescription}
|
||||
` + formFields['content']);
|
||||
|
||||
const response = await fetch('https://cdn.jonasjones.dev/blog/index.json');
|
||||
const data = await response.json();
|
||||
|
||||
// add new json object to data
|
||||
const postObj = {
|
||||
id: formFields['id'],
|
||||
date: formFields['date'],
|
||||
title: formFields['title'],
|
||||
author: formFields['author'],
|
||||
description: formFields['description']
|
||||
};
|
||||
|
||||
// Check if the object with the given id already exists
|
||||
const index = data.findIndex(item => item.id === postObj.id);
|
||||
|
||||
if (index !== -1) {
|
||||
// If it exists, update the existing object
|
||||
data[index] = postObj;
|
||||
} else {
|
||||
// If it does not exist, add the new JSON object to the list
|
||||
data.push(postObj);
|
||||
}
|
||||
|
||||
|
||||
// Access the R2 bucket using the binding
|
||||
try {
|
||||
await CDN_BUCKET.put(`blog/posts/${year}/${month}/${day}/${fileName}`, fileContent, {
|
||||
httpMetadata: {
|
||||
contentType: "text/markdown"
|
||||
},
|
||||
headers: headersCORS
|
||||
});
|
||||
await CDN_BUCKET.put(`blog/index.json`, JSON.stringify(data), {
|
||||
httpMetadata: {
|
||||
contentType: "application/json"
|
||||
}
|
||||
});
|
||||
|
||||
// If the put operation succeeds (no error is thrown), return a success response
|
||||
return new Response(`Post Successfully uploaded`, { status: 200 });
|
||||
} catch (error) {
|
||||
// If an error occurs during the put operation, return a failure response
|
||||
return new Response(`Failed to upload Post: ${error.message}`, { status: 500 });
|
||||
}
|
||||
|
||||
|
||||
} catch (e) {
|
||||
return new Response(e, { status: 400 });
|
||||
}
|
||||
|
||||
} else {
|
||||
return new Response('Method Not Allowed', { status: 405 });
|
||||
}
|
||||
|
||||
} else if (url.pathname === "/blog/delete_post") {
|
||||
if (request.method === 'DELETE') {
|
||||
|
||||
if (!hasValidHeader(request)) {
|
||||
return new Response('Unauthorized', { status: 401 });
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
const formData = await request.formData();
|
||||
const formFields = {};
|
||||
for (const [key, value] of formData.entries()) {
|
||||
formFields[key] = value;
|
||||
}
|
||||
|
||||
const fileName = formFields['id'] + '.md';
|
||||
|
||||
const response = await fetch('https://cdn.jonasjones.dev/blog/index.json');
|
||||
|
||||
const data = await response.json();
|
||||
|
||||
// Check if the object with the given id already exists
|
||||
const index = data.findIndex(item => item.id === formFields['id']);
|
||||
|
||||
if (index !== -1) {
|
||||
// If it exists, delete the existing object
|
||||
data.splice(index, 1);
|
||||
}
|
||||
|
||||
// delete the file from the bucket
|
||||
CDN_BUCKET.delete(`blog/posts/${fileName}`);
|
||||
|
||||
// update the index.json file
|
||||
await CDN_BUCKET.put(`blog/index.json`, JSON.stringify(data), {
|
||||
httpMetadata: {
|
||||
contentType: "application/json"
|
||||
}
|
||||
});
|
||||
|
||||
return new Response(`Post Successfully deleted`, { status: 200 });
|
||||
} catch (e) {
|
||||
return new Response('Failed to delete Post', { status: 500 });
|
||||
}
|
||||
}
|
||||
return new Response('Method Not Allowed', { status: 405 });
|
||||
} else {
|
||||
// Handle other routes or return a 404 response
|
||||
return new Response('Not Found', { status: 404 });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
const hasValidHeader = (request) => {
|
||||
return request.headers.get('X-Custom-Auth-Key') === AUTH_KEY_SECRET;
|
||||
};
|
||||
|
||||
function createRSSFeed(data) {
|
||||
const DOMAIN = 'https://blog.jonasjones.dev';
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue