Faixa etária do terapeuta (exibição na PDP)

TLDR: Adiciona um campo age_range ao perfil do terapeuta para que a faixa etária atendida (crianças, adulto, idoso) seja exibida na PDP.

Contexto

Queremos exibir na PDP do terapeuta a(s) faixa(s) etária(s) atendida(s) por ele (crianças, adulto, idoso), como um array serializado em user_profiles, validado contra uma constante de valores permitidos.

Esta entrega contempla apenas a exibição da faixa etária na PDP. Os fluxos reais de configuração dessa informação (seleção no onboarding do terapeuta, edição e definição de visibilidade no perfil) não fazem parte deste escopo e serão implementados depois, em outra entrega. O endpoint de escrita criado aqui só existe para permitir popular dados de teste manualmente enquanto o frontend testa a exibição do GET — ele não é chamado por nenhum fluxo de onboarding ou perfil ainda.

Objetivos

  • Criar uma constante de valores válidos de faixa etária
  • Expor a faixa etária na PDP do terapeuta (GET /api/v1/terapeuta/:slug)
  • Permitir escrever a faixa etária pelo endpoint de atualização de perfil (PATCH/PUT /api/v1/me/profile), sem nenhum side-effect novo (sem aprovação de step de onboarding, sem sincronização com SearchTherapist/busca)
  • Não alterar nenhum outro fluxo (onboarding, publicação de perfil, busca de terapeutas)

Fora de escopo

  • app/use_cases/user_profiles/update_by_user.rb — nenhum hook after novo; age_range não aprova nenhum step de onboarding
  • search_therapists — sem coluna nova, sem sincronização, sem filtro de busca
  • config/routes.rb — nenhuma rota nova; reaproveita PATCH/PUT /api/v1/me/profile
  • Onboarding e perfil do terapeuta (UI, edição, visibilidade)

Mudanças

  • db/migrate/XXXXXXXXXXXXXX_add_age_range_to_user_profiles.rb — nova coluna age_range:text em user_profiles
  • config/initializers/trg.rb — nova constante AGE_RANGES = ["Crianças", "Adulto", "Idoso"]
  • app/models/user_profile.rb:
    • serialize :age_range, type: Array
    • validates :age_range, inclusion: {in: AGE_RANGES, message: "não é uma opção válida."}
  • app/use_cases/user_profiles/update_by_user_validation.rb — adicionar :age_range ao attr_accessor e ao hash de profile_attributes
  • app/controllers/api/v1/users_profiles_controller.rb — adicionar age_range: ToArray.call(params[:user_profile].as_json["age_range"]) ao merge de profile_params
  • app/serializers/therapist_serializer.rb — adicionar :age_range aos attributes (é o que a PDP expõe)
  • app/serializers/user_profile_serializer.rb — adicionar :age_range aos attributes (para o GET /api/v1/me/profile também refletir o valor salvo)
  • spec/factories/user_profiles.rb — adicionar age_range { ["Adulto"] } na factory base e age_range { nil } no trait :blank

Plano de implementação

  1. test: model — UserProfile valida age_range contra AGE_RANGES (caso válido e inválido) — spec/models/user_profile_spec.rb
  2. test: request — PATCH /api/v1/me/profile aceita age_range e persiste — spec/requests/api/v1/user_profiles_update_spec.rb
  3. test: request — GET /api/v1/terapeuta/:slug retorna age_range no body — spec/requests/api/v1/therapists_show_spec.rb
  4. feat: migration + constante AGE_RANGES + model (serialize/validates)
  5. feat: use case de update (UpdateByUserValidation) + controller (UsersProfilesController#profile_params)
  6. feat: serializers (TherapistSerializer, UserProfileSerializer) + factory

Cada passo commitado isoladamente, com testes verdes antes de avançar. Sem fase de refactor: ou perf: previstas — a mudança é aditiva e de baixa complexidade.

Como verificar

  • make test test=spec/models/user_profile_spec.rb
  • make test test=spec/requests/api/v1/user_profiles_update_spec.rb
  • make test test=spec/requests/api/v1/therapists_show_spec.rb
  • Manual: PATCH /api/v1/me/profile com {"user_profile": {"age_range": ["Adulto", "Idoso"]}} autenticado como terapeuta, depois GET /api/v1/terapeuta/:slug do mesmo terapeuta, confirmando que age_range aparece no body — o frontend usa esse GET para testar a exibição na PDP

Documentação

Nenhuma mudança de documentação necessária — mudança apenas aditiva e de exibição. Os fluxos de configuração real (onboarding/perfil), que vão gerar documentação de regra de negócio, serão tratados na entrega futura.