Add folder structure
This commit is contained in:
2
src/app/api/auth/[...nextauth]/route.ts
Normal file
2
src/app/api/auth/[...nextauth]/route.ts
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
import { handlers } from "@/auth"
|
||||||
|
export const { GET, POST } = handlers
|
33
src/app/api/image/[...key]/route.ts
Normal file
33
src/app/api/image/[...key]/route.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import { s3 } from "@/lib/s3";
|
||||||
|
import { GetObjectCommand } from "@aws-sdk/client-s3";
|
||||||
|
|
||||||
|
export async function GET(req: Request, { params }: { params: { key: string[] } }) {
|
||||||
|
const { key } = await params;
|
||||||
|
const s3Key = key.join("/");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const command = new GetObjectCommand({
|
||||||
|
Bucket: "gaertan",
|
||||||
|
Key: s3Key,
|
||||||
|
});
|
||||||
|
|
||||||
|
const response = await s3.send(command);
|
||||||
|
|
||||||
|
if (!response.Body) {
|
||||||
|
return new Response("No body", { status: 500 });
|
||||||
|
}
|
||||||
|
|
||||||
|
const contentType = response.ContentType ?? "application/octet-stream";
|
||||||
|
|
||||||
|
return new Response(response.Body as ReadableStream, {
|
||||||
|
headers: {
|
||||||
|
"Content-Type": contentType,
|
||||||
|
"Cache-Control": "public, max-age=3600",
|
||||||
|
"Content-Disposition": "inline", // use 'attachment' to force download
|
||||||
|
},
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.log(err)
|
||||||
|
return new Response("Image not found", { status: 404 });
|
||||||
|
}
|
||||||
|
}
|
5
src/app/commissions/board/page.tsx
Normal file
5
src/app/commissions/board/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function CommissionsBoardPage() {
|
||||||
|
return (
|
||||||
|
<div>CommissionsBoardPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/commissions/types/[id]/page.tsx
Normal file
5
src/app/commissions/types/[id]/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function CommissionsTypesEditPage() {
|
||||||
|
return (
|
||||||
|
<div>CommissionsTypesEditPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/commissions/types/new/page.tsx
Normal file
5
src/app/commissions/types/new/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function CommissionsTypesNewPage() {
|
||||||
|
return (
|
||||||
|
<div>CommissionsTypesNewPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/commissions/types/page.tsx
Normal file
5
src/app/commissions/types/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function CommissionsTypesPage() {
|
||||||
|
return (
|
||||||
|
<div>CommissionsTypesPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/categories/[id]/page.tsx
Normal file
5
src/app/portfolio/categories/[id]/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioCategoriesEditPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioCategoriesEditPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/categories/new/page.tsx
Normal file
5
src/app/portfolio/categories/new/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioCategoriesNewPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioCategoriesNewPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/categories/page.tsx
Normal file
5
src/app/portfolio/categories/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioCategoriesPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioCategoriesPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/images/[id]/page.tsx
Normal file
5
src/app/portfolio/images/[id]/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioImagesEditPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioImagesEditPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/images/new/page.tsx
Normal file
5
src/app/portfolio/images/new/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioImagesNewPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioImagesNewPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/images/page.tsx
Normal file
5
src/app/portfolio/images/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioImagesPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioImagesPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/tags/[id]/page.tsx
Normal file
5
src/app/portfolio/tags/[id]/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioTagsEditPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioTagsEditPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/tags/new/page.tsx
Normal file
5
src/app/portfolio/tags/new/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioTagsNewPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioTagsNewPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/tags/page.tsx
Normal file
5
src/app/portfolio/tags/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioTagsPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioTagsPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/types/[id]/page.tsx
Normal file
5
src/app/portfolio/types/[id]/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioTypesEditPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioTypesEditPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/types/new/page.tsx
Normal file
5
src/app/portfolio/types/new/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioTypesNewPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioTypesNewPage</div>
|
||||||
|
);
|
||||||
|
}
|
5
src/app/portfolio/types/page.tsx
Normal file
5
src/app/portfolio/types/page.tsx
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
export default function PortfolioTypesPage() {
|
||||||
|
return (
|
||||||
|
<div>PortfolioTypesPage</div>
|
||||||
|
);
|
||||||
|
}
|
@ -16,32 +16,66 @@ export default function TopNav() {
|
|||||||
<NavigationMenuItem>
|
<NavigationMenuItem>
|
||||||
<NavigationMenuTrigger>Portfolio</NavigationMenuTrigger>
|
<NavigationMenuTrigger>Portfolio</NavigationMenuTrigger>
|
||||||
<NavigationMenuContent>
|
<NavigationMenuContent>
|
||||||
<ul className="grid gap-2 p-4 w-48">
|
<ul className="grid w-[300px] gap-4">
|
||||||
<li>
|
<li>
|
||||||
<NavigationMenuLink asChild>
|
<NavigationMenuLink asChild>
|
||||||
<Link href="/portfolio" className="block px-2 py-1 rounded hover:bg-muted">
|
<Link href="/portfolio/images">
|
||||||
All Portfolio Images
|
<div className="text-sm leading-none font-medium">Images</div>
|
||||||
|
<p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
|
||||||
|
</p>
|
||||||
</Link>
|
</Link>
|
||||||
</NavigationMenuLink>
|
</NavigationMenuLink>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<NavigationMenuLink asChild>
|
<NavigationMenuLink asChild>
|
||||||
<Link href="/portfolio/arttypes" className="block px-2 py-1 rounded hover:bg-muted">
|
<Link href="/portfolio/types">
|
||||||
Art Types
|
<div className="text-sm leading-none font-medium">Types</div>
|
||||||
|
<p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
|
||||||
|
</p>
|
||||||
</Link>
|
</Link>
|
||||||
</NavigationMenuLink>
|
</NavigationMenuLink>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<NavigationMenuLink asChild>
|
<NavigationMenuLink asChild>
|
||||||
<Link href="/portfolio/categories" className="block px-2 py-1 rounded hover:bg-muted">
|
<Link href="/portfolio/categories">
|
||||||
Categories
|
<div className="text-sm leading-none font-medium">Categories</div>
|
||||||
|
<p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
|
||||||
|
</p>
|
||||||
</Link>
|
</Link>
|
||||||
</NavigationMenuLink>
|
</NavigationMenuLink>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<NavigationMenuLink asChild>
|
<NavigationMenuLink asChild>
|
||||||
<Link href="/portfolio/tags" className="block px-2 py-1 rounded hover:bg-muted">
|
<Link href="/portfolio/tags">
|
||||||
Tags
|
<div className="text-sm leading-none font-medium">Tags</div>
|
||||||
|
<p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
|
||||||
|
</p>
|
||||||
|
</Link>
|
||||||
|
</NavigationMenuLink>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</NavigationMenuContent>
|
||||||
|
</NavigationMenuItem>
|
||||||
|
|
||||||
|
<NavigationMenuItem>
|
||||||
|
<NavigationMenuTrigger>Commissions</NavigationMenuTrigger>
|
||||||
|
<NavigationMenuContent>
|
||||||
|
<ul className="grid w-[300px] gap-4">
|
||||||
|
<li>
|
||||||
|
<NavigationMenuLink asChild>
|
||||||
|
<Link href="/commissions/types">
|
||||||
|
<div className="text-sm leading-none font-medium">Types</div>
|
||||||
|
<p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
|
||||||
|
</p>
|
||||||
|
</Link>
|
||||||
|
</NavigationMenuLink>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<NavigationMenuLink asChild>
|
||||||
|
<Link href="/commissions/board">
|
||||||
|
<div className="text-sm leading-none font-medium">Board</div>
|
||||||
|
<p className="text-muted-foreground line-clamp-2 text-sm leading-snug">
|
||||||
|
</p>
|
||||||
</Link>
|
</Link>
|
||||||
</NavigationMenuLink>
|
</NavigationMenuLink>
|
||||||
</li>
|
</li>
|
||||||
@ -49,11 +83,6 @@ export default function TopNav() {
|
|||||||
</NavigationMenuContent>
|
</NavigationMenuContent>
|
||||||
</NavigationMenuItem>
|
</NavigationMenuItem>
|
||||||
|
|
||||||
<NavigationMenuItem>
|
|
||||||
<NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
|
|
||||||
<Link href="/items/commissions/types">CommissionTypes</Link>
|
|
||||||
</NavigationMenuLink>
|
|
||||||
</NavigationMenuItem>
|
|
||||||
<NavigationMenuItem>
|
<NavigationMenuItem>
|
||||||
<NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
|
<NavigationMenuLink asChild className={navigationMenuTriggerStyle()}>
|
||||||
<Link href="/items/commissions/tos">ToS</Link>
|
<Link href="/items/commissions/tos">ToS</Link>
|
||||||
|
Reference in New Issue
Block a user