`,
}).catch(() => {})
- // Don't auto-login after registration: require explicit login so the
- // user learns the flow (and enters 2FA if they later enable it).
+ // Notify the platform owner about new reseller signups (best-effort).
+ if (accountType === 'reseller') {
+ const adminEmail = process.env.ADMIN_EMAIL
+ if (adminEmail) {
+ await sendEmail({
+ to: adminEmail,
+ subject: `Neue Reseller-Bewerbung — ${companyName}`,
+ text: `Eine neue Reseller-Bewerbung ist eingegangen.\n\nFirma: ${companyName}\nE-Mail: ${email}\n\nBitte im Admin-Bereich prüfen und genehmigen.`,
+ html: `
Eine neue Reseller-Bewerbung ist eingegangen.
Firma: ${companyName} E-Mail: ${email}
Bitte im Admin-Bereich prüfen und genehmigen.
`,
+ }).catch(() => {})
+ }
+ }
+
return NextResponse.json({
ok: true,
- message: 'Konto erstellt. Bitte melden Sie sich an.',
+ message: accountType === 'reseller'
+ ? 'Reseller-Konto erstellt. Nach Prüfung durch den Administrator erhalten Sie Zugang.'
+ : 'Konto erstellt. Bitte melden Sie sich an.',
role,
+ accountType,
emailVerificationSent: true,
- // If this is the very first owner, flag it so the UI can show guidance.
- isFirstOwner: role === 'owner',
+ ...(accountType === 'reseller' ? { resellerStatus: 'pending' } : {}),
}, { status: 201 })
} catch (err) {
const msg = err instanceof Error ? err.message : 'internal server error'
diff --git a/src/app/register/page.tsx b/src/app/register/page.tsx
index 8f8abf6..5db402a 100644
--- a/src/app/register/page.tsx
+++ b/src/app/register/page.tsx
@@ -6,12 +6,17 @@ import Link from 'next/link'
import { Button } from '@/components/ui/button'
import { Input } from '@/components/ui/input'
import { Label } from '@/components/ui/label'
-import { Loader2, Lock, Mail, User, ShieldCheck } from 'lucide-react'
+import { Loader2, Lock, Mail, User, ShieldCheck, Building2, Briefcase } from 'lucide-react'
+import { cn } from '@/lib/utils'
+
+type AccountType = 'user' | 'reseller'
export default function RegisterPage() {
const router = useRouter()
+ const [accountType, setAccountType] = useState('user')
const [name, setName] = useState('')
const [email, setEmail] = useState('')
+ const [companyName, setCompanyName] = useState('')
const [password, setPassword] = useState('')
const [confirm, setConfirm] = useState('')
const [loading, setLoading] = useState(false)
@@ -27,6 +32,10 @@ export default function RegisterPage() {
const submit = async (e: React.FormEvent) => {
e.preventDefault()
if (!name || !email || !password) return
+ if (accountType === 'reseller' && !companyName.trim()) {
+ setError('Für Reseller-Registrierung ist ein Firmenname erforderlich.')
+ return
+ }
if (password !== confirm) {
setError('Passwörter stimmen nicht überein.')
return
@@ -37,7 +46,13 @@ export default function RegisterPage() {
const res = await fetch('/api/auth/register', {
method: 'POST',
headers: { 'content-type': 'application/json' },
- body: JSON.stringify({ name, email: email.toLowerCase(), password }),
+ body: JSON.stringify({
+ name,
+ email: email.toLowerCase(),
+ password,
+ accountType,
+ ...(accountType === 'reseller' ? { companyName: companyName.trim() } : {}),
+ }),
})
const data = await res.json()
if (!res.ok) {
@@ -67,9 +82,68 @@ export default function RegisterPage() {
+ {/* Account type selector */}
+
+
+
+
+ {accountType === 'reseller' && (
+
+
+
+ Reseller können eigene Kunden anlegen und lizenzieren. Nach der Registrierung prüft der Administrator Ihre Bewerbung — Sie erhalten Zugang nach Freigabe.
+
+