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
19 changes: 19 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -48,3 +48,22 @@ build/

# Plan file (development only)
PLAN.md

# Next.js / Node.js (for nextjs-saas/)
node_modules/
.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
.next/
out/
*.tsbuildinfo
next-env.d.ts
.vercel
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*
58 changes: 58 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Waitlist

Ce dépôt contient deux projets de waitlist :

1. **Waitlist Page (Go)** - Une page de waitlist simple et légère déployable en une commande Docker
2. **Waitlist SaaS (Next.js)** - Une application SaaS complète pour créer et gérer plusieurs pages de waitlist avec authentification et dashboard (dans le dossier `nextjs-saas/`)

---

## 🚀 Waitlist Page (Go)

A beautiful, dead-simple waitlist page that deploys in seconds. One Docker command, zero configuration required.

![License](https://img.shields.io/badge/license-MIT-blue.svg)
Expand Down Expand Up @@ -217,3 +226,52 @@ Create a new Web Service, connect your repo, and set environment variables in th
## License

MIT

---

## 🎯 Waitlist SaaS (Next.js)

Une application SaaS complète pour créer et gérer plusieurs pages de waitlist avec authentification et dashboard.

### Fonctionnalités

- ✅ **Authentification complète** : Inscription et connexion sécurisées
- ✅ **Dashboard intuitif** : Gérez toutes vos waitlists depuis un seul endroit
- ✅ **Personnalisation complète** : Couleurs, logo, contenu personnalisables
- ✅ **Gestion des abonnés** : Visualisez et exportez vos inscriptions en CSV
- ✅ **Pages publiques** : URLs personnalisables pour chaque waitlist (`/w/[slug]`)
- ✅ **Champs personnalisables** : Collectez nom, email, entreprise selon vos besoins

### Technologies

- **Next.js 16** avec App Router
- **TypeScript** pour la sécurité de type
- **Prisma** avec SQLite (facilement migrable vers PostgreSQL)
- **NextAuth.js** pour l'authentification
- **Tailwind CSS** pour le styling
- **bcryptjs** pour le hachage des mots de passe

### Installation

```bash
cd nextjs-saas
npm install
npx prisma migrate dev
npx prisma generate
```

Configurez les variables d'environnement dans `.env.local` :

```env
DATABASE_URL="file:./dev.db"
NEXTAUTH_SECRET="votre-secret-key-changez-en-production"
NEXTAUTH_URL="http://localhost:3000"
```

Lancez le serveur de développement :

```bash
npm run dev
```

Pour plus de détails, consultez le [README du projet Next.js](./nextjs-saas/README.md).
55 changes: 55 additions & 0 deletions nextjs-saas/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions

# testing
/coverage

# next.js
/.next/
/out/

# production
/build

# misc
.DS_Store
*.pem

# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
.pnpm-debug.log*

# env files (can opt-in for committing if needed)
.env*

# vercel
.vercel

# typescript
*.tsbuildinfo
next-env.d.ts

/app/generated/prisma

# uploaded files
/public/uploads/*
!/public/uploads/.gitkeep

# database files
*.db
*.db-journal
/prisma/dev.db
/prisma/dev.db-journal
dev.db
dev.db-journal
152 changes: 152 additions & 0 deletions nextjs-saas/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
# Waitlist SaaS - Générateur de pages d'attente

Un mini SaaS permettant de créer et personnaliser des pages de waitlist pour votre produit.

## 🚀 Fonctionnalités

- ✅ **Authentification complète** : Inscription et connexion sécurisées
- ✅ **Dashboard intuitif** : Gérez toutes vos waitlists depuis un seul endroit
- ✅ **Personnalisation complète** : Couleurs, logo, contenu personnalisables
- ✅ **Gestion des abonnés** : Visualisez et exportez vos inscriptions en CSV
- ✅ **Pages publiques** : URLs personnalisables pour chaque waitlist (`/w/[slug]`)
- ✅ **Champs personnalisables** : Collectez nom, email, entreprise selon vos besoins

## 🛠️ Technologies

- **Next.js 16** avec App Router
- **TypeScript** pour la sécurité de type
- **Prisma** avec SQLite (facilement migrable vers PostgreSQL)
- **NextAuth.js** pour l'authentification
- **Tailwind CSS** pour le styling
- **bcryptjs** pour le hachage des mots de passe

## 📦 Installation

1. Clonez le projet et installez les dépendances :

```bash
npm install
```

2. Configurez la base de données :

```bash
npx prisma migrate dev
npx prisma generate
```

3. Configurez les variables d'environnement dans `.env.local` :

```env
DATABASE_URL="file:./dev.db"
NEXTAUTH_SECRET="votre-secret-key-changez-en-production"
NEXTAUTH_URL="http://localhost:3000"
```

4. Lancez le serveur de développement :

```bash
npm run dev
```

5. Ouvrez [http://localhost:3000](http://localhost:3000) dans votre navigateur.

## 📁 Structure du projet

```
saas-app/
├── app/
│ ├── api/ # Routes API
│ │ ├── auth/ # Authentification
│ │ ├── waitlists/ # Gestion des waitlists
│ │ └── subscribe/ # Inscription publique
│ ├── dashboard/ # Dashboard utilisateur
│ ├── login/ # Page de connexion
│ ├── register/ # Page d'inscription
│ └── w/[slug]/ # Page publique de waitlist
├── lib/
│ ├── auth.ts # Configuration NextAuth
│ └── prisma.ts # Client Prisma
├── prisma/
│ └── schema.prisma # Schéma de base de données
└── types/
└── next-auth.d.ts # Types TypeScript pour NextAuth
```

## 🎯 Utilisation

### Créer un compte

1. Allez sur `/register` pour créer un compte
2. Connectez-vous sur `/login`

### Créer une waitlist

1. Dans le dashboard, cliquez sur "Créer une waitlist"
2. Remplissez les informations :
- **Slug** : L'URL de votre page (ex: `ma-super-app`)
- **Titre** : Le nom de votre produit
- **Headline** : Le titre principal affiché sur la page
- **Couleurs** : Personnalisez l'apparence
- **Logo** : Ajoutez votre logo (URL)
- **Champs** : Choisissez quelles informations collecter

3. Votre page sera accessible sur `/w/[votre-slug]`

### Gérer les abonnés

1. Dans le dashboard, cliquez sur "Abonnés" pour une waitlist
2. Visualisez tous les inscrits avec leur position
3. Exportez la liste en CSV

## 🔐 Sécurité

- Les mots de passe sont hashés avec bcrypt
- Les routes API sont protégées par authentification
- Validation des données côté serveur
- Protection CSRF avec NextAuth

## 🚀 Déploiement

### Variables d'environnement à configurer

```env
DATABASE_URL="votre-url-de-base-de-donnees"
NEXTAUTH_SECRET="générez-une-clé-secrète-aléatoire"
NEXTAUTH_URL="https://votre-domaine.com"
```

### Migration vers PostgreSQL

Pour utiliser PostgreSQL en production, modifiez `prisma/schema.prisma` :

```prisma
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
```

Puis exécutez :

```bash
npx prisma migrate deploy
```

## 📝 Prochaines améliorations possibles

- [ ] Intégration avec des services d'email (SendGrid, Mailchimp)
- [ ] Analytics et statistiques détaillées
- [ ] Templates de design prédéfinis
- [ ] Intégration avec Stripe pour les paiements
- [ ] API publique pour intégrations tierces
- [ ] Multi-langues
- [ ] Notifications par email aux abonnés

## 📄 Licence

MIT

---

**Développé avec ❤️ en Next.js 16**
3 changes: 3 additions & 0 deletions nextjs-saas/app/api/auth/[...nextauth]/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import { handlers } from "@/lib/auth"

export const { GET, POST } = handlers
48 changes: 48 additions & 0 deletions nextjs-saas/app/api/auth/register/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { NextResponse } from "next/server"
import bcrypt from "bcryptjs"
import { prisma } from "@/lib/prisma"

export async function POST(request: Request) {
try {
const { email, password, name } = await request.json()

if (!email || !password) {
return NextResponse.json(
{ error: "Email et mot de passe requis" },
{ status: 400 }
)
}

const existingUser = await prisma.user.findUnique({
where: { email }
})

if (existingUser) {
return NextResponse.json(
{ error: "Cet email est déjà utilisé" },
{ status: 400 }
)
}

const hashedPassword = await bcrypt.hash(password, 10)

const user = await prisma.user.create({
data: {
email,
password: hashedPassword,
name: name || null,
}
})

return NextResponse.json(
{ message: "Compte créé avec succès", userId: user.id },
{ status: 201 }
)
} catch (error) {
console.error("Erreur lors de l'inscription:", error)
return NextResponse.json(
{ error: "Erreur serveur" },
{ status: 500 }
)
}
}
33 changes: 33 additions & 0 deletions nextjs-saas/app/api/auth/session/route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import { auth } from "@/lib/auth"
import { NextResponse } from "next/server"

export const runtime = "nodejs"

export async function GET() {
try {
const session = await auth()

// Format attendu par next-auth/react SessionProvider
if (!session) {
return NextResponse.json(null)
}

// Handle expires - it might be a Date object or a string
let expires: string | null = null
if (session.expires) {
if (session.expires instanceof Date) {
expires = session.expires.toISOString()
} else if (typeof session.expires === 'string') {
expires = session.expires
}
}

return NextResponse.json({
user: session.user,
expires,
})
} catch (error) {
console.error("Session API error:", error)
return NextResponse.json(null)
}
}
Loading