gohorsejobs/backend/internal/models/user.go
NANDO9322 ddc2f5dd03 feat: atualiza fluxo de cadastro de candidatos com persistência completa de dados e máscara de telefone
Frontend:
- Implementar máscara de entrada de telefone para números BR ((XX) XXXXX-XXXX).
- Atualizar formulário de cadastro para enviar dados completos do perfil do candidato (endereço, formação, habilidades, etc.).
- Corrigir problemas de idioma misto na página de Detalhes da Vaga e adicionar traduções faltantes.

Backend:
- Atualizar modelo de Usuário, Entidade e DTOs para incluir campos de perfil (Data de Nascimento, Endereço, Formação, etc.).
- Atualizar UserRepository para persistir e recuperar os dados estendidos do usuário no PostgreSQL.
- Atualizar RegisterCandidateUseCase para mapear campos de entrada para a entidade Usuário.
2026-01-06 18:19:47 -03:00

75 lines
2.9 KiB
Go
Executable file

package models
import "time"
// User represents a system user (SuperAdmin, CompanyAdmin, Recruiter, or JobSeeker)
type User struct {
ID string `json:"id" db:"id"`
Identifier string `json:"identifier" db:"identifier"`
PasswordHash string `json:"-" db:"password_hash"` // Never expose password hash in JSON
Role string `json:"role" db:"role"` // superadmin, admin, recruiter, candidate
// Personal Info
FullName string `json:"fullName" db:"full_name"`
Phone *string `json:"phone,omitempty" db:"phone"`
LineID *string `json:"lineId,omitempty" db:"line_id"`
WhatsApp *string `json:"whatsapp,omitempty" db:"whatsapp"`
Instagram *string `json:"instagram,omitempty" db:"instagram"`
// Candidate Profile Info
BirthDate *time.Time `json:"birthDate,omitempty" db:"birth_date"`
Address *string `json:"address,omitempty" db:"address"`
City *string `json:"city,omitempty" db:"city"`
State *string `json:"state,omitempty" db:"state"`
ZipCode *string `json:"zipCode,omitempty" db:"zip_code"`
Education *string `json:"education,omitempty" db:"education"`
Experience *string `json:"experience,omitempty" db:"experience"`
Skills []string `json:"skills,omitempty" db:"skills"`
Objective *string `json:"objective,omitempty" db:"objective"`
Title *string `json:"title,omitempty" db:"title"`
Bio *string `json:"bio,omitempty" db:"bio"`
AvatarURL *string `json:"avatarUrl,omitempty" db:"avatar_url"`
// Settings
Language string `json:"language" db:"language"` // pt, en, es, ja
Active bool `json:"active" db:"active"`
// Metadata
CreatedAt time.Time `json:"createdAt" db:"created_at"`
UpdatedAt time.Time `json:"updatedAt" db:"updated_at"`
LastLoginAt *time.Time `json:"lastLoginAt,omitempty" db:"last_login_at"`
}
// UserResponse is the public representation of a user (without sensitive data)
type UserResponse struct {
ID string `json:"id"`
Identifier string `json:"identifier"`
Role string `json:"role"`
FullName string `json:"fullName"`
Phone *string `json:"phone,omitempty"`
LineID *string `json:"lineId,omitempty"`
WhatsApp *string `json:"whatsapp,omitempty"`
Instagram *string `json:"instagram,omitempty"`
Language string `json:"language"`
Active bool `json:"active"`
CreatedAt time.Time `json:"createdAt"`
LastLoginAt *time.Time `json:"lastLoginAt,omitempty"`
}
// ToResponse converts User to UserResponse
func (u *User) ToResponse() UserResponse {
return UserResponse{
ID: u.ID,
Identifier: u.Identifier,
Role: u.Role,
FullName: u.FullName,
Phone: u.Phone,
LineID: u.LineID,
WhatsApp: u.WhatsApp,
Instagram: u.Instagram,
Language: u.Language,
Active: u.Active,
CreatedAt: u.CreatedAt,
LastLoginAt: u.LastLoginAt,
}
}