package dto // CreateJobRequest represents the request to create a new job type CreateJobRequest struct { CompanyID string `json:"companyId" validate:"required"` Title string `json:"title" validate:"required,min=5,max=255"` Description string `json:"description" validate:"required,min=20"` SalaryMin *float64 `json:"salaryMin,omitempty"` SalaryMax *float64 `json:"salaryMax,omitempty"` SalaryType *string `json:"salaryType,omitempty" validate:"omitempty,oneof=hourly daily weekly monthly yearly"` Currency *string `json:"currency,omitempty" validate:"omitempty,oneof=BRL USD EUR GBP JPY CNY AED CAD AUD CHF"` SalaryNegotiable bool `json:"salaryNegotiable"` EmploymentType *string `json:"employmentType,omitempty" validate:"omitempty,oneof=full-time part-time dispatch contract temporary training voluntary permanent"` WorkMode *string `json:"workMode,omitempty" validate:"omitempty,oneof=onsite hybrid remote"` WorkingHours *string `json:"workingHours,omitempty"` Location *string `json:"location,omitempty"` RegionID *int `json:"regionId,omitempty"` CityID *int `json:"cityId,omitempty"` Requirements map[string]interface{} `json:"requirements,omitempty"` Benefits map[string]interface{} `json:"benefits,omitempty"` Questions map[string]interface{} `json:"questions,omitempty"` VisaSupport bool `json:"visaSupport"` LanguageLevel *string `json:"languageLevel,omitempty"` Status string `json:"status" validate:"oneof=draft open closed review published paused expired archived reported"` } // UpdateJobRequest represents the request to update a job type UpdateJobRequest struct { Title *string `json:"title,omitempty" validate:"omitempty,min=5,max=255"` Description *string `json:"description,omitempty" validate:"omitempty,min=20"` SalaryMin *float64 `json:"salaryMin,omitempty"` SalaryMax *float64 `json:"salaryMax,omitempty"` SalaryType *string `json:"salaryType,omitempty" validate:"omitempty,oneof=hourly daily weekly monthly yearly"` Currency *string `json:"currency,omitempty" validate:"omitempty,oneof=BRL USD EUR GBP JPY CNY AED CAD AUD CHF"` SalaryNegotiable *bool `json:"salaryNegotiable,omitempty"` EmploymentType *string `json:"employmentType,omitempty" validate:"omitempty,oneof=full-time part-time dispatch contract temporary training voluntary permanent"` WorkMode *string `json:"workMode,omitempty" validate:"omitempty,oneof=onsite hybrid remote"` WorkingHours *string `json:"workingHours,omitempty"` Location *string `json:"location,omitempty"` RegionID *int `json:"regionId,omitempty"` CityID *int `json:"cityId,omitempty"` Requirements map[string]interface{} `json:"requirements,omitempty"` Benefits map[string]interface{} `json:"benefits,omitempty"` Questions map[string]interface{} `json:"questions,omitempty"` VisaSupport *bool `json:"visaSupport,omitempty"` LanguageLevel *string `json:"languageLevel,omitempty"` Status *string `json:"status,omitempty" validate:"omitempty,oneof=draft open closed review published paused expired archived reported"` IsFeatured *bool `json:"isFeatured,omitempty"` FeaturedUntil *string `json:"featuredUntil,omitempty"` // ISO8601 string } // CreateApplicationRequest represents a job application (guest or logged user) type CreateApplicationRequest struct { JobID string `json:"jobId" validate:"required"` UserID *string `json:"userId,omitempty"` Name *string `json:"name,omitempty"` Phone *string `json:"phone,omitempty"` LineID *string `json:"lineId,omitempty"` WhatsApp *string `json:"whatsapp,omitempty"` Email *string `json:"email,omitempty"` Message *string `json:"message,omitempty"` ResumeURL *string `json:"resumeUrl,omitempty"` Documents map[string]interface{} `json:"documents,omitempty"` Answers map[string]interface{} `json:"answers,omitempty"` } // UpdateApplicationStatusRequest represents updating application status (recruiter only) type UpdateApplicationStatusRequest struct { Status string `json:"status" validate:"required,oneof=pending reviewed shortlisted rejected hired"` Notes *string `json:"notes,omitempty"` } // CreateCompanyRequest represents creating a new company type CreateCompanyRequest struct { Name string `json:"name" validate:"required,min=3,max=255"` Slug string `json:"slug" validate:"required,min=3,max=255"` Type *string `json:"type,omitempty"` Document *string `json:"document,omitempty"` Address *string `json:"address,omitempty"` RegionID *int `json:"regionId,omitempty"` CityID *int `json:"cityId,omitempty"` Phone *string `json:"phone,omitempty"` Email *string `json:"email,omitempty"` Website *string `json:"website,omitempty"` LogoURL *string `json:"logoUrl,omitempty"` Description *string `json:"description,omitempty"` YearsInMarket *string `json:"yearsInMarket,omitempty"` } // UpdateCompanyRequest represents updating company information type UpdateCompanyRequest struct { Name *string `json:"name,omitempty" validate:"omitempty,min=3,max=255"` Slug *string `json:"slug,omitempty" validate:"omitempty,min=3,max=255"` Type *string `json:"type,omitempty"` Document *string `json:"document,omitempty"` Address *string `json:"address,omitempty"` RegionID *int `json:"regionId,omitempty"` CityID *int `json:"cityId,omitempty"` Phone *string `json:"phone,omitempty"` Email *string `json:"email,omitempty"` Website *string `json:"website,omitempty"` LogoURL *string `json:"logoUrl,omitempty"` Description *string `json:"description,omitempty"` YearsInMarket *string `json:"yearsInMarket,omitempty"` Active *bool `json:"active,omitempty"` Verified *bool `json:"verified,omitempty"` } // AssignUserToCompanyRequest represents assigning a user to a company type AssignUserToCompanyRequest struct { UserID string `json:"userId" validate:"required"` CompanyID string `json:"companyId" validate:"required"` Role string `json:"role" validate:"required,oneof=admin recruiter"` Permissions map[string]interface{} `json:"permissions,omitempty"` } // PaginationQuery represents pagination parameters type PaginationQuery struct { Page int `form:"page" validate:"min=1"` Limit int `form:"limit" validate:"min=1,max=100"` } // JobFilterQuery represents job filtering parameters type JobFilterQuery struct { PaginationQuery CompanyID *string `form:"companyId"` RegionID *int `form:"regionId"` CityID *int `form:"cityId"` EmploymentType *string `form:"employmentType"` WorkMode *string `form:"workMode"` // "remote", "hybrid", "onsite" Location *string `form:"location"` // Partial match Status *string `form:"status"` IsFeatured *bool `form:"isFeatured"` VisaSupport *bool `form:"visaSupport"` LanguageLevel *string `form:"languageLevel"` Search *string `form:"search"` // Covers title, description, company name // Advanced filters SalaryMin *float64 `form:"salaryMin"` // Minimum salary filter SalaryMax *float64 `form:"salaryMax"` // Maximum salary filter Currency *string `form:"currency"` // BRL, USD, EUR, GBP, JPY // Merged Sort Options SortBy *string `form:"sortBy"` // recent, salary_asc, salary_desc, relevance SortOrder *string `form:"sortOrder"` // asc, desc (for legacy support if needed) SalaryType *string `form:"salaryType"` // hourly, monthly, yearly LocationSearch *string `form:"locationSearch"` // HEAD's explicit location text search // Date Posted filter (24h, 7d, 30d) DatePosted *string `form:"datePosted"` } // PaginatedResponse represents a paginated API response type PaginatedResponse struct { Data interface{} `json:"data"` Pagination Pagination `json:"pagination"` } // Pagination represents pagination metadata type Pagination struct { Page int `json:"page"` Limit int `json:"limit"` Total int `json:"total"` } // APIResponse represents a standard API response type APIResponse struct { Success bool `json:"success"` Data interface{} `json:"data,omitempty"` Error *string `json:"error,omitempty"` Message *string `json:"message,omitempty"` } // SaveFCMTokenRequest represents the request to save an FCM token type SaveFCMTokenRequest struct { Token string `json:"token" validate:"required"` Platform string `json:"platform" validate:"required,oneof=web android ios"` } // CreateVideoInterviewRequest represents creating a new video interview type CreateVideoInterviewRequest struct { ApplicationID string `json:"applicationId" validate:"required"` ScheduledAt string `json:"scheduledAt" validate:"required"` DurationMinutes int `json:"durationMinutes" validate:"required,min=15,max=180"` Timezone string `json:"timezone"` MeetingProvider *string `json:"meetingProvider,omitempty"` Notes *string `json:"notes,omitempty"` } // UpdateVideoInterviewRequest represents updating a video interview type UpdateVideoInterviewRequest struct { ScheduledAt *string `json:"scheduledAt,omitempty"` DurationMinutes *int `json:"durationMinutes,omitempty"` Timezone *string `json:"timezone,omitempty"` MeetingLink *string `json:"meetingLink,omitempty"` MeetingProvider *string `json:"meetingProvider,omitempty"` MeetingID *string `json:"meetingId,omitempty"` MeetingPassword *string `json:"meetingPassword,omitempty"` Status *string `json:"status,omitempty"` Notes *string `json:"notes,omitempty"` } // VideoInterviewFeedbackRequest represents submitting interview feedback type VideoInterviewFeedbackRequest struct { InterviewerFeedback *string `json:"interviewerFeedback,omitempty"` CandidateFeedback *string `json:"candidateFeedback,omitempty"` Rating *int `json:"rating,omitempty" validate:"omitempty,min=1,max=5"` } // CreateJobAlertRequest represents creating a job alert type CreateJobAlertRequest struct { SearchQuery *string `json:"searchQuery,omitempty"` Location *string `json:"location,omitempty"` EmploymentType *string `json:"employmentType,omitempty"` WorkMode *string `json:"workMode,omitempty"` SalaryMin *float64 `json:"salaryMin,omitempty"` SalaryMax *float64 `json:"salaryMax,omitempty"` Currency *string `json:"currency,omitempty"` Frequency *string `json:"frequency,omitempty" validate:"omitempty,oneof=daily weekly"` Email *string `json:"email,omitempty" validate:"omitempty,email"` // For guest alerts }