Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .env.example

This file was deleted.

25 changes: 25 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,11 @@
!.yarn/releases
!.yarn/versions

# backend dependencies
/backend/node_modules
/backend/dist
/backend/*.tsbuildinfo

# testing
/coverage

Expand Down Expand Up @@ -43,3 +48,23 @@ yarn-error.log*
# typescript
*.tsbuildinfo
next-env.d.ts

# Database files
*.sqlite
*.db

# Drizzle generated files
/backend/drizzle/migrations/*
!/backend/drizzle/migrations/.gitkeep

# IDE
.vscode/
.idea/

# OS generated files
Thumbs.db
ehthumbs.db

# Temporary files
*.tmp
*.temp
29 changes: 29 additions & 0 deletions app/api/internships/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { NextResponse } from "next/server";
import { getAllInternshipsData, transformToCardData } from "@/lib/db/queries";

export async function GET(request: Request) {
try {
const { searchParams } = new URL(request.url);
const sort = searchParams.get('sort') || 'most-recent';

const data = await getAllInternshipsData(sort);
const transformedData = transformToCardData(data);

return NextResponse.json({
success: true,
data: transformedData,
count: transformedData.length
});
} catch (error) {
console.error("❌ Erreur lors de la récupération des stages:", error);

return NextResponse.json(
{
success: false,
error: "Impossible de récupérer les données des stages. Veuillez vérifier la connexion à la base de données.",
details: error instanceof Error ? error.message : "Erreur inconnue"
},
{ status: 500 }
);
}
}
4 changes: 2 additions & 2 deletions app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@ export const metadata: Metadata = {
export default function RootLayout({ children }: LayoutParams) {
return (
<html lang="fr" suppressHydrationWarning>
<body className="antialiased">
<body className="flex min-h-screen flex-col antialiased">
<Providers>
<Navbar />
<main className="mx-auto flex min-h-screen w-full max-w-screen-xl flex-1 flex-col px-5 py-3">
<main className="mx-auto flex w-full max-w-screen-xl flex-1 flex-col px-5 py-3">
{children}
</main>
<Footer />
Expand Down
40 changes: 40 additions & 0 deletions app/not-found.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
"use client";
import { AlertTriangle, RefreshCw } from "lucide-react";
import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert";
import { Button } from "@/components/ui/button";
import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card";

export default function NotFound() {
return (
<div className="flex justify-center p-4">
<Card className="w-full max-w-md">
<CardHeader className="text-center">
<div className="mx-auto mb-4 flex h-20 w-20 items-center justify-center rounded-full bg-red-100">
<AlertTriangle className="h-10 w-10 text-red-600" />
</div>
<CardTitle className="text-2xl">Erreur 500</CardTitle>
<CardDescription className="text-base">
Connexion à la base de données impossible
</CardDescription>
</CardHeader>
<CardContent className="space-y-6">
<Alert>
<AlertTriangle className="h-4 w-4" />
<AlertTitle>Solutions possibles</AlertTitle>
<AlertDescription>
<ul className="mt-2 space-y-1 text-sm">
<li>• Vérifiez votre connexion internet</li>
<li>• Actualisez la page dans quelques minutes</li>
<li>• Contactez l'administrateur si le problème persiste</li>
</ul>
</AlertDescription>
</Alert>
<Button onClick={() => window.location.reload()} className="w-full">
<RefreshCw className="mr-2 h-4 w-4" />
Réessayer
</Button>
</CardContent>
</Card>
</div>
);
}
2 changes: 1 addition & 1 deletion app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { InternshipListClient } from "../src/features/internship/internship-list

export default async function RoutePage(_: PageParams) {
return (
<div className="flex min-h-screen flex-col items-center justify-center gap-4">
<div className="flex h-full flex-col items-center justify-start gap-4 pt-8">
<InternshipListClient key="internship-list-client" />
</div>
);
Expand Down
16 changes: 16 additions & 0 deletions backend/drizzle.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import { config } from "dotenv";
import { defineConfig } from "drizzle-kit";

config({ path: ".env" });

console.log("DATABASE_URL:", process.env.DATABASE_URL);

export default defineConfig({
schema: "./src/db/schema.ts",
out: "./drizzle/migrations",
dialect: "postgresql",
dbCredentials: {
url: process.env.DATABASE_URL!,
ssl: { rejectUnauthorized: false }, // Ajoute cette ligne
},
});
Loading