Somos um SaaS (Software as a service) para empresas que possuem prestadores de serviços externos.
Entregamos controle, organização e melhor relacionamento com o cliente para empresas de Climatização, Segurança eletrônica, Telecom, Provedores de internet, Montadoras de móveis, Empresas de limpeza, enfim, qualquer empresa que possui uma equipe de campo para realiza 10BC0 ção de serviços.
Nossa missão é melhorar a prestação de serviços no Brasil.
Te convido a conhecer um pouco mais da Field e da nossa cultura pelo nosso instagram: @FieldControl
Um ponto importante é que a Field foi fundada por desenvolvedores, só por esse motivo você pode TER CERTEZA que aqui as coisas são muito diferentes das empresas tradicionais.
Aqui utilizamos princípios ágeis DE VERDADE para criação de software. Veja bem, não estou falando de post its ou reuniões em pé.. E sim de: Pair programming, Continuous Integration, Continuous Deployment e claro, testes automatizados.
- Período: Integral
- Onde: Qualquer lugar :)
- Benefícios: Alimentação, Plano de saúde, Seguro de vida, Pluralsight, Alura, Amazon Books <3
🏡 Você pode ler sobre nossa cidade no G1, Infomoney ou aqui na Exame.
Trabalhamos com uma boa infraestrutura, nosso hardware é muito bom (você vai ter um notebook f#d@ com ssd e dois monitores 💻 💻) e possuímos um ambiente de trabalho agradável:
A empresa não possui hierarquias e você é convidado e desafiado a colaborar com todas as frentes de trabalho. Ou seja, aqui todas sugestões são bem vindas!
Ah, e quando a Field bate meta (quase sempre) o frigobar fica assim:
Queremos a cada dia mais flexibilidade e continuar animados a evoluir nossas aplicações.
Nosso trabalho é baseado em autogestão. Só existe uma regra de convivência: É proibido murmurar! Aqui as opiniões são discutidas, resolvidas e sempre chegamos a um consenso para melhorar a nossa convivência. Isso não foi descrito por um gerente de RH e sim por um desenvolvedor de software.
Estamos em busca de desenvolvedores Frontend FODAS e APAIXONADOS para fazer parte do nosso time de produto.
Na Field, o seu dia-a-dia será repleto de:
[
'GitHub & Git <3',
'Muito, muito e muito JavaScript',
'Object-oriented programming, SOLID Principles & Design Patterns',
'Práticas e princípios ágeis (Pair programming, Continuous Integration, Continuous Deployment)',
'Testes de software (unitários, integração, e2e..)',
'Desafios de escalabilidade',
'Desafios de alta disponibilidade',
'Micro services e aplicações distribuídas',
'Amazon Web Services',
'PAAS & Cloud Services',
'Serverless apps',
'AngularJS, Angular',
'REST APIs',
'GraphQL APIs',
'Material Design',
'Open source software'
]Nossa stack tecnológica é predominantemente JavaScript, abrangendo Node.js, Single Page Applications (SPA) e Hybrid Mobile Apps.
Acreditamos firmemente que excelentes desenvolvedores são capazes de selecionar a ferramenta mais adequada para cada desafio. Por essa razão, para resolver problemas específicos, recorremos às melhores alternativas disponíveis, o que nos leva a incluir uma pitada de C#, Java e PHP em nossas soluções.
Nossos servidores residem na AWS, onde utilizamos a nuvem como nossa plataforma principal. Temos aplicativos funcionando com Elastic BeanStalk, armazenamento em S3 e arquiteturas serverless com AWS Lambda.
Antes mesmo de avaliar o conhecimento técnico, valorizamos o perfil pessoal dos candidatos. Para nós, a determinação, o interesse e a curiosidade são qualidades essenciais. Se você é alguém proativo, interessado e que busca constantemente aprender, é isso que realmente importa para nós! 😊
🌟 Sem Ego: Acreditamos que ninguém é melhor que ninguém e que todos podem aprender uns com os outros. Promovemos um ambiente onde a humildade, o respeito e a abertura para aprender e ensinar são valorizados.
📈 Evolução Contínua: Encorajamos o crescimento pessoal e profissional de todos os membros da equipe. Estamos comprometidos em fornecer oportunidades de aprendizado e desenvolvimento, permitindo que cada indivíduo evolua constantemente em sua jornada.
🚀 Proatividade: Buscamos indivíduos proativos, capazes de antecipar problemas e buscar soluções de forma autônoma.
🔑 Sentimento de Dono: Valorizamos profissionais que assumem responsabilidade pelo seu trabalho e estão comprometidos com o sucesso do projeto como se fossem os donos.
🤝 Boa Comunicação e Trabalho em Equipe: Habilidades de comunicação eficaz e colaboração são essenciais para trabalhar de forma eficiente em equipe.
💻 Proficiência em JavaScript e TypeScript: Experiência sólida em JavaScript e TypeScript, demonstrando habilidade em desenvolver soluções robustas e escaláveis.
🎨 Experiência com CSS e HTML Semântico: Conhecimento prático em CSS e HTML Semântico para criar interfaces atraentes e acessíveis.
🔧 Experiência Sólida com Angular e Ionic: Capacidade comprovada no desenvolvimento com Angular e Ionic, demonstrando habilidade em construir aplicações web e mobile de alta qualidade.
🖌️ Familiaridade com Princípios de UX: Compreensão dos princípios de User Experience (UX) para criar interfaces intuitivas e amigáveis aos usuários.
🌐 Familiaridade com APIs REST, GraphQL e WebSockets: Conhecimento em APIs REST, GraphQL e WebSockets para comunicação eficiente entre cliente e servidor.
🧪 Prática em Testar Software: Experiência prática em testes de software, incluindo testes unitários, integrados e de aceitação, garantindo a qualidade e a confiabilidade do sistema.
Estes requisitos refletem nossa busca por profissionais qualificados e comprometidos, capazes de contribuir de forma significativa para o sucesso de nossos projetos.
Se você é apaixonado por desenvolvimento de software e busca desafios para impulsionar sua carreira, este teste é para você! Realize o desafio abaixo e faça um fork deste repositório para começar a codificar. Let the hacking begin! 🚀
A full-stack Kanban board application built with Angular (frontend), NestJS (backend), Supabase (database), and GraphQL for a modern, real-time collaborative experience.
- Frontend: Angular 17 with standalone components, Angular Material, and reactive signals
- Backend: NestJS with GraphQL API and WebSocket for real-time updates
- Database: Supabase with Row Level Security (RLS)
- Real-time: Socket.io for live collaboration
- Testing: Unit and integration tests for both frontend and backend
✅ Core Functionality
- Create, edit, and delete boards
- Create, edit, and delete columns within boards
- Create, edit, and delete cards within columns
- Drag & drop cards between columns
- Drag & drop to reorder columns
- Real-time collaborative editing
✅ Advanced Features
- GraphQL API with type-safe operations
- WebSocket connections for live updates
- Responsive Material Design UI
- Position management with automatic reordering
- Color-coded cards with due dates
- Comprehensive error handling
✅ Technical Excellence
- Clean architecture with SOLID principles
- Type safety throughout the stack
- Comprehensive test coverage
- Docker containerization ready
- Environment-based configuration
- Node.js 18+
- npm 9+
- Supabase account
git clone <repository-url>
cd valinor
npm run install:all- Create a new Supabase project at supabase.com
- Copy your project URL and keys
- Run the SQL schema in your Supabase SQL editor:
-- Execute the content from supabase-schema.sqlBackend Environment (packages/backend/.env):
SUPABASE_URL=your_supabase_project_url
SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key
PORT=3000
NODE_ENV=development
CORS_ORIGIN=http://localhost:4200Frontend Environment (packages/frontend/src/environments/environment.ts):
export const environment = {
production: false,
apiUrl: 'http://localhost:3000/graphql',
wsUrl: 'http://localhost:3000',
supabaseUrl: 'your_supabase_project_url',
supabaseAnonKey: 'your_supabase_anon_key'
};# Install dependencies
npm run install:all
# Start both backend and frontend
npm run dev
# Or run them separately
npm run dev:backend # http://localhost:3000
npm run dev:frontend # http://localhost:4200- Frontend: http://localhost:4200
- GraphQL Playground: http://localhost:3000/graphql
- Backend API: http://localhost:3000
valinor/
├── packages/
│ ├── backend/ # NestJS Backend
│ │ ├── src/
│ │ │ ├── kanban/ # Kanban domain module
│ │ │ │ ├── dto/ # GraphQL DTOs
│ │ │ │ ├── services/ # Business logic
│ │ │ │ ├── resolvers/ # GraphQL resolvers
│ │ │ │ └── types/ # TypeScript interfaces
│ │ │ ├── supabase/ # Database integration
│ │ │ ├── realtime/ # WebSocket gateway
│ │ │ └── main.ts # Application entry
│ │ └── package.json
│ └── frontend/ # Angular Frontend
│ ├── src/
│ │ ├── app/
│ │ │ ├── components/ # Angular components
│ │ │ ├── services/ # Angular services
│ │ │ └── models/ # TypeScript models
│ │ └── main.ts # Application entry
│ └── package.json
├── supabase-schema.sql # Database schema
└── package.json # Root package.json
The backend follows clean architecture principles:
- Services: Contain business logic and database operations
- Resolvers: Handle GraphQL queries and mutations
- DTOs: Define GraphQL schema and validation
- Types: TypeScript interfaces for type safety
The frontend uses modern Angular patterns:
- Standalone Components: No need for NgModules
- Reactive Signals: For state management
- Angular Material: For consistent UI components
- Apollo Client: For GraphQL operations
- TypeScript: Strict mode enabled
- ESLint: For code linting
- Prettier: For code formatting
- Jest: For unit testing
- Clean Code: Following SOLID principles
# Run all tests
npm run test
# Run backend tests
npm run test:backend
# Run frontend tests
npm run test:frontend
# Test coverage
npm run test:cov# Get all boards
query GetBoards {
boards {
id
title
description
columns {
id
title
position
cards {
id
title
description
position
color
}
}
}
}
# Get specific board
query GetBoard($id: ID!) {
board(id: $id) {
id
title
description
columns {
id
title
position
cards {
id
title
description
position
color
}
}
}
}# Create board
mutation CreateBoard($input: CreateBoardInputDto!) {
createBoard(input: $input) {
id
title
description
}
}
# Create column
mutation CreateColumn($input: CreateColumnInputDto!) {
createColumn(input: $input) {
id
title
position
}
}
# Create card
mutation CreateCard($input: CreateCardInputDto!) {
createCard(input: $input) {
id
title
description
position
color
}
}
# Move card
mutation MoveCard($input: MoveCardInputDto!) {
moveCard(input: $input) {
id
column_id
position
}
}The application uses WebSocket connections for real-time collaboration:
- Board Updates: Live updates when boards are modified
- Column Changes: Real-time column additions, updates, and movements
- Card Movements: Live drag-and-drop synchronization
- Multi-user Support: Multiple users can collaborate simultaneously
- boards: Board information
- columns: Columns within boards
- cards: Cards within columns
- UUID Primary Keys: For better performance and security
- Position Management: Automatic reordering of items
- Cascading Deletes: Clean up related data automatically
- RLS Policies: Row Level Security for access control
- Automatic Timestamps: Created and updated timestamps
- Row Level Security (RLS): Database-level access control
- Input Validation: Server-side validation with class-validator
- CORS Configuration: Secure cross-origin requests
- Environment Variables: Secure configuration management
npm run devnpm run build# Example Dockerfile structure would be here
# Optimized for production deployment- Fork the repository
- Create a feature branch
- Commit your changes
- Push to the branch
- Open a Pull Request
- Follow the established coding standards
- Write comprehensive tests
- Update documentation
- Ensure type safety
- Follow clean code principles
- Lazy Loading: Components and modules
- OnPush Change Detection: Optimized Angular change detection
- Database Indexing: Optimized database queries
- GraphQL Caching: Apollo Client caching
- Bundle Optimization: Webpack optimizations
- Angular 17: Modern web framework
- Angular Material: UI component library
- Apollo Client: GraphQL client
- Socket.io Client: Real-time communication
- RxJS: Reactive programming
- TypeScript: Type-safe JavaScript
- NestJS: Node.js framework
- GraphQL: API query language
- Apollo Server: GraphQL server
- Socket.io: WebSocket communication
- Supabase: Backend-as-a-service
- class-validator: Input validation
- ESLint: Code linting
- Prettier: Code formatting
- Jest: Testing framework
- Webpack: Module bundler
- Git: Version control
This project is licensed under the MIT License - see the LICENSE file for details.
For support, please open an issue in the GitHub repository or contact the development team.
Built with ❤️ for the Field Control team challenge
Abra um issue ou me mande um e-mail em luiz@fieldcontrol.com.br, fechou? :)
Gostariamos de entender como você pensa e as decisões que você tomou durante o desenvolvimento. Então, quando for enviar seu pull request, por favor responda:
- Qual ferramentas e bibliotecas (libraries, framework, tools etc) você usou
- Porque você optou pela tecnologia X e não a Y
- Quais princípios da engenharia de software que você usou?
- Desafios e problemas que você enfrentou e como você resolveu
- O que você entende que pode ser melhorado e como fazer isso
A modern, real-time Kanban board application built with Angular, NestJS, GraphQL, and Supabase.
- ✅ Drag & Drop: Intuitive drag-and-drop for cards and columns
- ✅ Real-time Updates: WebSocket support for collaborative editing
- ✅ CRUD Operations: Full create, read, update, delete for boards, columns, and cards
- ✅ GraphQL API: Type-safe API with GraphQL
- ✅ Modern UI: Material Design with smooth animations
- ✅ Responsive: Works on desktop and mobile devices
- ✅ Keyboard Shortcuts: Alt+B to navigate back to boards
- Frontend: Angular 17, Angular Material, Angular CDK
- Backend: NestJS, GraphQL, Socket.io
- Database: Supabase (PostgreSQL)
- Language: TypeScript
- Styling: SCSS, Material Design
- Node.js (v18 or higher)
- npm or yarn
- Supabase account (for database)
- Git
git clone https://github.com/yourusername/valinor.git
cd valinor# Install root dependencies
npm install
# Install frontend dependencies
cd packages/frontend
npm install
# Install backend dependencies
cd ../backend
npm installCreate a .env file in packages/backend/ with your Supabase credentials:
SUPABASE_URL=your_supabase_url
SUPABASE_ANON_KEY=your_supabase_anon_key
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_keyApply the database schema to your Supabase project:
-- Run the contents of supabase-schema.sql in your Supabase SQL editorIn separate terminals:
# Terminal 1 - Start backend (from packages/backend)
npm run start:dev
# Terminal 2 - Start frontend (from packages/frontend)
npm start- Frontend: http://localhost:4200
- Backend GraphQL Playground: http://localhost:3000/graphql
valinor/
├── packages/
│ ├── frontend/ # Angular application
│ │ ├── src/
│ │ │ ├── app/ # Application components and services
│ │ │ ├── assets/ # Static assets
│ │ │ └── environments/
│ │ └── angular.json # Angular configuration
│ │
│ └── backend/ # NestJS application
│ ├── src/
│ │ ├── kanban/ # Kanban module (boards, columns, cards)
│ │ ├── realtime/ # WebSocket gateway
│ │ └── supabase/ # Supabase service
│ └── nest-cli.json # NestJS configuration
│
├── supabase-schema.sql # Database schema
├── README.md # This file
├── SETUP.md # Detailed setup instructions
└── package.json # Root package.json for monorepo
Frontend (packages/frontend):
npm start- Start development servernpm run build- Build for productionnpm test- Run unit tests
Backend (packages/backend):
npm run start:dev- Start development server with watch modenpm run build- Build for productionnpm test- Run unit tests
- Implemented using Angular CDK Drag & Drop
- Supports both card and column reordering
- Visual feedback during drag operations
- WebSocket gateway using Socket.io
- Board-specific rooms for targeted updates
- Type-safe queries and mutations
- Auto-generated schema from TypeScript decorators
# Run frontend tests
cd packages/frontend
npm test
# Run backend tests
cd packages/backend
npm test# Build frontend
cd packages/frontend
npm run build
# Build backend
cd packages/backend
npm run buildThe built applications can be deployed to various platforms:
- Frontend: Vercel, Netlify, AWS S3 + CloudFront
- Backend: Heroku, AWS ECS, Google Cloud Run
- Database: Supabase (managed)
- Fork the repository
- Create your feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add some amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
This project is licensed under the MIT License.
- Field Control for the project requirements
- Angular and NestJS communities for excellent documentation
- Supabase for the fantastic BaaS platform
Made with ❤️ using Angular, NestJS, and Supabase