Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
171 changes: 122 additions & 49 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,73 +1,146 @@
# Tech-Assessment – Book Reviews Platform
# 📚 Livraria HubXP

**Goal**
Build a small “Book Reviews” platform (CRUD books + reviews, plus an endpoint that returns the top-rated books).
![Livraria HubXP](https://i.imgur.com/vTSqN7M.png)

| Stack (mandatory) | Why |
|-------------------|-----|
| NestJS + MongoDB | API, data layer & aggregation |
| Next.js (App Router) | UI & SSR |
| React Query | Data fetching / cache |
| Tailwind CSS | Styling |
Uma aplicação moderna de gerenciamento de livros construída com Next.js e NestJS.

> **Time-box:** aim for **4-8 h** of focused work.
> When time is up, push what you have — unfinished is OK, but document what’s missing.
## 🚀 Funcionalidades

---
- ✨ Interface moderna e responsiva
- 📝 CRUD completo de livros
- 🔍 Busca por nome e autor
- ⭐ Filtro de livros mais bem avaliados
- 📱 Design responsivo
- 📄 Paginação
- 🌙 Tema dark por padrão

## 1. What you must deliver
## 🛠️ Tecnologias Utilizadas

| Area | Minimum requirements |
|------|----------------------|
| **Backend** | *Connect to MongoDB* via env var<br>*Models*: `Book`, `Review` (rating 1-5)<br>*CRUD* endpoints for both entities (`/books`, `/books/:id/reviews`)<br>*Aggregation*: `GET /books/top?limit=10` returns avgRating + reviewCount, sorted desc<br>*Tests*: at least **one** e2e test hitting `/books/top` |
| **Frontend** | `/books` page listing the top books (uses React Query)<br>Book detail page showing reviews and a form to add a review (optimistic update welcome)<br>Responsive UI with Tailwind |
| **DX / Ops** | Clear local-dev instructions (README or Makefile)<br>`.env.example` with all needed vars<br>Lint + format commands<br>(Optional) Docker setup |
### Frontend
- Next.js 14
- TypeScript
- TailwindCSS
- Shadcn/ui
- React Query
- Axios
- React Hook Form
- Yup

---
### Backend
- NestJS
- MongoDB
- TypeScript
- Class Validator
- Class Transformer

## 2. Local setup expected by reviewers
## 📋 Pré-requisitos

- Node.js (versão 18 ou superior)
- MongoDB (versão 5 ou superior)
- Git

## 🔧 Instalação

### 1. Clone o repositório

```bash
git clone https://github.com/seu-usuario/hubxp.git
cd hubxp
```

### 2. Configurando o Backend

```bash
# Entre na pasta do backend
cd hub-xp.api

# Instale as dependências
npm install

# Crie o arquivo .env
cp .env.example .env

# Configure o usuário e senha do banco em migrate-mongo-config

# Conexão com o banco
npx migrate-mongo up

# Configure as variáveis de ambiente no arquivo .env
# Exemplo:
# MONGODB_URI=mongodb://localhost:27017/hubxp
# PORT=3333
```

### 3. Configurando o Frontend

```bash
pnpm install # monorepo or multiple projects — you choose
pnpm dev # should start both backend and frontend
# backend on :3001, frontend on :3000 is a common pattern
# Entre na pasta do frontend
cd ../hub-xp.web

# Instale as dependências
npm install

# Crie o arquivo .env.local
cp .env.example .env.local

# Configure as variáveis de ambiente no arquivo .env.local
# Exemplo:
# NEXT_PUBLIC_API_URL=http://localhost:3333
```

If you rely on Docker (e.g. docker compose up mongo), document it.
## 🚀 Executando o Projeto

### 1. Iniciando o Backend

## 3. Submission guidelines
1. Fork this repo, build on main.
2. Open a pull request to your own fork when finished. In the PR description include:
- (i) What is done / not done,
- (ii) How to run tests and
- (iii) Any trade-offs or shortcuts
3. Do not open a PR against the original repo.
```bash
# Na pasta hub-xp.api
npm run start:dev
```

O servidor estará rodando em `http://localhost:3333`

## 4. Evaluation rubric
### 2. Iniciando o Frontend

Criterion Weight
```bash
# Na pasta hub-xp.web
npm run dev
```

- Correctness & tests 30 %
- Code quality / structure 20 %
- Data modelling & validation 15 %
- Aggregation query efficiency 10 %
- Frontend UX & accessibility 15 %
- Documentation 10 %
A aplicação estará disponível em `http://localhost:3000`

## 📝 Estrutura do Projeto

### Frontend (hub-xp.web)
```
src/
├── app/ # Páginas e componentes específicos de rota
├── components/ # Componentes reutilizáveis
├── lib/ # Utilitários e configurações
├── network/ # Configuração de API e hooks
└── shared/ # Tipos e interfaces compartilhadas
```

### Backend (hub-xp.api)
```
src/
├── commons/ # Utilitários e configurações comuns
├── modules/ # Módulos da aplicação
│ └── books/ # Módulo de livros (controllers, services, etc)
└── main.ts # Arquivo principal da aplicação
```

## 🤝 Contribuindo

1. Faça um fork do projeto
2. Crie uma branch para sua feature (`git checkout -b feature/AmazingFeature`)
3. Faça commit das suas alterações (`git commit -m 'Add some AmazingFeature'`)
4. Faça push para a branch (`git push origin feature/AmazingFeature`)
5. Abra um Pull Request

## 5. Constraints & tips
## 📄 Licença

- TypeScript everywhere.
- Keep third-party libs minimal (testing & dev-tools are fine).
- Commit early & often — we read history.
- Feel free to use dev-containers / Codespaces; just explain how.
Este projeto está sob a licença MIT. Veja o arquivo [LICENSE](LICENSE) para mais detalhes.

## 📞 Suporte

Good luck 🚀
Se você tiver alguma dúvida ou encontrar algum problema, por favor abra uma [issue](https://github.com/seu-usuario/hubxp/issues).
2 changes: 2 additions & 0 deletions hub-xp.api/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
MONGO_URI="mongodb://user:password@localhost:27017/mydb"
JWT_SECRET="CHAVESECRETA"
56 changes: 56 additions & 0 deletions hub-xp.api/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# compiled output
/dist
/node_modules
/build

# Logs
logs
*.log
npm-debug.log*
pnpm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*

# OS
.DS_Store

# Tests
/coverage
/.nyc_output

# IDEs and editors
/.idea
.project
.classpath
.c9/
*.launch
.settings/
*.sublime-workspace

# IDE - VSCode
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json

# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local

# temp directory
.temp
.tmp

# Runtime data
pids
*.pid
*.seed
*.pid.lock

# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
4 changes: 4 additions & 0 deletions hub-xp.api/.prettierrc
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"singleQuote": true,
"trailingComma": "all"
}
98 changes: 98 additions & 0 deletions hub-xp.api/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
<p align="center">
<a href="http://nestjs.com/" target="blank"><img src="https://nestjs.com/img/logo-small.svg" width="120" alt="Nest Logo" /></a>
</p>

[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456
[circleci-url]: https://circleci.com/gh/nestjs/nest

<p align="center">A progressive <a href="http://nodejs.org" target="_blank">Node.js</a> framework for building efficient and scalable server-side applications.</p>
<p align="center">
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/v/@nestjs/core.svg" alt="NPM Version" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/l/@nestjs/core.svg" alt="Package License" /></a>
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/common.svg" alt="NPM Downloads" /></a>
<a href="https://circleci.com/gh/nestjs/nest" target="_blank"><img src="https://img.shields.io/circleci/build/github/nestjs/nest/master" alt="CircleCI" /></a>
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://opencollective.com/nest/sponsors/badge.svg" alt="Sponsors on Open Collective" /></a>
<a href="https://paypal.me/kamilmysliwiec" target="_blank"><img src="https://img.shields.io/badge/Donate-PayPal-ff3f59.svg" alt="Donate us"/></a>
<a href="https://opencollective.com/nest#sponsor" target="_blank"><img src="https://img.shields.io/badge/Support%20us-Open%20Collective-41B883.svg" alt="Support us"></a>
<a href="https://twitter.com/nestframework" target="_blank"><img src="https://img.shields.io/twitter/follow/nestframework.svg?style=social&label=Follow" alt="Follow us on Twitter"></a>
</p>
<!--[![Backers on Open Collective](https://opencollective.com/nest/backers/badge.svg)](https://opencollective.com/nest#backer)
[![Sponsors on Open Collective](https://opencollective.com/nest/sponsors/badge.svg)](https://opencollective.com/nest#sponsor)-->

## Description

[Nest](https://github.com/nestjs/nest) framework TypeScript starter repository.

## Project setup

```bash
$ yarn install
```

## Compile and run the project

```bash
# development
$ yarn run start

# watch mode
$ yarn run start:dev

# production mode
$ yarn run start:prod
```

## Run tests

```bash
# unit tests
$ yarn run test

# e2e tests
$ yarn run test:e2e

# test coverage
$ yarn run test:cov
```

## Deployment

When you're ready to deploy your NestJS application to production, there are some key steps you can take to ensure it runs as efficiently as possible. Check out the [deployment documentation](https://docs.nestjs.com/deployment) for more information.

If you are looking for a cloud-based platform to deploy your NestJS application, check out [Mau](https://mau.nestjs.com), our official platform for deploying NestJS applications on AWS. Mau makes deployment straightforward and fast, requiring just a few simple steps:

```bash
$ yarn install -g @nestjs/mau
$ mau deploy
```

With Mau, you can deploy your application in just a few clicks, allowing you to focus on building features rather than managing infrastructure.

## Resources

Check out a few resources that may come in handy when working with NestJS:

- Visit the [NestJS Documentation](https://docs.nestjs.com) to learn more about the framework.
- For questions and support, please visit our [Discord channel](https://discord.gg/G7Qnnhy).
- To dive deeper and get more hands-on experience, check out our official video [courses](https://courses.nestjs.com/).
- Deploy your application to AWS with the help of [NestJS Mau](https://mau.nestjs.com) in just a few clicks.
- Visualize your application graph and interact with the NestJS application in real-time using [NestJS Devtools](https://devtools.nestjs.com).
- Need help with your project (part-time to full-time)? Check out our official [enterprise support](https://enterprise.nestjs.com).
- To stay in the loop and get updates, follow us on [X](https://x.com/nestframework) and [LinkedIn](https://linkedin.com/company/nestjs).
- Looking for a job, or have a job to offer? Check out our official [Jobs board](https://jobs.nestjs.com).

## Support

Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please [read more here](https://docs.nestjs.com/support).

## Stay in touch

- Author - [Kamil Myśliwiec](https://twitter.com/kammysliwiec)
- Website - [https://nestjs.com](https://nestjs.com/)
- Twitter - [@nestframework](https://twitter.com/nestframework)

## License

Nest is [MIT licensed](https://github.com/nestjs/nest/blob/master/LICENSE).
34 changes: 34 additions & 0 deletions hub-xp.api/eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
// @ts-check
import eslint from '@eslint/js';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import globals from 'globals';
import tseslint from 'typescript-eslint';

export default tseslint.config(
{
ignores: ['eslint.config.mjs'],
},
eslint.configs.recommended,
...tseslint.configs.recommendedTypeChecked,
eslintPluginPrettierRecommended,
{
languageOptions: {
globals: {
...globals.node,
...globals.jest,
},
sourceType: 'commonjs',
parserOptions: {
projectService: true,
tsconfigRootDir: import.meta.dirname,
},
},
},
{
rules: {
'@typescript-eslint/no-explicit-any': 'off',
'@typescript-eslint/no-floating-promises': 'warn',
'@typescript-eslint/no-unsafe-argument': 'warn'
},
},
);
Loading