Skip to content

Commit

Permalink
Add docs for image upload technical decisions
Browse files Browse the repository at this point in the history
  • Loading branch information
alessandrofeitoza committed Dec 11, 2024
1 parent f6c7722 commit 05ad0d6
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 28 deletions.
15 changes: 12 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,10 @@ up:
docker compose up -d

# Para os serviços Docker
stop:
docker compose stop

# Para e remove os serviços Docker
down:
docker compose down

Expand Down Expand Up @@ -48,7 +52,12 @@ reset:

# Limpa a cache e o banco
reset-deep:
rm -rf var/
rm -rf var/cache
rm -rf var/log
rm -rf var/storage/agents
rm -rf var/storage/initiatives
rm -rf var/storage/spaces
rm -rf var/storage/users
docker compose exec -T php bash -c "php bin/console cache:clear"
docker compose exec -T php bash -c "php bin/console d:d:d -f"
docker compose exec -T php bash -c "php bin/console d:d:c"
Expand All @@ -60,7 +69,7 @@ style:

# Gera as chaves de autenticação JWT
generate_keys:
docker compose exec -T php bash -c "php bin/console lexik:jwt:generate-keypair --overwrite"
docker compose exec -T php bash -c "php bin/console lexik:jwt:generate-keypair --overwrite -n"

# Comando para rodar todos os passos juntos
setup: up install_dependencies generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys
setup: up install_dependencies reset-deep generate_proxies migrate_database load_fixtures install_frontend compile_frontend generate_keys
26 changes: 20 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,9 +12,16 @@ A configuração já está dockerizada, então você só precisa ter o Docker Co
- **Symfony** 7
- **Aurora User Interface** 5.3

[Acesse aqui para entender as decisões](./help/STACK.md)

[Acesse aqui os diagramas](./help/DIAGRAM.md)
## Links Rápidos
- [Acesse aqui para entender melhor nossa Stack](./help/STACK.md)
- [Acesse aqui para entender nossas decisões de backend](./help/TECHNICAL-DECISIONS.md)
- [Esquema do Banco de Dados](./help/DIAGRAM.md)
- [Como criar issues](./help/CREATE-ISSUES.md)
- [Como abrir Pull Requests](./help/CREATE-PULL-REQUESTS.md)
- [Nosso Fluxo de Desenvolvimento](./help/DEV-FLOW.md)
- [Enums](./help/ENUM.md)
- [Arquitetura da Aplicação](./help/README.md)
- [Comandos do terminal](./help/COMMANDS.md)

## Instalação
<details>
Expand Down Expand Up @@ -43,6 +50,9 @@ cd aurora
>
> O jeito mais fácil é rodar o comando `make setup`, isso já vai executar todos os passos necessários e deixar a aplicação rodando em <http://localhost:8080>
>
```bash
make setup
```
Mas se preferir, pode fazer o passo a passo abaixo

---
Expand Down Expand Up @@ -134,20 +144,24 @@ Estamos utilizando o Symfony e o seu ecossistma de bibliotecas, porém a arquite

```mermaid
flowchart TD
style E fill:#e06666, color:white
style S fill:#3d85c6, color:white
HC((HttpClient)) --JsonRequest<--> R[Routes]
B((Browser)) --GET/POST--> Routes
R --> CA[[ControllerApi]]
Routes --> CW[[ControllerWeb]]
CA <--> S[Service]
CA <--> S([Service])
CW <--> S
S <--> V{Validator}
V <--> RP[Repository]
V <--is invalid--> E{{Exceptions/Violations}}
V <--is valid--> RP[Repository]
RP <==ORM/Doctrine==> D[(Database)]
CA --JsonResponse--> HC
CW --HTML/CSS/JS--> B
```

- Para saber mais sobre nossas decisões técnicas [acesse aqui](./help/README.md)
- Para saber mais sobre nossas decisões técnicas [acesse aqui](./help/TECHNICAL-DECISIONS.md)
- Para entender nosso fluxo de desenvolvimento decisões técnicas [clique aqui](./help/DEV-FLOW.md)
</details>

Expand Down
17 changes: 13 additions & 4 deletions help/COMMANDS.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,12 +13,12 @@ Inicia os serviços Docker em modo *detached* (em segundo plano).
</details>

<details>
<summary>DOWN</summary>
<summary>STOP</summary>

### `down`
### `stop`
Para os serviços Docker.
- **Uso:** `make down`
- **Descrição:** Executa `docker compose down`, encerrando todos os contêineres e redes iniciados pelo comando `up`.
- **Uso:** `make stop`
- **Descrição:** Executa `docker compose stop`, encerrando todos os contêineres e redes iniciados pelo comando `up`.
</details>

<details>
Expand Down Expand Up @@ -103,6 +103,15 @@ Limpa o cache do Aurora.
- **Descrição:** Executa `php bin/console cache:clear` para limpar o cache gerado pela aplicação.
</details>

<details>
<summary>RESET DEEP</summary>

### `reset`
Faz um reset de tudo do diretório storage.
- **Uso:** `make reset-deep`
- **Descrição:** Executa `php bin/console cache:clear` para limpar o cache gerado pela aplicação, e outros comandos para excluir o conteudo do diretório `/var`
</details>

<details>
<summary>STYLE</summary>

Expand Down
42 changes: 28 additions & 14 deletions help/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ Essa é a documentação das decisões técnicas, voltada para desenvolvedores e

### Instalação dos pacotes

Para instalar as dependências e atualizar o autoload, entre no container da aplicação e execute:
Para instalar as dependências e atualizar o autoload:
```shell
composer install
make install_dependencies
```

---
Expand All @@ -34,7 +34,7 @@ Os `Controllers` em conjunto com as `Routes` permitem criar endpoints para diver
<summary>Como criar um novo controller</summary>

#### 1 - Controller
Crie uma nova classe em `/app/Controller/Api/`, por exemplo, `EventApiController.php`:
Crie uma nova classe em `/src/Controller/Api/`, por exemplo, `EventApiController.php`:

```php
<?php
Expand All @@ -43,7 +43,7 @@ declare(strict_types=1);

namespace App\Controller\Api;

class EventApiController
class EventApiController extends AbstractApiController
{

}
Expand All @@ -63,9 +63,8 @@ declare(strict_types=1);
namespace App\Controller\Api;

use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;

class EventApiController
class EventApiController extends AbstractApiController
{
public function getList(): JsonResponse
{
Expand All @@ -76,7 +75,22 @@ class EventApiController

return new JsonResponse($events);
}

}
```

ou

```php
<?php

declare(strict_types=1);

namespace App\Controller\Web;

use Symfony\Component\HttpFoundation\Response;

class EventWebController extends AbstractWebController
{
public function getList(): Response
{
$events = [
Expand All @@ -96,7 +110,7 @@ Acesse os arquivos das rotas em `/config/routes` lá nós estamos separando as r
```yaml
get:
path: /example
controller: App\Controller\Admin\ExampleAdminController::action
controller: App\Controller\Web\Admin\ExampleAdminController::action
methods: ['GET']
```
Expand All @@ -122,7 +136,7 @@ A camada responsável pela comunicação entre nosso código e o banco de dados.

Siga o passo a passo a seguir:

#### Passo 1 - Crie sua classe no `/app/src/Repository` e extenda a classe abstrata `AbstractRepository`
#### Passo 1 - Crie sua classe no `/src/Repository` e extenda a classe abstrata `AbstractRepository`

```php
<?php
Expand Down Expand Up @@ -163,7 +177,7 @@ Migrations são a forma (correta) de fazer um versionamento do banco de dados, n
<details>
<summary>Como criar uma nova migration</summary>

#### Passo 1 - Criar uma nova classe no diretório `/app/migrations`
#### Passo 1 - Criar uma nova classe no diretório `/migrations`

```php
<?php
Expand Down Expand Up @@ -200,7 +214,7 @@ Atualmente o Doctrine não fornece suporte para migrations em bancos de dados n
<details>
<summary>Como criar uma nova migration</summary>

#### Passo 1 - Criar uma nova classe no diretório `/app/migrations-odm`
#### Passo 1 - Criar uma nova classe no diretório `/migrations-odm`

```php
<?php
Expand Down Expand Up @@ -249,7 +263,7 @@ Comandos são entradas via CLI (linha de comando) que permitem automatizar algun
<details>
<summary>Como criar um novo console command</summary>

#### Passo 1 - Criar uma nova classe em `app/src/Command/`:
#### Passo 1 - Criar uma nova classe em `/src/Command/`:

```php
<?php
Expand Down Expand Up @@ -300,7 +314,7 @@ Data Fixtures são dados falsos, normalmente criados para testar a aplicação,
<details>
<summary>Como criar uma DataFixture para uma Entidade</summary>

#### Passo 1 - Criar uma nova classe em `app/src/DataFixtures/`:
#### Passo 1 - Criar uma nova classe em `/src/DataFixtures/`:

```php
<?php
Expand Down Expand Up @@ -348,7 +362,7 @@ Documentação do PHPUnit: <https://phpunit.de/index.html>
<summary>Como criar um novo teste</summary>

### Criar um novo teste
Para criar um novo cenário de teste funcional, basta adicionar sua nova classe no diretório `/app/tests/functional/`, com o seguinte código:
Para criar um novo cenário de teste funcional, basta adicionar sua nova classe no diretório `/tests/Functional/`, com o seguinte código:

```php
<?php
Expand Down
2 changes: 1 addition & 1 deletion help/STACK.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Aqui você encontra detalhadamente as motivações que nos levaram a escolher ta
> As decisões foram todas tomadas de acordo com a interpretação do time que desempenha o papel de principal braço de desenvolvimento, e todas as decisões foram assinadas pelo até então techlead do projeto [Alessandro Feitoza](https://github.com/alessandrofeitoza)
## PHP
Atualmente na versão 8.3, veja abaixo detalhe sobre o seu uso
Atualmente na versão 8.4, veja abaixo detalhe sobre o seu uso
<details>
<summary>Porque PHP?</summary>

Expand Down
31 changes: 31 additions & 0 deletions help/TECHNICAL-DECISIONS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Decisões Técnicas - Backend

Em alguns momentos durante o desenvolvimento precisamos
## Upload de Arquivos

Para upload de arquivos estamos usando endpoints especificos, seguindo o padrão abaixo

```
POST /spaces/{id}/images
Content-Type: multipart/form-data
```

(até a tomada dessa decisão) O suporte da PHP para aceitar `multipart/form-data` só é possível via requisições do tipo `POST`.

O fluxo de envio da imagem passa por um único `Service`

```mermaid
flowchart TD
R((Request)) --POST multipart/form-data--> C[[AgentController]]
C --UploadedFile--> S([AgentService])
S --ParameterBag/UploadedFile--> S2([FileService])
S2 --contents--> ST{{Storage}}
```

## Enums apenas do lado do código
A motivação para não usar o tipo ENUM do proprio banco de dados se deu pois encontramos dificuldades com as migrations, mas, o mais importante:

**Preferimos manter as regras de negócio na camada da aplicação** ao invés de alocar isso no banco de dados.

A documentação dos Enums se encontra [aqui](./ENUM.md)

0 comments on commit 05ad0d6

Please sign in to comment.