first commit

This commit is contained in:
Beyhan Oğur
2026-04-26 22:18:17 +03:00
commit 7b2b27a42c
1660 changed files with 123050 additions and 0 deletions

94
lib/types/auth.ts Normal file
View File

@@ -0,0 +1,94 @@
/**
* Auth API types (backend /api/v1/auth/*)
* @see Temp/login_register.md
*/
/** User object in login response */
export interface AuthUserLogin {
id: number
email: string
first_name: string
last_name: string
username: string
is_admin: boolean
}
/** User object in /me response (no username in doc, but same shape) */
export interface AuthUserMe {
id: number
email: string
first_name: string
last_name: string
is_admin: boolean
}
/** User object in register response */
export interface AuthUserRegister {
id: number
email: string
first_name: string
last_name: string
username: string
email_verified: boolean
is_admin: boolean
}
// --- Login ---
export interface LoginRequest {
email: string
password: string
}
export interface LoginResponse {
access_token: string
refresh_token: string
user: AuthUserLogin
}
// --- Me ---
export interface MeResponse {
user: AuthUserMe
}
// --- Refresh ---
export interface RefreshRequest {
refresh_token: string
}
export interface RefreshResponse {
access_token: string
refresh_token: string
}
// --- Register ---
export interface RegisterRequest {
email: string
first_name: string
last_name: string
password: string
username: string
}
/** Client sends turnstile_token to our proxy; backend receives only RegisterRequest */
export interface RegisterRequestWithTurnstile extends RegisterRequest {
turnstile_token: string
}
export interface RegisterResponse {
message: string
user: AuthUserRegister
}
// --- Resend verification ---
export interface ResendVerificationRequest {
email: string
}
export interface ResendVerificationResponse {
message: string
}
// --- Verify email ---
export interface VerifyEmailResponse {
message: string
}

42
lib/validations/auth.ts Normal file
View File

@@ -0,0 +1,42 @@
import { z } from 'zod'
export const loginSchema = z.object({
email: z.string().min(1, 'E-posta gerekli').email('Geçerli bir e-posta girin'),
password: z.string().min(1, 'Şifre gerekli'),
})
export const registerSchema = z.object({
email: z.string().min(1, 'E-posta gerekli').email('Geçerli bir e-posta girin'),
first_name: z.string().min(1, 'Ad gerekli').max(100, 'Ad en fazla 100 karakter olabilir'),
last_name: z.string().min(1, 'Soyad gerekli').max(100, 'Soyad en fazla 100 karakter olabilir'),
username: z.string().min(1, 'Kullanıcı adı gerekli').max(150, 'Kullanıcı adı en fazla 150 karakter olabilir'),
password: z.string().min(6, 'Şifre en az 6 karakter olmalı'),
password_confirm: z.string().min(1, 'Şifre tekrarı gerekli'),
}).refine((data) => data.password === data.password_confirm, {
message: 'Şifreler eşleşmiyor',
path: ['password_confirm'],
})
export type LoginInput = z.infer<typeof loginSchema>
export type RegisterInput = z.infer<typeof registerSchema>
export function getFirstZodError (err: z.ZodError): string {
const issues = (err as { issues?: Array<{ message?: string }>; errors?: Array<{ message?: string }> }).issues
?? (err as { errors?: Array<{ message?: string }> }).errors
?? []
const first = issues[0]
return first ? (first.message || 'Doğrulama hatası') : 'Doğrulama hatası'
}
/** Map Zod error to field-level errors for form display */
export function getFieldErrors (err: z.ZodError): Record<string, string> {
const issues = (err as { issues?: Array<{ path: unknown[]; message?: string }>; errors?: Array<{ path: unknown[]; message?: string }> }).issues
?? (err as { errors?: Array<{ path: unknown[]; message?: string }> }).errors
?? []
const out: Record<string, string> = {}
for (const e of issues) {
const path = e.path?.[0]
if (path != null && typeof path === 'string' && e.message) out[path] = e.message
}
return out
}