Skip to main content
Comprehensive validation schemas built with Zod for all user input in Biovity. Includes schemas for authentication, user profiles, job search/posting, contact forms, and waitlist.

Authentication schemas

userLoginSchema

Validates user login form data.
email
string
required
User email address (validated, trimmed, lowercased)
password
string
required
User password (minimum 1 character)
rememberMe
boolean
default:"true"
Remember user session
import { userLoginSchema } from '@/lib/validations'

const data = {
  email: 'user@example.com',
  password: 'password123',
  rememberMe: true
}

const result = userLoginSchema.safeParse(data)
if (result.success) {
  // Valid data
  console.log(result.data)
}

organizationLoginSchema

Validates organization login form data.
organizationDomain
string
required
Organization domain (e.g. “empresa.com”)
email
string
required
Corporate email address
password
string
required
Organization password
rememberMe
boolean
default:"true"
Remember session

userRegistrationSchema

Validates user registration form with password confirmation.
name
string
required
User full name (2-100 characters)
email
string
required
Email address (validated, trimmed, lowercased)
password
string
required
Password (minimum 6 characters)
confirmPassword
string
required
Password confirmation (must match password)
profession
string
required
User profession (1-100 characters)
acceptTerms
boolean
required
Terms and conditions acceptance (must be true)
import { userRegistrationSchema, validateForm } from '@/lib/validations'

const formData = {
  name: 'Juan Pérez',
  email: 'juan@example.com',
  password: 'secure123',
  confirmPassword: 'secure123',
  profession: 'Bioquímico',
  acceptTerms: true
}

const result = validateForm(userRegistrationSchema, formData)
if (!result.success) {
  console.error(result.errors)
  // { confirmPassword: "Las contraseñas no coinciden" }
}

organizationRegistrationSchema

Validates organization registration form.
contactName
string
required
Contact person name (2-100 characters)
contactEmail
string
required
Corporate email address
contactPassword
string
required
Password (minimum 8 characters for organizations)
confirmPassword
string
required
Password confirmation
contactPosition
string
Contact person position (1-100 characters)
organizationName
string
required
Organization name (2-200 characters)
organizationWebsite
string
required
Organization website URL (must start with http:// or https://)
acceptTerms
boolean
required
Terms acceptance (must be true)

validateForm

Helper function that safely parses data and returns formatted errors.
schema
ZodSchema
required
Zod schema to validate against
data
unknown
required
Data to validate
return
object
Validation result:
  • Success: { success: true, data: T }
  • Failure: { success: false, errors: Record<string, string> }
import { validateForm, userLoginSchema } from '@/lib/validations'

const result = validateForm(userLoginSchema, formData)

if (result.success) {
  // Use validated data
  await login(result.data)
} else {
  // Display errors
  Object.entries(result.errors).forEach(([field, message]) => {
    setFieldError(field, message)
  })
}

Profile schemas

userProfileSchema

Full user profile validation.
name
string
required
User name (2-100 characters)
email
string
required
Email address
phone
string
Phone number (8-20 characters, international format)
location
string
User location (2-200 characters)
profession
string
Profession (up to 100 characters)
bio
string
Biography (up to 2000 characters)
experience
string
Experience description (up to 50 characters)
skills
string[]
Array of skills (1-20 items, each 1-50 characters)
avatar
string
Avatar URL or base64 data URI

avatarFileSchema

Validates avatar file uploads.
file
File
required
Image file (JPEG, PNG, WebP, or GIF, max 2MB)
import { avatarFileSchema, validateAvatarFile } from '@/lib/validations'

function handleAvatarUpload(file: File) {
  const result = validateAvatarFile(file)
  
  if (!result.success) {
    alert(result.error)
    return
  }
  
  // Upload valid file
  uploadAvatar(result.data)
}

validateProfileSave

Validates profile data for save operation.
data
unknown
required
Profile data to validate (requires name, email, profession)
return
object
Validation result with success boolean and formatted errors

Job schemas

jobSearchSchema

Validates job search filters.
query
string
Search query text (up to 200 characters)
location
string
Location filter (up to 200 characters)
remoteOnly
boolean
default:"false"
Show only remote jobs
jobType
string
default:"any"
Job type: “any”, “full-time”, “part-time”, “contract”, “internship”
experience
string
default:"any"
Experience level: “any”, “junior”, “mid”, “senior”
minSalary
number
Minimum salary (0 to 100,000,000)
maxSalary
number
Maximum salary (0 to 100,000,000, must be >= minSalary)
import { jobSearchSchema } from '@/lib/validations'

const filters = {
  query: 'bioquímico',
  location: 'Santiago',
  remoteOnly: false,
  jobType: 'full-time',
  experience: 'mid',
  minSalary: 2000000,
  maxSalary: 3500000
}

const result = jobSearchSchema.safeParse(filters)

jobPostingSchema

Validates job posting data.
title
string
required
Job title (5-200 characters)
company
string
required
Company name (2-200 characters)
location
string
required
Job location (2-200 characters)
salaryMin
number
Minimum salary (0 to 100,000,000)
salaryMax
number
Maximum salary (0 to 100,000,000, must be >= salaryMin)
jobType
string
required
Job type enum value
experienceLevel
string
required
Experience level enum value
description
string
required
Job description (50-10,000 characters)
requirements
string
Job requirements (20-5,000 characters)
tags
string[]
default:"[]"
Job tags (1-20 items, each 1-50 characters)
isRemote
boolean
default:"false"
Is this a remote position
isActive
boolean
default:"true"
Is this job posting active

jobApplicationSchema

Validates job application submissions.
jobId
string
required
Job UUID
coverLetter
string
required
Cover letter (50-5,000 characters)
resumeUrl
string
required
Resume URL (valid URL format)
answers
array
Optional screening question answers
  • Each item: { question: string, answer: string }

validateJobSearch

Validates job search filters with salary range validation.
data
unknown
required
Search filters to validate
return
object
Validation result with formatted errors

validateJobPosting

Validates job posting data with salary range validation.
data
unknown
required
Job posting to validate
return
object
Validation result with formatted errors

Contact schemas

organizationContactSchema

Validates organization contact form (landing page).
nombre
string
required
First name (2-100 characters)
apellido
string
required
Last name (2-100 characters)
email
string
required
Corporate email address
telefono
string
Phone number (8-20 characters)
empresa
string
required
Company name (2-200 characters)
mensaje
string
required
Message (10-5,000 characters)

generalContactSchema

Validates general contact form.
name
string
required
Contact name
email
string
required
Email address
subject
string
required
Subject line (5-200 characters)
message
string
required
Message content (10-5,000 characters)

supportContactSchema

Validates support request form.
name
string
required
User name
email
string
required
Email address
issueType
string
required
Issue type: “login”, “profile”, “jobs”, “applications”, “billing”, “other”
description
string
required
Issue description (10-5,000 characters)
attachments
File[]
File attachments (max 5 files, each max 5MB, JPEG/PNG/PDF only)
import { supportContactSchema } from '@/lib/validations'

const supportData = {
  name: 'Juan Pérez',
  email: 'juan@example.com',
  issueType: 'login',
  description: 'No puedo iniciar sesión en mi cuenta',
  attachments: [screenshotFile]
}

const result = supportContactSchema.safeParse(supportData)

Waitlist schemas

waitlistSchema

Validates waitlist signup data.
email
string
required
Email address (validated and normalized)
role
string
required
Role: “professional” or “empresa”
import { waitlistSchema, validateWaitlistRequest } from '@/lib/validations'

const data = {
  email: 'user@example.com',
  role: 'professional'
}

const result = validateWaitlistRequest(data)
if (result.success) {
  await addToWaitlist(result.data)
}

Primitive schemas

Base validation schemas used throughout the application.

Email schemas

  • emailSchema: RFC 5322 compliant email (max 254 chars, trimmed, lowercased)
  • corporateEmailSchema: Same as emailSchema (for organization emails)

Password schemas

  • userPasswordSchema: User password (6-128 characters)
  • organizationPasswordSchema: Organization password (8-128 characters)

Text schemas

  • nameSchema: Person name (2-100 chars, letters/spaces/hyphens/apostrophes only)
  • shortTextSchema: Generic short text (1-100 chars)
  • bioSchema: Biography/description (up to 2000 chars)
  • messageSchema: Message content (10-5000 chars)

URL schemas

  • urlSchema: Valid URL (must start with http:// or https://)
  • domainSchema: Domain name only (lowercase, no protocol)

Other schemas

  • phoneSchema: International phone number (8-20 chars, optional)
  • locationSchema: Location string (2-200 chars, optional)
  • skillsSchema: Array of skill strings (1-20 items, each 1-50 chars)

Enum schemas

  • userTypeSchema: “persona” | “organización”
  • waitlistRoleSchema: “professional” | “empresa”
  • jobTypeSchema: “any” | “full-time” | “part-time” | “contract” | “internship”
  • experienceLevelSchema: “any” | “junior” | “mid” | “senior”
import { 
  emailSchema, 
  nameSchema, 
  phoneSchema,
  jobTypeSchema 
} from '@/lib/validations'

// Validate individual fields
const email = emailSchema.parse('user@example.com')
const name = nameSchema.parse('Juan Pérez')
const phone = phoneSchema.parse('+56912345678')
const jobType = jobTypeSchema.parse('full-time')

Type exports

All schemas export TypeScript types using z.infer:
import type { 
  UserLoginInput,
  UserRegistrationInput,
  JobSearchInput,
  JobPostingInput,
  UserProfile,
  OrganizationContactInput 
} from '@/lib/validations'

Source

Defined in:
  • lib/validations/auth.ts - Authentication schemas
  • lib/validations/profile.ts - Profile schemas
  • lib/validations/job.ts - Job schemas
  • lib/validations/contact.ts - Contact schemas
  • lib/validations/waitlist.ts - Waitlist schemas
  • lib/validations/primitives.ts - Base primitive schemas
  • lib/validations/index.ts - Main export