gohorsejobs/backend/internal/dto/requests.go
Tiago Yamamoto b23393bf35 feat: implement stripe subscriptions, google analytics, and user crud
- Backend:
  - Add Stripe subscription fields to companies (migration 019)
  - Implement Stripe Checkout and Webhook handlers
  - Add Metrics API (view count, recording)
  - Update Company and Job models
- Frontend:
  - Add Google Analytics component
  - Implement User CRUD in Backoffice (Dashboard)
  - Add 'Featured' badge to JobCard
- Docs: Update Roadmap and artifacts
2025-12-27 12:06:54 -03:00

158 lines
7.4 KiB
Go
Executable file

package dto
// CreateJobRequest represents the request to create a new job
type CreateJobRequest struct {
CompanyID int `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 monthly yearly"`
EmploymentType *string `json:"employmentType,omitempty" validate:"omitempty,oneof=full-time part-time dispatch contract"`
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"`
VisaSupport bool `json:"visaSupport"`
LanguageLevel *string `json:"languageLevel,omitempty"`
Status string `json:"status" validate:"oneof=draft open closed"`
}
// 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 monthly yearly"`
EmploymentType *string `json:"employmentType,omitempty" validate:"omitempty,oneof=full-time part-time dispatch contract"`
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"`
VisaSupport *bool `json:"visaSupport,omitempty"`
LanguageLevel *string `json:"languageLevel,omitempty"`
Status *string `json:"status,omitempty" validate:"omitempty,oneof=draft open closed"`
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 int `json:"jobId" validate:"required"`
UserID *int `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"`
}
// 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"`
}
// 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"`
Active *bool `json:"active,omitempty"`
Verified *bool `json:"verified,omitempty"`
}
// AssignUserToCompanyRequest represents assigning a user to a company
type AssignUserToCompanyRequest struct {
UserID int `json:"userId" validate:"required"`
CompanyID int `json:"companyId" validate:"required"`
Role string `json:"role" validate:"required,oneof=companyAdmin 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 *int `form:"companyId"`
RegionID *int `form:"regionId"`
CityID *int `form:"cityId"`
EmploymentType *string `form:"employmentType"`
WorkMode *string `form:"workMode"` // onsite, hybrid, remote
Status *string `form:"status"`
IsFeatured *bool `form:"isFeatured"`
VisaSupport *bool `form:"visaSupport"`
LanguageLevel *string `form:"languageLevel"`
Search *string `form:"search"` // Full-text search query
// Salary filters
SalaryMin *float64 `form:"salaryMin"`
SalaryMax *float64 `form:"salaryMax"`
SalaryType *string `form:"salaryType"` // hourly, monthly, yearly
// Location text search
LocationSearch *string `form:"location"`
// Sorting
SortBy string `form:"sortBy"` // date, salary, relevance
SortOrder string `form:"sortOrder"` // asc, desc (default: desc)
}
// 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"`
}