diff --git a/app/(dashboard)/jobs/[id]/page.tsx b/app/(dashboard)/jobs/[id]/page.tsx index 91f7075..58ede89 100644 --- a/app/(dashboard)/jobs/[id]/page.tsx +++ b/app/(dashboard)/jobs/[id]/page.tsx @@ -1,5 +1,71 @@ -export default function JobDetailPage() { - return
Detalhe da vaga placeholder
; -} +import { notFound } from 'next/navigation'; +import { getJobById } from '@/features/jobs/server/get-jobs'; + +export default async function JobDetailPage({ params }: { params: { id: string } }) { + const job = await getJobById(params.id); + + if (!job) { + notFound(); + } + + return ( +
+
+
+
+

{job.title}

+

+ {job.company_name} • {job.location} +

+
+ + Candidatar-se + +
+ +
+ + {job.modality} + + + {job.seniority} + +
-// TODO: implementar página de detalhe da vaga com informações e CTA. +
+ +
+

Descrição da Vaga

+

{job.description}

+
+ + {job.requirements.length > 0 && ( +
+

Requisitos

+
    + {job.requirements.map((req, index) => ( +
  • {req}
  • + ))} +
+
+ )} + +
+

Tecnologias

+
+ {job.technologies.map((tech) => ( + + {tech} + + ))} +
+
+
+
+ ); +} diff --git a/app/(dashboard)/jobs/page.tsx b/app/(dashboard)/jobs/page.tsx index e637123..603aa7c 100644 --- a/app/(dashboard)/jobs/page.tsx +++ b/app/(dashboard)/jobs/page.tsx @@ -1,5 +1,45 @@ -export default function JobsPage() { - return
Lista de vagas placeholder
; +import { Suspense } from 'react'; +import { getJobs } from '@/features/jobs/server/get-jobs'; +import { JobList } from '@/features/jobs/components/JobList'; +import { JobFilters } from '@/features/jobs/components/JobFilters'; +import { JobModality, SeniorityLevel } from '@/features/jobs/types'; + +interface JobsPageProps { + searchParams: Promise<{ + search?: string; + modality?: JobModality | 'ALL'; + seniority?: SeniorityLevel | 'ALL'; + tech?: string; + }>; } -// TODO: implementar listagem, filtros e paginação de vagas. +export default async function JobsPage({ searchParams }: JobsPageProps) { + const filters = await searchParams; + + // Busca vagas filtradas no lado do servidor + const jobs = await getJobs({ + search: filters.search, + modality: filters.modality, + seniority: filters.seniority, + tech: filters.tech, + }); + + return ( +
+
+

Vagas da Comunidade

+

+ Encontre e filtre vagas curadas pelo GDG Lauro de Freitas. +

+
+ + {/* Componente Client-Side para manipular os filtros de busca */} + }> + + + + {/* Lista das vagas retornadas */} + +
+ ); +} diff --git a/app/(dashboard)/layout.tsx b/app/(dashboard)/layout.tsx index 589156b..c6ba2b2 100644 --- a/app/(dashboard)/layout.tsx +++ b/app/(dashboard)/layout.tsx @@ -18,7 +18,7 @@ export default function DashboardLayout({ children }: { children: React.ReactNod const handleLogout = async () => { await logout(); - router.push('/login'); + router.push('/'); }; return ( diff --git a/app/api/jobs/[id]/route.ts b/app/api/jobs/[id]/route.ts deleted file mode 100644 index 6ef0022..0000000 --- a/app/api/jobs/[id]/route.ts +++ /dev/null @@ -1,11 +0,0 @@ -export async function GET( - _request: Request, - { params }: { params: Promise<{ id: string }> }, -) { - const { id } = await params; - return Response.json({ - message: `Detalhe da vaga ${id} será implementado em breve.`, - }); -} - -// TODO: implementar rota de detalhe da vaga e regras de autorização. diff --git a/app/api/jobs/route.ts b/app/api/jobs/route.ts deleted file mode 100644 index a2374ef..0000000 --- a/app/api/jobs/route.ts +++ /dev/null @@ -1,7 +0,0 @@ -export async function GET() { - return Response.json({ - message: 'Endpoint de vagas reservado para implementação futura.', - }); -} - -// TODO: criar rota de listagem e filtros de vagas conforme o PRD. diff --git a/features/jobs/README.md b/features/jobs/README.md index 2c8144b..3e95e9d 100644 --- a/features/jobs/README.md +++ b/features/jobs/README.md @@ -14,3 +14,12 @@ Responsável pela experiência principal de vagas e busca. - Definir filtros e paginação - Criar cards e páginas de detalhe - Modelar curadoria e submissão de vagas + +## Notas + +- `app/api/jobs/route.ts`, `app/api/jobs/[id]/route.ts` e `features/jobs/hooks/useJobs.ts` + foram removidos por serem código morto: `app/(dashboard)/jobs/page.tsx` e + `app/(dashboard)/jobs/[id]/page.tsx` chamam `getJobs`/`getJobById` direto no + servidor, sem passar por HTTP. Reative essas rotas (e o hook) somente se + surgir um consumidor real via HTTP — um client component, um app mobile ou + um webhook externo. diff --git a/features/jobs/components/JobCard.tsx b/features/jobs/components/JobCard.tsx new file mode 100644 index 0000000..981a872 --- /dev/null +++ b/features/jobs/components/JobCard.tsx @@ -0,0 +1,46 @@ +import Link from 'next/link'; +import { Job } from '../types'; + +interface JobCardProps { + job: Job; +} + +export function JobCard({ job }: JobCardProps) { + return ( +
+
+
+ + {job.modality} + + {job.seniority} +
+ +

{job.title}

+

+ {job.company_name} • {job.location} +

+ +
+ {job.technologies.map((tech) => ( + + {tech} + + ))} +
+
+ +
+ + {new Date(job.created_at).toLocaleDateString('pt-BR')} + + + Ver detalhes → + +
+
+ ); +} diff --git a/features/jobs/components/JobFilters.tsx b/features/jobs/components/JobFilters.tsx new file mode 100644 index 0000000..2e0d660 --- /dev/null +++ b/features/jobs/components/JobFilters.tsx @@ -0,0 +1,145 @@ +'use client'; + +import { usePathname, useRouter, useSearchParams } from 'next/navigation'; +import { useCallback, useState, useTransition } from 'react'; +import { JobModality, SeniorityLevel } from '../types'; + +export function JobFilters() { + const router = useRouter(); + const pathname = usePathname(); + const searchParams = useSearchParams(); + const [isPending, startTransition] = useTransition(); + + const [search, setSearch] = useState(searchParams.get('search') || ''); + const [modality, setModality] = useState(searchParams.get('modality') || 'ALL'); + const [seniority, setSeniority] = useState(searchParams.get('seniority') || 'ALL'); + const [tech, setTech] = useState(searchParams.get('tech') || ''); + + // Sincroniza as alterações com a URL da página + const applyFilters = useCallback( + (newFilters: { search?: string; modality?: string; seniority?: string; tech?: string }) => { + const params = new URLSearchParams(searchParams.toString()); + + Object.entries(newFilters).forEach(([key, value]) => { + if (value && value !== 'ALL') { + params.set(key, value); + } else { + params.delete(key); + } + }); + + startTransition(() => { + router.push(`${pathname}?${params.toString()}`); + }); + }, + [pathname, router, searchParams], + ); + + const handleSearchSubmit = (e: React.FormEvent) => { + e.preventDefault(); + applyFilters({ search, modality, seniority, tech }); + }; + + const handleReset = () => { + setSearch(''); + setModality('ALL'); + setSeniority('ALL'); + setTech(''); + startTransition(() => { + router.push(pathname); + }); + }; + + return ( +
+
+ {/* Busca por Texto (Título / Empresa) */} +
+ + setSearch(e.target.value)} + className="w-full text-sm border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" + /> +
+ + {/* Filtro de Modalidade */} +
+ + +
+ + {/* Filtro de Senioridade */} +
+ + +
+ + {/* Filtro por Tecnologia Especifica */} +
+ + setTech(e.target.value)} + className="w-full text-sm border border-gray-300 rounded-md px-3 py-2 focus:outline-none focus:ring-2 focus:ring-blue-500" + /> +
+
+ +
+ + +
+
+ ); +} diff --git a/features/jobs/components/JobList.tsx b/features/jobs/components/JobList.tsx new file mode 100644 index 0000000..07389ec --- /dev/null +++ b/features/jobs/components/JobList.tsx @@ -0,0 +1,37 @@ +import { Job } from '../types'; +import { JobCard } from './JobCard'; + +interface JobListProps { + jobs: Job[]; + loading?: boolean; +} + +export function JobList({ jobs, loading }: JobListProps) { + if (loading) { + return ( +
+ {[1, 2, 3].map((n) => ( +
+ ))} +
+ ); + } + + if (jobs.length === 0) { + return ( +
+

+ Nenhuma vaga encontrada para os filtros selecionados. +

+
+ ); + } + + return ( +
+ {jobs.map((job) => ( + + ))} +
+ ); +} diff --git a/features/jobs/server/get-jobs.ts b/features/jobs/server/get-jobs.ts new file mode 100644 index 0000000..3e1b37c --- /dev/null +++ b/features/jobs/server/get-jobs.ts @@ -0,0 +1,52 @@ +import { supabase } from '@/lib/supabase'; +import { Job, JobFilters } from '../types'; + +export async function getJobs(filters?: JobFilters): Promise { + let query = supabase + .from('jobs') + .select('*') + .eq('is_active', true) + .order('created_at', { ascending: false }); + + if (filters?.modality && filters.modality !== 'ALL') { + query = query.eq('modality', filters.modality); + } + + if (filters?.seniority && filters.seniority !== 'ALL') { + query = query.eq('seniority', filters.seniority); + } + + if (filters?.tech) { + // Faz a busca dentro do array Postgres de tecnologias + query = query.contains('technologies', [filters.tech]); + } + + if (filters?.search) { + query = query.or(`title.ilike.%${filters.search}%,company_name.ilike.%${filters.search}%`); + } + + const { data, error } = await query; + + if (error) { + console.error('Erro ao buscar vagas do Supabase:', error); + throw new Error('Não foi possível carregar as vagas.'); + } + + return data as Job[]; +} + +export async function getJobById(id: string): Promise { + const { data, error } = await supabase + .from('jobs') + .select('*') + .eq('id', id) + .eq('is_active', true) + .single(); + + if (error) { + console.error(`Erro ao buscar vaga com ID ${id}:`, error); + return null; + } + + return data as Job; +} diff --git a/features/jobs/types/index.ts b/features/jobs/types/index.ts new file mode 100644 index 0000000..e514b28 --- /dev/null +++ b/features/jobs/types/index.ts @@ -0,0 +1,26 @@ +export type JobModality = 'REMOTE' | 'HYBRID' | 'ON_SITE'; +export type SeniorityLevel = 'JUNIOR' | 'PLENO' | 'SENIOR' | 'STAFF'; + +export interface Job { + id: string; + title: string; + company_name: string; + company_logo_url?: string; + location: string; + modality: JobModality; + seniority: SeniorityLevel; + description: string; + requirements: string[]; + technologies: string[]; + application_url: string; + is_active: boolean; + created_at: string; + updated_at: string; +} + +export interface JobFilters { + search?: string; + modality?: JobModality | 'ALL'; + seniority?: SeniorityLevel | 'ALL'; + tech?: string; +} diff --git a/packages/database/migrations/001_create_jobs_table.sql b/packages/database/migrations/001_create_jobs_table.sql new file mode 100644 index 0000000..a0a594f --- /dev/null +++ b/packages/database/migrations/001_create_jobs_table.sql @@ -0,0 +1,39 @@ +-- Habilita extensão para geração de UUIDs +CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + +-- Criação do tipo ENUM para modalidade e nível de senioridade +CREATE TYPE job_modality AS ENUM ('REMOTE', 'HYBRID', 'ON_SITE'); +CREATE TYPE seniority_level AS ENUM ('JUNIOR', 'PLENO', 'SENIOR', 'STAFF'); + +-- Criação da tabela principal de vagas +CREATE TABLE IF NOT EXISTS public.jobs ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + title VARCHAR(255) NOT NULL, + company_name VARCHAR(255) NOT NULL, + company_logo_url TEXT, + location VARCHAR(255) NOT NULL, + modality job_modality NOT NULL DEFAULT 'REMOTE', + seniority seniority_level NOT NULL DEFAULT 'PLENO', + description TEXT NOT NULL, + requirements TEXT[] DEFAULT '{}', + technologies TEXT[] DEFAULT '{}', + application_url TEXT NOT NULL, + is_active BOOLEAN NOT NULL DEFAULT TRUE, + created_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()) NOT NULL, + updated_at TIMESTAMP WITH TIME ZONE DEFAULT TIMEZONE('utc'::text, NOW()) NOT NULL +); + +-- Índices para otimizar busca e filtros no Supabase +CREATE INDEX IF NOT EXISTS idx_jobs_modality ON public.jobs(modality); +CREATE INDEX IF NOT EXISTS idx_jobs_seniority ON public.jobs(seniority); +CREATE INDEX IF NOT EXISTS idx_jobs_technologies ON public.jobs USING GIN(technologies); +CREATE INDEX IF NOT EXISTS idx_jobs_is_active ON public.jobs(is_active); + +-- Habilita Row Level Security (RLS) +ALTER TABLE public.jobs ENABLE ROW LEVEL SECURITY; + +-- Política de leitura pública (qualquer pessoa pode listar/ver vagas ativas) +CREATE POLICY "Leitura publica de vagas ativas" + ON public.jobs + FOR SELECT + USING (is_active = true); \ No newline at end of file diff --git a/packages/database/seeds/jobs.sql b/packages/database/seeds/jobs.sql new file mode 100644 index 0000000..31a0f01 --- /dev/null +++ b/packages/database/seeds/jobs.sql @@ -0,0 +1,442 @@ +-- ============================================================ +-- GDGJobs - Seed inicial de vagas reais/recentes +-- Atualizado em: 04/09/2026 +-- Níveis: JUNIOR, PLENO, SENIOR e STAFF +-- ============================================================ + +INSERT INTO public.jobs ( + title, + company_name, + company_logo_url, + location, + modality, + seniority, + description, + requirements, + technologies, + application_url +) VALUES + +-- ============================================================ +-- JUNIOR +-- ============================================================ + +( + 'Junior Software Engineer', + 'Sezzle', + 'https://www.google.com/s2/favicons?domain=sezzle.com&sz=128', + 'Brasil', + 'REMOTE', + 'JUNIOR', + 'Oportunidade para pessoa desenvolvedora júnior atuar no desenvolvimento de soluções de software, participando do ciclo completo de desenvolvimento e trabalhando com aplicações web, APIs e bancos de dados.', + ARRAY[ + '0 a 3 anos de experiência em desenvolvimento', + 'Experiência com aplicações web ou APIs', + 'Conhecimento de bancos de dados relacionais', + 'Familiaridade com processos de desenvolvimento de software', + 'Conhecimento de ferramentas de IA para desenvolvimento' + ], + ARRAY[ + 'Golang', + 'TypeScript', + 'React', + 'React Native', + 'Python', + 'PostgreSQL', + 'MySQL', + 'AWS', + 'Kubernetes' + ], + 'https://br.linkedin.com/jobs/view/junior-software-engineer-brazil-at-sezzle-4462400777' +), + +( + 'Junior Software Developer - Observability', + 'Canonical', + 'https://www.google.com/s2/favicons?domain=canonical.com&sz=128', + 'Florianópolis, SC', + 'REMOTE', + 'JUNIOR', + 'Atuação no desenvolvimento de ferramentas e soluções relacionadas a observabilidade, monitoramento e infraestrutura de software dentro do ecossistema Ubuntu.', + ARRAY[ + 'Conhecimentos de programação', + 'Interesse em Linux e software open source', + 'Conhecimento básico de sistemas distribuídos', + 'Boa comunicação e capacidade de trabalhar remotamente', + 'Interesse em observabilidade e infraestrutura' + ], + ARRAY[ + 'Python', + 'Go', + 'Linux', + 'Ubuntu', + 'Kubernetes', + 'Observability', + 'Open Source' + ], + 'https://br.linkedin.com/jobs/view/junior-software-developer-observability-at-canonical-4345568345' +), + +( + 'Junior Software Engineer', + 'MixRank', + 'https://www.google.com/s2/favicons?domain=mixrank.com&sz=128', + 'Brasil', + 'REMOTE', + 'JUNIOR', + 'Vaga para início de carreira em engenharia de software em uma equipe distribuída globalmente. A posição envolve desenvolvimento de sistemas, processamento de dados e evolução de infraestrutura de software.', + ARRAY[ + 'Experiência inicial em programação', + 'Conhecimento de desenvolvimento de software', + 'Interesse em sistemas distribuídos', + 'Capacidade de aprender de forma independente', + 'Boa comunicação em ambiente remoto' + ], + ARRAY[ + 'Python', + 'PostgreSQL', + 'Distributed Systems', + 'Data Pipelines', + 'Git', + 'Cloud' + ], + 'https://br.linkedin.com/jobs/view/junior-software-engineer-%E2%80%94-remote-brazil-at-mixrank-4415454307' +), + +( + 'Desenvolvedor(a) Júnior Front-End', + 'Capgemini', + 'https://www.google.com/s2/favicons?domain=capgemini.com&sz=128', + 'São Paulo, SP', + 'HYBRID', + 'JUNIOR', + 'Atuação em desenvolvimento de aplicações front-end, participando da construção de interfaces modernas e soluções digitais para projetos de clientes.', + ARRAY[ + 'Conhecimento de desenvolvimento front-end', + 'Conhecimento de HTML, CSS e JavaScript', + 'Noções de frameworks modernos', + 'Conhecimento de Git', + 'Boa capacidade de trabalho em equipe' + ], + ARRAY[ + 'JavaScript', + 'HTML', + 'CSS', + 'Angular', + 'TypeScript', + 'Git' + ], + 'https://br.linkedin.com/jobs/junior-software-engineer-vagas-brazil?count=25&f_AL=true' +), + +-- ============================================================ +-- PLENO +-- ============================================================ + +( + 'Pleno Backend Software Engineer - Camunda', + 'Agibank', + 'https://www.google.com/s2/favicons?domain=agibank.com.br&sz=128', + 'Campinas, SP', + 'HYBRID', + 'PLENO', + 'Desenvolvimento e evolução de APIs e serviços backend, com participação na implementação de processos de negócio e arquiteturas orientadas a eventos.', + ARRAY[ + 'Experiência com Java', + 'Experiência com Spring Boot', + 'Conhecimento de APIs REST', + 'Experiência com bancos relacionais ou NoSQL', + 'Conhecimento de arquiteturas orientadas a eventos' + ], + ARRAY[ + 'Java 21', + 'Spring Boot', + 'Camunda 8', + 'PostgreSQL', + 'MongoDB', + 'Redis', + 'Apache Kafka', + 'JUnit', + 'Mockito' + ], + 'https://br.linkedin.com/jobs/view/pleno-backend-software-engineer-camunda-campinas-sp-at-lato-jobs-4455706786' +), + +( + 'Software Engineer | Backend Pleno', + 'Sankhya', + 'https://www.google.com/s2/favicons?domain=sankhya.com.br&sz=128', + 'Brasil', + 'REMOTE', + 'PLENO', + 'Desenvolvimento e evolução de soluções backend para serviços de integração e conectividade, criando APIs e microsserviços escaláveis utilizados por diferentes produtos e parceiros.', + ARRAY[ + 'Experiência com desenvolvimento backend', + 'Experiência com Java', + 'Conhecimento de APIs REST', + 'Experiência com microsserviços', + 'Conhecimento de arquitetura de sistemas' + ], + ARRAY[ + 'Java', + 'Spring Boot', + 'REST API', + 'Microservices', + 'PostgreSQL', + 'Docker', + 'Cloud' + ], + 'https://br.linkedin.com/jobs/view/software-engineer-backend-pleno-at-sankhya-4450180592' +), + +( + 'Software Engineer Pleno - Full Stack', + 'Líber', + 'https://www.google.com/s2/favicons?domain=liber.com.br&sz=128', + 'Brasil', + 'REMOTE', + 'PLENO', + 'Atuação full stack no desenvolvimento e evolução de aplicações modernas, com autonomia técnica para propor soluções e participar das decisões de produto e arquitetura.', + ARRAY[ + 'Experiência prática com Node.js', + 'Experiência com React', + 'Conhecimento de APIs', + 'Capacidade de atuar com autonomia', + 'Experiência com desenvolvimento de aplicações web' + ], + ARRAY[ + 'Node.js', + 'React', + 'TypeScript', + 'JavaScript', + 'REST API', + 'PostgreSQL', + 'Git' + ], + 'https://br.linkedin.com/jobs/view/software-engineer-pleno-node-js-react-at-liber-4437309990' +), + +( + 'Software Engineer Pleno', + 'iFood', + 'https://www.google.com/s2/favicons?domain=ifood.com.br&sz=128', + 'Brasil', + 'REMOTE', + 'PLENO', + 'Desenvolvimento de aplicações e infraestrutura de software em uma das maiores plataformas digitais da América Latina, trabalhando em soluções escaláveis e de alto volume.', + ARRAY[ + 'Experiência profissional em engenharia de software', + 'Conhecimento de desenvolvimento backend', + 'Experiência com APIs e serviços', + 'Conhecimento de cloud e infraestrutura', + 'Capacidade de trabalhar em ambientes de alta escala' + ], + ARRAY[ + 'Go', + 'Golang', + 'Cloud', + 'APIs', + 'Microservices', + 'Distributed Systems', + 'Kubernetes' + ], + 'https://br.linkedin.com/jobs/view/software-engineer-pleno-at-ifood-4452479392' +), + +-- ============================================================ +-- SENIOR +-- ============================================================ + +( + 'Senior Software Engineer - Backend', + 'Hotmart', + 'https://www.google.com/s2/favicons?domain=hotmart.com&sz=128', + 'São Paulo, SP', + 'REMOTE', + 'SENIOR', + 'Responsável por projetar e implementar arquiteturas backend robustas, escaláveis e performáticas, atuando também na resolução de problemas complexos e mentoria técnica.', + ARRAY[ + 'Experiência sólida em desenvolvimento backend', + 'Experiência com Java e Spring', + 'Conhecimento de sistemas distribuídos', + 'Experiência com cloud', + 'Conhecimento de CI/CD e DevOps', + 'Capacidade de tomada de decisões arquiteturais' + ], + ARRAY[ + 'Java', + 'Spring', + 'AWS', + 'GCP', + 'Azure', + 'CI/CD', + 'DevOps', + 'Distributed Systems' + ], + 'https://br.linkedin.com/jobs/view/senior-software-engineer-back-end-at-lato-jobs-4457008891' +), + +( + 'Senior Software Engineer - React.js / TypeScript', + 'Exadel', + 'https://www.google.com/s2/favicons?domain=exadel.com&sz=128', + 'Brasil', + 'REMOTE', + 'SENIOR', + 'Atuação como engenheiro(a) de software sênior em projetos de grande escala, desenvolvendo aplicações modernas e colaborando com equipes multidisciplinares.', + ARRAY[ + 'Experiência avançada com React', + 'Experiência com TypeScript', + 'Conhecimento de arquitetura frontend', + 'Experiência com aplicações web de grande escala', + 'Boa capacidade de comunicação técnica' + ], + ARRAY[ + 'React.js', + 'TypeScript', + 'JavaScript', + 'HTML', + 'CSS', + 'Web Architecture', + 'Cloud' + ], + 'https://br.linkedin.com/jobs/view/senior-software-engineer-react-js-typescript-at-exadel-4458922972' +), + +( + 'Senior Software Engineer | SRE & Software Architecture', + 'CI&T', + 'https://www.google.com/s2/favicons?domain=ciandt.com&sz=128', + 'Brasil', + 'REMOTE', + 'SENIOR', + 'Atuação em engenharia de software, confiabilidade e arquitetura, contribuindo para soluções modernas orientadas a cloud, automação e inteligência artificial.', + ARRAY[ + 'Experiência sólida em engenharia de software', + 'Conhecimento de arquitetura de sistemas', + 'Experiência com práticas de SRE', + 'Experiência com cloud', + 'Conhecimento de automação e CI/CD' + ], + ARRAY[ + 'SRE', + 'Cloud', + 'Software Architecture', + 'CI/CD', + 'DevOps', + 'AI', + 'Observability' + ], + 'https://br.linkedin.com/jobs/view/s%C3%AAnior-software-engineer-sre-software-architecture-brazil-at-ci-t-4462454245' +), + +( + 'Senior Software Engineer - Java & AWS', + 'Exadel', + 'https://www.google.com/s2/favicons?domain=exadel.com&sz=128', + 'São Paulo, SP', + 'REMOTE', + 'SENIOR', + 'Desenvolvimento de soluções backend de alta escala utilizando Java e serviços cloud, com foco em arquitetura, qualidade, performance e integração de sistemas.', + ARRAY[ + 'Experiência avançada em Java', + 'Experiência com AWS', + 'Conhecimento de arquitetura de software', + 'Experiência com APIs e microsserviços', + 'Capacidade de atuar tecnicamente com autonomia' + ], + ARRAY[ + 'Java', + 'AWS', + 'Spring', + 'Microservices', + 'REST', + 'Cloud', + 'CI/CD' + ], + 'https://br.linkedin.com/jobs/senior-software-engineer-vagas' +), + +-- ============================================================ +-- STAFF +-- ============================================================ + +( + 'Staff Software Engineer', + 'Unico Skill', + 'https://www.google.com/s2/favicons?domain=unico.io&sz=128', + 'Brasil', + 'REMOTE', + 'STAFF', + 'Referência técnica para evolução de sistemas e produtos, contribuindo para decisões de arquitetura, padrões de engenharia e desenvolvimento de soluções de alto impacto.', + ARRAY[ + 'Experiência avançada em engenharia de software', + 'Experiência com arquitetura de sistemas', + 'Capacidade de liderança técnica', + 'Experiência em sistemas distribuídos', + 'Capacidade de influenciar decisões técnicas e de produto' + ], + ARRAY[ + 'Software Architecture', + 'Distributed Systems', + 'Cloud', + 'Microservices', + 'APIs', + 'Engineering Leadership' + ], + 'https://br.linkedin.com/jobs/view/staff-software-engineer-at-unico-skill-4460753015' +), + +( + 'Staff Software Engineer', + 'Tako', + 'https://www.google.com/s2/favicons?domain=tako.com.br&sz=128', + 'São Paulo, SP', + 'HYBRID', + 'STAFF', + 'Atuação como referência técnica na construção e evolução de uma plataforma de operações de pessoas, participando de decisões arquiteturais e desenvolvimento de sistemas complexos.', + ARRAY[ + 'Experiência sólida em engenharia de software', + 'Experiência com arquitetura de sistemas', + 'Capacidade de liderar tecnicamente projetos', + 'Experiência com produtos SaaS', + 'Visão sistêmica e orientação a produto' + ], + ARRAY[ + 'Software Architecture', + 'SaaS', + 'Distributed Systems', + 'Cloud', + 'AI', + 'APIs', + 'Microservices' + ], + 'https://br.linkedin.com/jobs/view/staff-software-engineer-at-tako-4454655289' +), + +( + 'Staff Software Engineer', + 'Stix', + 'https://www.google.com/s2/favicons?domain=stix.com.br&sz=128', + 'Brasil', + 'HYBRID', + 'STAFF', + 'Referência técnica para evolução da plataforma de tecnologia, definindo padrões de desenvolvimento, influenciando decisões arquiteturais e contribuindo para a evolução dos sistemas da empresa.', + ARRAY[ + 'Experiência avançada em engenharia de software', + 'Experiência com arquitetura e sistemas escaláveis', + 'Capacidade de definir padrões técnicos', + 'Experiência em liderança técnica', + 'Boa comunicação com equipes técnicas e de negócio' + ], + ARRAY[ + 'Software Architecture', + 'Cloud', + 'Microservices', + 'Distributed Systems', + 'APIs', + 'Engineering Leadership', + 'Scalability' + ], + 'https://br.linkedin.com/jobs/view/staff-software-engineer-at-stix-4443773744' +); \ No newline at end of file