{"id":46296466,"url":"https://github.com/juntossomosmais/backend-challenge","last_synced_at":"2026-04-03T17:51:03.694Z","repository":{"id":46192830,"uuid":"164712604","full_name":"juntossomosmais/backend-challenge","owner":"juntossomosmais","description":"🚀 Our hiring challenge to Back-end Developers","archived":false,"fork":false,"pushed_at":"2026-02-25T12:18:53.000Z","size":178,"stargazers_count":62,"open_issues_count":1,"forks_count":18,"subscribers_count":5,"default_branch":"master","last_synced_at":"2026-02-25T15:46:54.534Z","etag":null,"topics":["apps","back-end","code-challenge","csharp","full-stack","java","javascript","kotlin","nodejs","python"],"latest_commit_sha":null,"homepage":"","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/juntossomosmais.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2019-01-08T18:50:57.000Z","updated_at":"2026-02-25T12:48:12.000Z","dependencies_parsed_at":"2024-11-27T18:22:26.454Z","dependency_job_id":"b4f85498-eedc-47a3-a84f-31fb1dd760e5","html_url":"https://github.com/juntossomosmais/backend-challenge","commit_stats":null,"previous_names":["juntossomosmais/backend-challenge"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/juntossomosmais/backend-challenge","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juntossomosmais%2Fbackend-challenge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juntossomosmais%2Fbackend-challenge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juntossomosmais%2Fbackend-challenge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juntossomosmais%2Fbackend-challenge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/juntossomosmais","download_url":"https://codeload.github.com/juntossomosmais/backend-challenge/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/juntossomosmais%2Fbackend-challenge/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30648500,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-18T02:48:56.676Z","status":"ssl_error","status_checked_at":"2026-03-18T02:48:55.747Z","response_time":104,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apps","back-end","code-challenge","csharp","full-stack","java","javascript","kotlin","nodejs","python"],"created_at":"2026-03-04T10:00:26.222Z","updated_at":"2026-03-18T05:00:34.735Z","avatar_url":"https://github.com/juntossomosmais.png","language":"Shell","funding_links":[],"categories":["Shell"],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/user-attachments/assets/c16e9208-a4ce-459c-97e9-6a9f95b2f159\" width=\"200\" alt=\"Juntos Somos Mais\"\u003e\n\u003c/p\u003e\n\n# \u0026lt;backend-challenge /\u0026gt;\n\n*[Leia em Português](./README.pt-BR.md)*\n\nThe main objective of this challenge is to assess your approach to **problem-solving, code quality, and how you leverage modern tools** — including AI.\n\nWe evaluate:\n\n- Your coding style and organization\n- Decision-making and trade-offs\n- Testing strategies\n- Documentation quality\n- How you use AI as a development tool\n\n\u003e 🤖 **AI is welcome here.** We don't want to know *if* you used AI. We want to know *how* you used it.\n\n---\n\n## Table of Contents\n\n- [The Challenge](#the-challenge)\n- [Business Rules](#business-rules)\n- [API Requirements](#api-requirements)\n- [Evaluation Criteria](#evaluation-criteria)\n- [AI Journey (Required)](#ai-journey-required)\n- [Submission](#submission)\n- [FAQ](#faq)\n\n---\n\n## The Challenge\n\nWe receive customer data from partner companies in both **CSV** and **JSON** formats. Your task is to:\n\n1. **Load** data from external URLs at application startup\n2. **Transform** the data applying our business rules\n3. **Expose** a REST API to query the processed data\n\n### Input Data\n\n| Format | URL | Records |\n|--------|-----|---------|\n| CSV | [input-backend.csv](https://storage.googleapis.com/juntossomosmais-code-challenge/input-backend.csv) | ~1000 |\n| JSON | [input-backend.json](https://storage.googleapis.com/juntossomosmais-code-challenge/input-backend.json) | ~1000 |\n\n\u003e ⚠️ Data must be loaded via HTTP request **at startup** and kept **in memory**. No database required.\n\n---\n\n## Business Rules\n\n### 1. Customer Classification by Location\n\nBased on coordinates, classify each customer:\n\n| Type | Bounding Box |\n|------|--------------|\n| **SPECIAL** | minlon: -2.196998, minlat: -46.361899, maxlon: -15.411580, maxlat: -34.276938 |\n| **SPECIAL** | minlon: -19.766959, minlat: -52.997614, maxlon: -23.966413, maxlat: -44.428305 |\n| **NORMAL** | minlon: -26.155681, minlat: -54.777426, maxlon: -34.016466, maxlat: -46.603598 |\n| **LABORIOUS** | Anyone not matching the above |\n\n### 2. Data Transformations\n\n| Field | Transformation |\n|-------|----------------|\n| `phone`, `cell` | Convert to [E.164](https://en.wikipedia.org/wiki/E.164) format. Example: `(86) 8370-9831` → `+558683709831` |\n| `gender` | `male` → `M`, `female` → `F` |\n| `dob.age`, `registered.age` | Remove these fields |\n| `nationality` | Add field with value `BR` |\n| `region` | Add based on state (Norte, Nordeste, Centro-Oeste, Sudeste, Sul) |\n\n### 3. Output Contract\n\n```json\n{\n  \"type\": \"laborious\",\n  \"gender\": \"M\",\n  \"name\": {\n    \"title\": \"mr\",\n    \"first\": \"quirilo\",\n    \"last\": \"nascimento\"\n  },\n  \"location\": {\n    \"region\": \"sul\",\n    \"street\": \"680 rua treze\",\n    \"city\": \"varginha\",\n    \"state\": \"paraná\",\n    \"postcode\": 37260,\n    \"coordinates\": {\n      \"latitude\": \"-46.9519\",\n      \"longitude\": \"-57.4496\"\n    },\n    \"timezone\": {\n      \"offset\": \"+8:00\",\n      \"description\": \"Beijing, Perth, Singapore, Hong Kong\"\n    }\n  },\n  \"email\": \"quirilo.nascimento@example.com\",\n  \"birthday\": \"1979-01-22T03:35:31Z\",\n  \"registered\": \"2005-07-01T13:52:48Z\",\n  \"telephoneNumbers\": [\"+556629637520\"],\n  \"mobileNumbers\": [\"+553270684089\"],\n  \"picture\": {\n    \"large\": \"https://randomuser.me/api/portraits/men/83.jpg\",\n    \"medium\": \"https://randomuser.me/api/portraits/med/men/83.jpg\",\n    \"thumbnail\": \"https://randomuser.me/api/portraits/thumb/men/83.jpg\"\n  },\n  \"nationality\": \"BR\"\n}\n```\n\n---\n\n## API Requirements\n\n### Endpoint\n\n```\nGET /users\n```\n\n### Query Parameters\n\n| Parameter | Type | Description |\n|-----------|------|-------------|\n| `region` | string | Filter by region (norte, nordeste, centro-oeste, sudeste, sul) |\n| `type` | string | Filter by classification (special, normal, laborious) |\n| `pageNumber` | int | Page number (1-indexed) |\n| `pageSize` | int | Items per page |\n\n### Response\n\n```json\n{\n  \"pageNumber\": 1,\n  \"pageSize\": 10,\n  \"totalCount\": 2000,\n  \"users\": [...]\n}\n```\n\n### Validation\n\nYour API must pass our validation script:\n\n```bash\n./validate.sh\n```\n\nThis checks:\n- Endpoint responding at `localhost:8080`\n- Pagination fields present\n- Total count of 2000 records\n\n---\n\n## Evaluation Criteria\n\nWe assess your submission across **7 competencies**. There are no \"levels\" to choose — just deliver your best work, and we'll evaluate where you stand.\n\n### 1. 🎯 Problem Solving\n\n| What we look for |\n|------------------|\n| Correct implementation of all business rules |\n| Edge cases handling (invalid data, missing fields, malformed input) |\n| Logical and efficient approach to data transformation |\n\n### 2. 🏗️ Code Architecture\n\n| What we look for |\n|------------------|\n| Clear separation of concerns |\n| Consistent project structure |\n| Appropriate use of design patterns (when they add value, not for show) |\n| Code that's easy to navigate and understand |\n\n### 3. ✨ Code Quality\n\n| What we look for |\n|------------------|\n| Readability over cleverness |\n| Meaningful naming conventions |\n| Consistent style throughout |\n| No unnecessary complexity |\n| Proper error handling |\n\n### 4. 🧪 Testing\n\n| What we look for |\n|------------------|\n| Tests that document behavior |\n| Coverage of critical paths |\n| Tests that would catch real bugs |\n| Balance between unit and integration tests |\n\n### 5. 📚 Documentation\n\n| What we look for |\n|------------------|\n| Clear README with setup instructions |\n| API documentation (any format) |\n| Comments where code isn't self-explanatory |\n| Architecture decisions explained (when relevant) |\n\n### 6. 🚀 Production Readiness\n\n| What we look for |\n|------------------|\n| Containerization (Docker) |\n| Environment configuration |\n| Health checks |\n| Logging strategy |\n| CI/CD awareness |\n\n### 7. 🤖 AI Collaboration\n\n| What we look for |\n|------------------|\n| Transparency in AI usage |\n| Critical thinking about AI-generated code |\n| Iteration and refinement over copy-paste |\n| Understanding of what the AI produced |\n\n---\n\n## AI Journey (Required)\n\nCreate an `/ai-journey` folder in your repository documenting how you used AI tools.\n\n### Required Files\n\n```\n📁 ai-journey/\n├── README.md          # Summary of your AI usage\n├── prompts.md         # Key prompts you used\n└── learnings.md       # What you learned in the process\n```\n\n### What to Document\n\n**prompts.md** — Don't document everything, just the interesting parts:\n\n```markdown\n## Prompt: Phone number regex\n**Tool:** ChatGPT-4\n\n**What I asked:**\n\"Create a regex to convert Brazilian phone numbers to E.164 format\"\n\n**What happened:**\nInitial regex didn't handle 9-digit mobile numbers. I had to...\n\n**Final solution:**\n[your code]\n```\n\n**learnings.md** — Reflect on the experience:\n\n```markdown\n## What worked well\n- AI was great for boilerplate code\n- Helped me explore libraries I wasn't familiar with\n\n## What didn't work\n- Initial architecture suggestion was over-engineered\n- Had to simplify after understanding the actual requirements\n\n## What I'd do differently\n- Start with clearer requirements in prompts\n- Ask for simpler solutions first\n```\n\n---\n\n## Submission\n\n### Languages\n\n**Python** or **C#** — choose the one you're most comfortable with.\n\n### Repository Structure\n\n```\n📁 your-repo/\n├── src/                  # Source code\n├── tests/                # Tests\n├── ai-journey/           # AI documentation (required)\n├── docker-compose.yml    # If applicable\n└── README.md             # Setup instructions\n```\n\n### How to Submit\n\n1. Create a **public** GitHub repository\n2. Open an **Issue** in this repository with:\n   - Title: `[Backend] Your Name`\n   - Link to your repository\n   - Brief description of your approach\n   - Anything you'd like us to know\n\n### Timeline\n\n- **Recommended:** 7 days\n- **Need more time?** Just let us know in the issue\n\n---\n\n## FAQ\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhat languages can I use?\u003c/b\u003e\u003c/summary\u003e\n\nPython or C#. Choose the one you're most comfortable with.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eAre there open positions?\u003c/b\u003e\u003c/summary\u003e\n\nNot always, but we maintain a talent pool. Great submissions stay on our radar for future opportunities.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eWhat if I can only complete part of the challenge?\u003c/b\u003e\u003c/summary\u003e\n\nSubmit what you have! Partial submissions with quality code tell us more than complete submissions with poor code. Just document what's missing and why.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eShould I include extra features?\u003c/b\u003e\u003c/summary\u003e\n\nOnly if they add clear value and don't compromise the core requirements. We prefer well-executed basics over half-finished extras.\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003e\u003cb\u003eHow will I know my seniority level?\u003c/b\u003e\u003c/summary\u003e\n\nWe don't ask you to self-declare a level. We evaluate your submission across all criteria and determine fit based on our internal standards.\n\u003c/details\u003e\n\n---\n\n## Other Challenges\n\nIf you're applying for a front-end position, check out our [frontend-challenge](https://github.com/juntossomosmais/frontend-challenge).\n\n---\n\n## Questions?\n\nOpen an [issue](../../issues) or reach out to **vagas-dev@juntossomosmais.com.br**.\n\nBefore asking, please check if your question was already answered in [previous issues](../../issues?q=is%3Aissue).\n\n---\n\n\u003cp align=\"center\"\u003e\n  \u003csub\u003eMade with 💛 by the Engineering Team at \u003ca href=\"https://juntossomosmais.com.br\"\u003eJuntos Somos Mais\u003c/a\u003e\u003c/sub\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuntossomosmais%2Fbackend-challenge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjuntossomosmais%2Fbackend-challenge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjuntossomosmais%2Fbackend-challenge/lists"}