diff --git a/.gitignore b/.gitignore index bf15673..6ab2567 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,7 @@ /node_modules /.pnp .pnp.js - +/copy # testing /coverage diff --git a/app/admin/images/page.tsx b/app/admin/images/page.tsx deleted file mode 100644 index 73319b5..0000000 --- a/app/admin/images/page.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from "react"; -import { Image } from "@prisma/client"; -import { Image as GalleryImage } from "react-grid-gallery"; -import urlJoin from "url-join"; -import { apiUrl } from "../../../global"; -import Gallery from "./Gallery"; - -async function getImages(): Promise { - const result = await fetch(urlJoin(apiUrl, `images`), { - cache: "no-cache", - }); - const imageData: Image[] = await result.json(); - - return imageData.map((img, i) => ({ - width: img.width, - height: img.height, - src: img.url, - caption: img.name, - })); -} - -export default async function AdminImagesPage() { - return ; -} diff --git a/app/articles/[categoryName]/page.tsx b/app/articles/[categoryName]/page.tsx index f1d6b2f..72581b1 100644 --- a/app/articles/[categoryName]/page.tsx +++ b/app/articles/[categoryName]/page.tsx @@ -1,53 +1,15 @@ import styles from "../../../styles/modules/Category.module.scss"; import Link from "next/link"; -import { apiUrl } from "../../../global"; -import { Article, Category } from "@prisma/client"; -import urlJoin from "url-join"; - -async function GetAllArticles(categoryName: string): Promise { - const result: Response = await fetch(urlJoin(apiUrl, `articles?categoryName=${categoryName}`), { - cache: "force-cache", - next: { revalidate: 3600 }, - }); - return result.json(); -} - -async function GetPopularArticles(categoryName: string): Promise { - const result: Response = await fetch( - urlJoin(apiUrl, `articles?categoryName=${categoryName}&limit=6&orderBy=popularity`), - { - cache: "force-cache", - next: { revalidate: 3600 }, - } - ); - return result.json(); -} - -async function GetRecentArticles(categoryName: string): Promise { - const result: Response = await fetch( - urlJoin(apiUrl, `articles?categoryName=${categoryName}&limit=6&orderBy=recent`), - { - cache: "force-cache", - next: { revalidate: 3600 }, - } - ); - return result.json(); -} - -async function GetCategory(categoryName: string): Promise { - const result: Response = await fetch(urlJoin(apiUrl, `categories/name/${categoryName}`), { - cache: "force-cache", - next: { revalidate: 3600 }, - }); - return result.json(); -} +import { ArticleWithIncludes, CategoryWithIncludes, FetchManager } from "../../../manager/fetchManager"; +import { formatTextToUrlName } from "../../../utils"; export default async function CategoryPage({ params }: { params: { categoryName: string } }) { - const categoryName = params.categoryName.toLowerCase().replaceAll("%20", " "); - const category: Category = await GetCategory(categoryName); - const allArticles: Article[] = await GetAllArticles(categoryName); - const popularArticles: Article[] = await GetPopularArticles(categoryName); - const recentArticles: Article[] = await GetRecentArticles(categoryName); + const categoryName = formatTextToUrlName(params.categoryName); + const category: CategoryWithIncludes = await FetchManager.Category.get(categoryName); + + const allArticles: ArticleWithIncludes[] = await FetchManager.Article.getByCategory(categoryName); + // const popularArticles: Article[] = await GetPopularArticles(categoryName); + // const recentArticles: Article[] = await GetRecentArticles(categoryName); return (
@@ -55,7 +17,7 @@ export default async function CategoryPage({ params }: { params: { categoryName:

Most popular articles

- {popularArticles?.map((a, i) => { + {/* {popularArticles?.map((a, i) => { { return ( @@ -63,7 +25,7 @@ export default async function CategoryPage({ params }: { params: { categoryName: ); } - })} + })} */}
{/*
@@ -81,15 +43,17 @@ export default async function CategoryPage({ params }: { params: { categoryName:

All articles

- {allArticles?.map((a, i) => { - { - return ( - - {a.title} - - ); - } - })} + {allArticles + ? Array.from(allArticles).map((a, i) => { + { + return ( + + {a.title} + + ); + } + }) + : ""}
diff --git a/app/admin/images/Gallery.tsx b/components/Gallery.tsx similarity index 99% rename from app/admin/images/Gallery.tsx rename to components/Gallery.tsx index 92c778a..80d0530 100644 --- a/app/admin/images/Gallery.tsx +++ b/components/Gallery.tsx @@ -1,4 +1,5 @@ "use client"; + import React, { useState } from "react"; import { Gallery as ReactGridGallery, Image as ImageType, ThumbnailImageProps } from "react-grid-gallery"; import Image from "next/image"; diff --git a/components/ImageUpload.tsx b/components/ImageUpload.tsx new file mode 100644 index 0000000..96f45e9 --- /dev/null +++ b/components/ImageUpload.tsx @@ -0,0 +1,32 @@ +/* eslint-disable @next/next/no-img-element */ +"use client"; +import React, { useState } from "react"; +import { useRef } from "react"; +export default function ImageUpload() { + const [selectedImage, setSelectedImage] = useState(null); + const inputRef = useRef(null); + + const handleImageChange = (event) => { + setSelectedImage(URL.createObjectURL(event.target.files[0])); + }; + + async function uploadImage() { + if (selectedImage) { + const formData = new FormData(); + formData.append("image", selectedImage); + const response = await fetch("/api/images/", { + method: "POST", + body: formData, + }); + console.log(await response.json()); + } + } + + return ( +
+ + {selectedImage && Selected} + +
+ ); +} diff --git a/manager/fetchManager.ts b/manager/fetchManager.ts index 9f9267b..61de4ce 100644 --- a/manager/fetchManager.ts +++ b/manager/fetchManager.ts @@ -18,6 +18,7 @@ export class FetchManager { static Article = class { static async list(noCache: boolean = false): Promise { + console.log(urlJoin(apiUrl, `articles`)) const response = await fetch(urlJoin(apiUrl, `articles`), { cache: GLOBAL_NO_CACHE || noCache ? "no-cache" : "force-cache", next: { revalidate: 60 * 10 }, @@ -26,6 +27,7 @@ export class FetchManager { } static async get(id: string, noCache: boolean = false): Promise { + urlJoin(apiUrl, `articles/${id}`) const response = await fetch(urlJoin(apiUrl, `articles/${id}`), { cache: GLOBAL_NO_CACHE || noCache ? "no-cache" : "force-cache", next: { revalidate: 60 * 10 }, @@ -42,6 +44,15 @@ export class FetchManager { }) return await response.json() } + + static async getByCategory(name: string, noCache: boolean = false): Promise { + + const response = await fetch(urlJoin(apiUrl, `articles?categoryName=${name}`), { + cache: GLOBAL_NO_CACHE || noCache ? "no-cache" : "force-cache", + next: { revalidate: 60 * 10 }, + }) + return await response.json() + } } diff --git a/package-lock.json b/package-lock.json index 674dd6c..6126101 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,16 @@ "@next/font": "13.0.7", "@prisma/client": "^4.9.0", "@types/express": "^4.17.15", + "@types/formidable": "^2.0.5", "@types/marked": "^4.0.8", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", "encoding": "^0.1.13", "eslint": "8.30.0", "eslint-config-next": "13.0.7", + "formidable": "^2.1.1", "marked": "^4.2.4", + "multer": "^1.4.5-lts.1", "next": "^13.1.6", "prismjs": "^1.29.0", "react": "18.2.0", @@ -40,6 +43,7 @@ }, "devDependencies": { "@fec/remark-a11y-emoji": "^3.1.0", + "@types/multer": "^1.4.7", "@types/node": "^18.11.17", "@types/prismjs": "^1.26.0", "prisma": "^4.9.0" @@ -1109,6 +1113,14 @@ "@types/range-parser": "*" } }, + "node_modules/@types/formidable": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.5.tgz", + "integrity": "sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", @@ -1145,6 +1157,15 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, + "node_modules/@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -1423,6 +1444,11 @@ "node": ">= 8" } }, + "node_modules/append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "node_modules/aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -1513,6 +1539,11 @@ "get-intrinsic": "^1.1.3" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "node_modules/ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -1794,6 +1825,17 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" }, + "node_modules/busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "dependencies": { + "streamsearch": "^1.1.0" + }, + "engines": { + "node": ">=10.16.0" + } + }, "node_modules/cacache": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-9.3.0.tgz", @@ -2488,6 +2530,15 @@ "node": ">=6" } }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -3573,6 +3624,20 @@ "node": ">=0.4.x" } }, + "node_modules/formidable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, "node_modules/from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -4124,6 +4189,14 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "engines": { + "node": ">=8" + } + }, "node_modules/highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -5794,6 +5867,14 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", @@ -6356,6 +6437,25 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/mimer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimer/-/mimer-1.1.0.tgz", @@ -6459,6 +6559,23 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "dependencies": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -7333,6 +7450,20 @@ "node": ">=6" } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", @@ -8446,6 +8577,14 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, + "node_modules/streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8980,6 +9119,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -10297,6 +10448,14 @@ "@types/range-parser": "*" } }, + "@types/formidable": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@types/formidable/-/formidable-2.0.5.tgz", + "integrity": "sha512-uvMcdn/KK3maPOaVUAc3HEYbCEhjaGFwww4EsX6IJfWIJ1tzHtDHczuImH3GKdusPnAAmzB07St90uabZeCKPA==", + "requires": { + "@types/node": "*" + } + }, "@types/hast": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", @@ -10333,6 +10492,15 @@ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.31.tgz", "integrity": "sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==" }, + "@types/multer": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/@types/multer/-/multer-1.4.7.tgz", + "integrity": "sha512-/SNsDidUFCvqqcWDwxv2feww/yqhNeTRL5CVoL3jU4Goc4kKEL10T7Eye65ZqPNi4HRx8sAEX59pV1aEH7drNA==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", @@ -10530,6 +10698,11 @@ "picomatch": "^2.0.4" } }, + "append-field": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", + "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==" + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -10599,6 +10772,11 @@ "get-intrinsic": "^1.1.3" } }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "ast-types-flow": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", @@ -10815,6 +10993,14 @@ "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", "integrity": "sha512-uYBjakWipfaO/bXI7E8rq6kpwHRZK5cNYrUv2OzZSI/FvmdMyXJ2tG9dKcjEC5YHmHpUAwsargWIZNWdxb/bnQ==" }, + "busboy": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", + "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", + "requires": { + "streamsearch": "^1.1.0" + } + }, "cacache": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-9.3.0.tgz", @@ -11354,6 +11540,15 @@ "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "diff": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", @@ -12203,6 +12398,17 @@ "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==" }, + "formidable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-2.1.1.tgz", + "integrity": "sha512-0EcS9wCFEzLvfiks7omJ+SiYJAiD+TzK4Pcw1UlUoGnhUxDcMKjt0P7x8wEb0u6OHu8Nb98WG3nxtlF5C7bvUQ==", + "requires": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0", + "qs": "^6.11.0" + } + }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", @@ -12602,6 +12808,11 @@ } } }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" + }, "highlight.js": { "version": "10.7.3", "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", @@ -13827,6 +14038,11 @@ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-1.1.0.tgz", "integrity": "sha512-jVU0Nr2B9X3MU4tSK7JP1CMkSvOj7X5l/GboG1tKRw52lLF1x2Ju92Ms9tNetCcbfX3hzlM73zYo2NKkWSfF/A==" }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, "memoize-one": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", @@ -14145,6 +14361,19 @@ "picomatch": "^2.3.1" } }, + "mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" + }, + "mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "requires": { + "mime-db": "1.52.0" + } + }, "mimer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/mimer/-/mimer-1.1.0.tgz", @@ -14226,6 +14455,20 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "multer": { + "version": "1.4.5-lts.1", + "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", + "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", + "requires": { + "append-field": "^1.0.0", + "busboy": "^1.0.0", + "concat-stream": "^1.5.2", + "mkdirp": "^0.5.4", + "object-assign": "^4.1.1", + "type-is": "^1.6.4", + "xtend": "^4.0.0" + } + }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", @@ -14883,6 +15126,14 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, "queue": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.1.tgz", @@ -15715,6 +15966,11 @@ "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, + "streamsearch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", + "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==" + }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -16111,6 +16367,15 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", diff --git a/package.json b/package.json index d729e6c..a43edd5 100644 --- a/package.json +++ b/package.json @@ -15,13 +15,16 @@ "@next/font": "13.0.7", "@prisma/client": "^4.9.0", "@types/express": "^4.17.15", + "@types/formidable": "^2.0.5", "@types/marked": "^4.0.8", "@types/react": "18.0.26", "@types/react-dom": "18.0.9", "encoding": "^0.1.13", "eslint": "8.30.0", "eslint-config-next": "13.0.7", + "formidable": "^2.1.1", "marked": "^4.2.4", + "multer": "^1.4.5-lts.1", "next": "^13.1.6", "prismjs": "^1.29.0", "react": "18.2.0", @@ -44,6 +47,7 @@ }, "devDependencies": { "@fec/remark-a11y-emoji": "^3.1.0", + "@types/multer": "^1.4.7", "@types/node": "^18.11.17", "@types/prismjs": "^1.26.0", "prisma": "^4.9.0" diff --git a/pages/api/images/index.ts b/pages/api/images/index.ts deleted file mode 100644 index 878a995..0000000 --- a/pages/api/images/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Request, Response } from "express"; -import prisma from "../../../lib/prisma"; -import { Prisma } from "@prisma/client"; - -export default async function handler(req: Request, res: Response) { - res.setHeader("Content-Type", "application/json"); - - if (req.method == "GET") { - res.send(await prisma.image.findMany()) - } -} \ No newline at end of file diff --git a/storage/backup/serial b/storage/backup/serial new file mode 100644 index 0000000..482a4ce --- /dev/null +++ b/storage/backup/serial @@ -0,0 +1 @@ +zrpmayg1wugrgxpm \ No newline at end of file diff --git a/storage/cache/json/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_exiftool.json b/storage/cache/json/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_exiftool.json new file mode 100644 index 0000000..9d949fa --- /dev/null +++ b/storage/cache/json/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_exiftool.json @@ -0,0 +1,26 @@ +[{ + "SourceFile": "/photoprism/storage/users/urpmb0z2xmpahuqx/upload/sesssmy6hfc1umzov2/Berlin_Brandenburger_Tor_im_Sonnenuntergang_Leitmotiv_German_Summer_Cities.jpg", + "ExifToolVersion": 12.40, + "FileName": "Berlin_Brandenburger_Tor_im_Sonnenuntergang_Leitmotiv_German_Summer_Cities.jpg", + "Directory": "/photoprism/storage/users/urpmb0z2xmpahuqx/upload/sesssmy6hfc1umzov2", + "FileSize": 246578, + "FileModifyDate": "2023:02:05 17:25:02+00:00", + "FileAccessDate": "2023:02:05 17:25:02+00:00", + "FileInodeChangeDate": "2023:02:05 17:25:02+00:00", + "FilePermissions": 100664, + "FileType": "JPEG", + "FileTypeExtension": "JPG", + "MIMEType": "image/jpeg", + "JFIFVersion": "1 1", + "ResolutionUnit": 0, + "XResolution": 1, + "YResolution": 1, + "ImageWidth": 1600, + "ImageHeight": 900, + "EncodingProcess": 2, + "BitsPerSample": 8, + "ColorComponents": 3, + "YCbCrSubSampling": "1 1", + "ImageSize": "1600 900", + "Megapixels": 1.44 +}] diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_100x100_center.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_100x100_center.jpg new file mode 100644 index 0000000..0fda506 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_100x100_center.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1280x1024_fit.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1280x1024_fit.jpg new file mode 100644 index 0000000..36aaa3f Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1280x1024_fit.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1920x1200_fit.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1920x1200_fit.jpg new file mode 100644 index 0000000..9004a18 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_1920x1200_fit.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_center.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_center.jpg new file mode 100644 index 0000000..129333c Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_center.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_left.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_left.jpg new file mode 100644 index 0000000..4f950c2 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_left.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_right.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_right.jpg new file mode 100644 index 0000000..7b3e4d4 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_224x224_right.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_3x3_resize.png b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_3x3_resize.png new file mode 100644 index 0000000..767b475 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_3x3_resize.png differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_500x500_center.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_500x500_center.jpg new file mode 100644 index 0000000..17e7899 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_500x500_center.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_50x50_center.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_50x50_center.jpg new file mode 100644 index 0000000..f1e90f8 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_50x50_center.jpg differ diff --git a/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_720x720_fit.jpg b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_720x720_fit.jpg new file mode 100644 index 0000000..c9306d0 Binary files /dev/null and b/storage/cache/thumbnails/d/0/3/d036a457124b1e5d95754125963f16653b5f6650_720x720_fit.jpg differ diff --git a/storage/config/hub.yml b/storage/config/hub.yml new file mode 100644 index 0000000..5dd7044 --- /dev/null +++ b/storage/config/hub.yml @@ -0,0 +1,6 @@ +Version: 221118-e58fee0fb-Linux-AMD64 +Key: 0427e51091ac43eaaa55978febab4e2112bad60c +Secret: be0711bf10f092235e039884f0039400 +Session: 54a3619247ffec19480e915f526d69bfd3b82297b3d722fafafe9b60b897e45fe90bc57a500989ca4aa5baef53f1063b5fa5dc45ebeb864f575005341e9186832bd2915f576fb192223ca304c439313aba793c82faae63402518682510396386b8 +Status: ce +Serial: zrpmayg1wugrgxpm diff --git a/storage/config/settings.yml b/storage/config/settings.yml new file mode 100644 index 0000000..0d8bfef --- /dev/null +++ b/storage/config/settings.yml @@ -0,0 +1,62 @@ +UI: + Scrollbar: true + Zoom: false + Theme: default + Language: en + TimeZone: "" +Search: + BatchSize: 0 +Maps: + Animate: 0 + Style: "" +Features: + Account: true + Advanced: false + Albums: true + Archive: true + Delete: false + Download: true + Edit: true + Estimates: false + Favorites: true + Files: true + Folders: true + Import: true + Labels: false + Library: false + Logs: true + Moments: false + People: false + Places: false + Private: true + Ratings: true + Reactions: true + Review: false + Search: true + Services: true + Settings: true + Share: true + Upload: true + Videos: true +Import: + Path: / + Move: false +Index: + Path: / + Convert: true + Rescan: false + SkipArchived: false +Stack: + UUID: true + Meta: true + Name: false +Share: + Title: "" +Download: + Name: file + Disabled: false + Originals: true + MediaRaw: false + MediaSidecar: false +Templates: + Default: index.gohtml diff --git a/storage/serial b/storage/serial new file mode 100644 index 0000000..482a4ce --- /dev/null +++ b/storage/serial @@ -0,0 +1 @@ +zrpmayg1wugrgxpm \ No newline at end of file diff --git a/storage/sidecar/2023/02/20230205_172502_28541355.yml b/storage/sidecar/2023/02/20230205_172502_28541355.yml new file mode 100644 index 0000000..e2ef39c --- /dev/null +++ b/storage/sidecar/2023/02/20230205_172502_28541355.yml @@ -0,0 +1,16 @@ +TakenAt: 2023-02-05T17:25:04Z +UID: prpmb1v3h8wlphpy +Type: image +Title: Berlin Brandenburger Tor Im Sonnenuntergang Leitmotiv German Summer Cities +OriginalName: Berlin_Brandenburger_Tor_im_Sonnenuntergang_Leitmotiv_German_Summer_Cities +TimeZone: UTC +Year: -1 +Month: -1 +Day: -1 +Quality: 1 +Details: + Keywords: berlin, brandenburger, cities, german, gold, historic, leitmotiv, sonnenuntergang, + summer, tor +CreatedBy: urpmb0z2xmpahuqx +CreatedAt: 2023-02-05T17:25:07.100920585Z +UpdatedAt: 2023-02-05T17:25:07.254378706Z