From dc71938bd888613877d38b9e6499789af533e317 Mon Sep 17 00:00:00 2001 From: jasinco Date: Wed, 16 Apr 2025 22:28:11 +0800 Subject: [PATCH] init --- README.md | 4 ++ bun.lockb | Bin 37335 -> 38103 bytes package.json | 5 +- services/docker-compose.yml | 15 +++++ src/app/page.tsx | 106 +++--------------------------------- src/app/post.tsx | 35 ++++++++++++ src/db.ts | 57 +++++++++++++++++++ 7 files changed, 123 insertions(+), 99 deletions(-) create mode 100644 services/docker-compose.yml create mode 100644 src/app/post.tsx create mode 100644 src/db.ts diff --git a/README.md b/README.md index e215bc4..4270b55 100644 --- a/README.md +++ b/README.md @@ -34,3 +34,7 @@ You can check out [the Next.js GitHub repository](https://github.com/vercel/next The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js. Check out our [Next.js deployment documentation](https://nextjs.org/docs/app/building-your-application/deploying) for more details. + + +# Structure +Store on local machine and use a middleware to process (compress) the file and facilitate storage. \ No newline at end of file diff --git a/bun.lockb b/bun.lockb index 1b481550b2aa51096723f070f7bfc729089ff747..fababebaf53c4a54ea9c358c85098a8b994543fd 100644 GIT binary patch delta 5553 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 X$^{*|&p@87TWG`sLwt?f>Z1M$e0SRj diff --git a/package.json b/package.json index 258fc9b..3b19ef7 100644 --- a/package.json +++ b/package.json @@ -9,9 +9,10 @@ "lint": "next lint" }, "dependencies": { + "bun-types": "^1.2.9", + "next": "15.3.0", "react": "^19.0.0", - "react-dom": "^19.0.0", - "next": "15.3.0" + "react-dom": "^19.0.0" }, "devDependencies": { "typescript": "^5", diff --git a/services/docker-compose.yml b/services/docker-compose.yml new file mode 100644 index 0000000..c78fffd --- /dev/null +++ b/services/docker-compose.yml @@ -0,0 +1,15 @@ +services: + postgres: + image: postgres:17.4-alpine3.21 + restart: always + shm_size: 128mb + environment: + - POSTGRES_PASSWORD=test + - POSTGRES_USER=test + ports: + - 5432:5432 + adminer: + image: adminer + restart: always + ports: + - 8080:8080 \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index e68abe6..25af71e 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,103 +1,15 @@ -import Image from "next/image"; +import { retrieve_post } from "@/db"; export default function Home() { - return ( -
-
- Next.js logo -
    -
  1. - Get started by editing{" "} - - src/app/page.tsx - - . -
  2. -
  3. - Save and see your changes instantly. -
  4. -
- -
- + return ( +
+
+

匿名中工

+
+
+ +
); } diff --git a/src/app/post.tsx b/src/app/post.tsx new file mode 100644 index 0000000..4f0ea0f --- /dev/null +++ b/src/app/post.tsx @@ -0,0 +1,35 @@ + +import { Suspense } from "react"; +import Image from "next/image"; +import { Attachment } from "@/db"; + +export default function Post(post_content: string, attachments: Attachment[]) { + let images = []; + let videos = []; + attachments.forEach(attachment => { + if (attachment.type.type == "video") { + attachment.urls.forEach(url => { + videos.push( + 加載中

}> + +
+ ) + }) + }else if (attachment.type.type="image"){ + attachment.urls.forEach(url => { + images.push(Uploaded) + }) + } + }) + return (
+
+ {post_content} +
+
+
+
+
) +} \ No newline at end of file diff --git a/src/db.ts b/src/db.ts new file mode 100644 index 0000000..a31fb47 --- /dev/null +++ b/src/db.ts @@ -0,0 +1,57 @@ +import { main } from "bun"; +import { sql } from "bun"; +import { MIMEType } from "util" + +export interface Attachment { + type: MIMEType; + urls: string[]; +} +export interface Post { + content: string, + hash: string, +} + +export async function setup_func() { + const rows = await sql` + CREATE OR REPLACE FUNCTION fetch_post( + OUT p_text VARCHAR(1000), + OUT p_hash CHAR(32), + OUT p_date TIMESTAMP, + OUT p_pics INT[] + ) + RETURNS SETOF RECORD AS + $$ + DECLARE + post_cursor CURSOR FOR + SELECT content, hash, date + FROM posts; + post_record RECORD; + BEGIN + -- Open cursor + OPEN post_cursor; + + -- Fetch rows and return + LOOP + FETCH NEXT FROM post_cursor INTO post_record; + EXIT WHEN NOT FOUND; + + p_text = post_record.content; + p_date = post_record.date; + p_hash = post_record.hash; + RETURN NEXT; + END LOOP; + + -- Close cursor + CLOSE post_cursor; + END; + $$ + LANGUAGE PLPGSQL;`; +} + +/* retrieve the latest post with posts table */ +export async function retrieve_post(offset: Number) { + const res = await sql`SELECT * FROM fetch_post();` + console.log(res) +} +setup_func() +retrieve_post(0) \ No newline at end of file