Backend: - Password reset flow (forgot/reset endpoints, tokens table) - Profile management (PUT /users/me, skills, experience, education) - Tickets system (CRUD, messages, stats) - Activity logs (list, stats) - Document validator (CNPJ, CPF, EIN support) - Input sanitizer (XSS prevention) - Full-text search em vagas (plainto_tsquery) - Filtros avançados (location, salary, workMode) - Ordenação (date, salary, relevance) Frontend: - Forgot/Reset password pages - Candidate profile edit page - Sanitize utilities (sanitize.ts) Backoffice: - TicketsModule proxy - ActivityLogsModule proxy - Dockerfile otimizado (multi-stage, non-root, healthcheck) Migrations: - 013: Profile fields to users - 014: Password reset tokens - 015: Tickets table - 016: Activity logs table
156 lines
7.3 KiB
Go
Executable file
156 lines
7.3 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"`
|
|
}
|
|
|
|
// 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"`
|
|
}
|