diff --git a/README.md b/README.md
index c8ea3a4..36ab327 100644
--- a/README.md
+++ b/README.md
@@ -1,36 +1,16 @@
-# `Nocturne: personal website & CMS`
+# `Nocturne: Personal Website`
-This is the code repo of my personal website, and [here](https://github.com/Lumither/blog-posts/) is the link of the
-content repo.
+This is the code repo of my [personal website](https://lumither.com),
+and [here](https://github.com/Lumither/blog-posts/) is the link to the
+content (blog posts etc.) repo.
Powered by Next.js and Rust, built with passion and love
-
-
-
+> [!NOTE]
+> This system is not production ready, and contains bugs, (security risk potentially).
+> But have fun on it =)
-*will add more here in the future
-
-## Nav:
-
-
-
-## Todos:
-
-### Backend
-
-- [ ] Add: log system
-- [ ] Add: search api
-- [ ] Add: tag filter (api)
-- [ ] Abandon: UUID mechanism
-- [ ] Fix: db connection issue
-
-### Frontend
-
-- [ ] Page: Home
-- [ ] Page: About
-- [ ] Page: Tags
-- [ ] Page: Archive
-- [ ] Page: Search
-- [ ] Add: Right sidebar
+# Todos
+- [ ] the todo list lol
+- [ ] and much more...
diff --git a/backend/api_server/src/blog/cron/check_update/mod.rs b/backend/api_server/src/blog/cron/check_update/mod.rs
index 9568ae2..2d531e3 100644
--- a/backend/api_server/src/blog/cron/check_update/mod.rs
+++ b/backend/api_server/src/blog/cron/check_update/mod.rs
@@ -1,4 +1,5 @@
use std::env;
+use std::error::Error;
use std::fs::remove_dir_all;
use std::path::{Path, PathBuf};
@@ -89,24 +90,22 @@ pub fn task(db_connection: &Pool) {
for update in updates {
if [Delta::Deleted, Delta::Untracked].contains(&update.status) {
if let Some(path) = &update.old_path {
- if drop_index(
+ match drop_index(
&get_md_file_basename(
path.file_name().unwrap().to_str().unwrap(),
),
db_connection,
- )
- .is_ok()
- {
- info!(
+ ) {
+ Ok(_) => info!(
"blog content git({}) file `{}` is detected as deleted/untracked, index dropped",
&git_url,
&path.display()
- );
- } else {
- error!(
- "blog content git({}) file `{}` is detected as deleted/untracked, failed to drop index",
+ ),
+ Err(e) => error!(
+ "blog content git({}) file `{}` is detected as deleted/untracked, failed to drop index: {}",
&git_url,
- &path.display()
+ &path.display(),
+ e
)
}
}
@@ -114,7 +113,8 @@ pub fn task(db_connection: &Pool) {
if path.components().any(|comp| comp.as_os_str() == "posts")
&& path.extension().is_some_and(|ext| ext == "md")
{
- update_md.push(path.to_path_buf());
+ // update_md.push(path.to_path_buf());
+ update_md.push(dbg!(path.to_path_buf()));
}
}
}
diff --git a/backend/api_server/src/blog/cron/check_update/utils.rs b/backend/api_server/src/blog/cron/check_update/utils.rs
index d0da864..c20d98a 100644
--- a/backend/api_server/src/blog/cron/check_update/utils.rs
+++ b/backend/api_server/src/blog/cron/check_update/utils.rs
@@ -38,7 +38,7 @@ pub fn search_md(entry: PathBuf) -> Vec {
pub fn index_files(files: &[PathBuf], db_conn: &Pool) {
let rt = Runtime::new().unwrap();
rt.block_on(async {
- let files_clone = files.to_owned();
+ let files_clone = dbg!(files).to_owned();
let handlers = files_clone
.into_iter()
.map(|file: PathBuf| {
diff --git a/backend/api_server/src/blog/cron/mod.rs b/backend/api_server/src/blog/cron/mod.rs
index 686fb26..1cb8398 100644
--- a/backend/api_server/src/blog/cron/mod.rs
+++ b/backend/api_server/src/blog/cron/mod.rs
@@ -7,7 +7,8 @@ pub mod check_update;
pub fn get_tasks(db_connection: Pool) -> Vec> {
let db_conn_clone = db_connection.clone();
vec![
- BasicTask::new(move || check_update::task(&db_conn_clone), "0/15 * * * * *")
+ // BasicTask::new(move || check_update::task(&db_conn_clone), "0/15 * * * * *")
+ BasicTask::new(move || check_update::task(&db_conn_clone), "* * * * * *")
.unwrap()
.to_task(),
]
diff --git a/frontend/app/about/layout.tsx b/frontend/app/(pages)/about/layout.tsx
similarity index 57%
rename from frontend/app/about/layout.tsx
rename to frontend/app/(pages)/about/layout.tsx
index ccc425b..e84ea45 100644
--- a/frontend/app/about/layout.tsx
+++ b/frontend/app/(pages)/about/layout.tsx
@@ -1,4 +1,10 @@
import React from 'react';
+import { Metadata } from 'next';
+import { SITE_CONFIG } from '@/src/constants';
+
+export const metadata: Metadata = {
+ title: `About - ${ SITE_CONFIG.name }`
+};
function Layout({
children
diff --git a/frontend/app/about/me/page.tsx b/frontend/app/(pages)/about/me/page.tsx
similarity index 83%
rename from frontend/app/about/me/page.tsx
rename to frontend/app/(pages)/about/me/page.tsx
index 86cccf5..03821e9 100644
--- a/frontend/app/about/me/page.tsx
+++ b/frontend/app/(pages)/about/me/page.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import MarkdownRenderer from '@/app/public/MarkdownRenderer';
+import MarkdownRenderer from '@/app/(pages)/public/MarkdownRenderer';
import { fetchText } from '@/app/fetch';
const Me = async () => {
diff --git a/frontend/app/about/page.tsx b/frontend/app/(pages)/about/page.tsx
similarity index 100%
rename from frontend/app/about/page.tsx
rename to frontend/app/(pages)/about/page.tsx
diff --git a/frontend/app/about/website/page.tsx b/frontend/app/(pages)/about/website/page.tsx
similarity index 84%
rename from frontend/app/about/website/page.tsx
rename to frontend/app/(pages)/about/website/page.tsx
index 0fc5d5a..0d112cb 100644
--- a/frontend/app/about/website/page.tsx
+++ b/frontend/app/(pages)/about/website/page.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import MarkdownRenderer from '@/app/public/MarkdownRenderer';
+import MarkdownRenderer from '@/app/(pages)/public/MarkdownRenderer';
import { fetchText } from '@/app/fetch';
const Website = async () => {
diff --git a/frontend/app/blog/BlogPostCard.tsx b/frontend/app/(pages)/blog/BlogPostCard.tsx
similarity index 100%
rename from frontend/app/blog/BlogPostCard.tsx
rename to frontend/app/(pages)/blog/BlogPostCard.tsx
diff --git a/frontend/app/blog/Error.tsx b/frontend/app/(pages)/blog/Error.tsx
similarity index 100%
rename from frontend/app/blog/Error.tsx
rename to frontend/app/(pages)/blog/Error.tsx
diff --git a/frontend/app/blog/Pagination.tsx b/frontend/app/(pages)/blog/Pagination.tsx
similarity index 92%
rename from frontend/app/blog/Pagination.tsx
rename to frontend/app/(pages)/blog/Pagination.tsx
index c3b8033..3d381ab 100644
--- a/frontend/app/blog/Pagination.tsx
+++ b/frontend/app/(pages)/blog/Pagination.tsx
@@ -3,7 +3,7 @@
import React from 'react';
import { Pagination as NextUIPagination } from '@nextui-org/react';
import { useRouter, useSearchParams } from 'next/navigation';
-import { useScreenSizeTrigger } from '@/app/public/screenSizeTrigger';
+import { useScreenSizeTrigger } from '@/app/(pages)/public/screenSizeTrigger';
const Pagination = ({ total }: {
total: number,
diff --git a/frontend/app/blog/PostList.tsx b/frontend/app/(pages)/blog/PostList.tsx
similarity index 83%
rename from frontend/app/blog/PostList.tsx
rename to frontend/app/(pages)/blog/PostList.tsx
index 591c6ea..c815d5c 100644
--- a/frontend/app/blog/PostList.tsx
+++ b/frontend/app/(pages)/blog/PostList.tsx
@@ -1,11 +1,12 @@
'use server';
import React from 'react';
-import { fetchNocturneApi } from '@/app/blog/api';
-import { MotionDiv } from '@/app/public/MotionDiv';
-import BlogPostCard from '@/app/blog/BlogPostCard';
+import { fetchNocturneApi } from '@/app/(pages)/blog/api';
+import BlogPostCard from '@/app/(pages)/blog/BlogPostCard';
import { Card, CardBody } from '@nextui-org/card';
+import * as motion from 'motion/react-client';
+
const PostList = async ({ page }: { page: number }) => {
try {
const res = await fetchNocturneApi(`/blog/get_post_list?page=${ page }`);
@@ -16,13 +17,13 @@ const PostList = async ({ page }: { page: number }) => {
{ posts.map((post: JSON, key: number) => (
-
-
+
)
) }
diff --git a/frontend/app/blog/api.ts b/frontend/app/(pages)/blog/api.ts
similarity index 100%
rename from frontend/app/blog/api.ts
rename to frontend/app/(pages)/blog/api.ts
diff --git a/frontend/app/blog/layout.tsx b/frontend/app/(pages)/blog/layout.tsx
similarity index 67%
rename from frontend/app/blog/layout.tsx
rename to frontend/app/(pages)/blog/layout.tsx
index 2c3ea28..7a16d98 100644
--- a/frontend/app/blog/layout.tsx
+++ b/frontend/app/(pages)/blog/layout.tsx
@@ -1,4 +1,10 @@
import React from 'react';
+import { Metadata } from 'next';
+import { SITE_CONFIG } from '@/src/constants';
+
+export const metadata: Metadata = {
+ title: `Blog - ${ SITE_CONFIG.name }`
+};
function Layout({
children
diff --git a/frontend/app/blog/page.tsx b/frontend/app/(pages)/blog/page.tsx
similarity index 77%
rename from frontend/app/blog/page.tsx
rename to frontend/app/(pages)/blog/page.tsx
index 6690937..f6b4939 100644
--- a/frontend/app/blog/page.tsx
+++ b/frontend/app/(pages)/blog/page.tsx
@@ -1,6 +1,6 @@
-import PostList from '@/app/blog/PostList';
-import Pagination from '@/app/blog/Pagination';
-import { fetchNocturneApi } from '@/app/blog/api';
+import PostList from '@/app/(pages)/blog/PostList';
+import Pagination from '@/app/(pages)/blog/Pagination';
+import { fetchNocturneApi } from '@/app/(pages)/blog/api';
async function Blog({
searchParams
diff --git a/frontend/app/blog/post/[id]/ButtonGoBack.tsx b/frontend/app/(pages)/blog/post/[id]/ButtonGoBack.tsx
similarity index 100%
rename from frontend/app/blog/post/[id]/ButtonGoBack.tsx
rename to frontend/app/(pages)/blog/post/[id]/ButtonGoBack.tsx
diff --git a/frontend/app/blog/post/[id]/Footer.tsx b/frontend/app/(pages)/blog/post/[id]/Footer.tsx
similarity index 80%
rename from frontend/app/blog/post/[id]/Footer.tsx
rename to frontend/app/(pages)/blog/post/[id]/Footer.tsx
index 6802851..e0ac2b5 100644
--- a/frontend/app/blog/post/[id]/Footer.tsx
+++ b/frontend/app/(pages)/blog/post/[id]/Footer.tsx
@@ -1,24 +1,32 @@
import React from 'react';
-import MinifyPostCard from '@/app/blog/post/[id]/MinifyPostCard';
+import MinifyPostCard from '@/app/(pages)/blog/post/[id]/MinifyPostCard';
import Link from 'next/link';
import { FaCreativeCommons } from 'react-icons/fa6';
type Props = {
- post: any
+ // post: any
+ post_id: string;
+ adjacent_posts: any
+ perm_link: string | undefined;
+ author: string | undefined;
+ author_link: string | undefined;
+ first_update: string;
+ last_update: string | undefined;
+ cc: string | undefined;
+ title: string;
}
const Footer = (props: Props) => {
- const { post } = props;
+ const { adjacent_posts, perm_link, post_id, first_update, last_update, title } = props;
- const adjacent_posts = post['adj'];
- const prev_post = adjacent_posts['prev'];
- const next_post = adjacent_posts['next'];
- const link = post['meta']['link'] ?? `https://lumither.com/blog/post/${ post['meta']['id'] }`;
- const author = post['meta']['author'] ?? 'Tao';
- const author_link = post['meta']['author_link'] ?? '/about';
- const post_date = new Date(post['first_update']);
- const update_date: Date | undefined = post['last_update'] ? new Date(post['last_update']) : undefined;
- const cc = post['meta']['cc'] ?? 'by-nc-sa';
+ const prev_post = adjacent_posts.prev;
+ const next_post = adjacent_posts.next;
+ const link = perm_link ?? `https://lumither.com/blog/post/${ post_id }`;
+ const author = props.author ?? 'Tao';
+ const author_link = props.author_link ?? '/about/me';
+ const post_date = new Date(first_update);
+ const update_date: Date | undefined = last_update ? new Date(last_update) : undefined;
+ const cc = props.cc ?? 'by-nc-sa';
return (
@@ -35,7 +43,7 @@ const Footer = (props: Props) => {
-
{ post['meta']['title'] }
+
{ title }
{ link }
diff --git a/frontend/app/blog/post/[id]/Headers.tsx b/frontend/app/(pages)/blog/post/[id]/Headers.tsx
similarity index 64%
rename from frontend/app/blog/post/[id]/Headers.tsx
rename to frontend/app/(pages)/blog/post/[id]/Headers.tsx
index 62e9090..7c83e51 100644
--- a/frontend/app/blog/post/[id]/Headers.tsx
+++ b/frontend/app/(pages)/blog/post/[id]/Headers.tsx
@@ -3,57 +3,57 @@ import Image from 'next/image';
import { Chip } from '@nextui-org/react';
import { MdCalendarMonth } from 'react-icons/md';
+// type Props = {
+// post: any
+// };
+
type Props = {
- post: any
-};
+ title: string;
+ subtitle: string;
+ summary: string | undefined;
+ category: string;
+ tags: string[];
+ first_update: string;
+ header_img: string | undefined;
+}
-const Headers = (props: Props) => {
- let post = props.post;
- let title = post['title'];
- let sub_title = post['sub_title'];
- // let summary = (post as any)['summary'];
- let category = post['category'];
- let tags = post['tags'];
- // let last_update = new Date((post as any)['last_update']);
- let first_update = new Date(post['first_update']);
- // let post_id = (post as any)['post_id'];
- let header_img = post['meta']['header_img'] as string | null;
+const Headers = (post: Props) => {
return (
<>
- { header_img &&