---
tags: Micro serviços
---
# Serviço de Imagens
## Quais tópicos são utilizados?
### dev.product.integration.importation.image
Tópico de entrada de dados para o processamento de imagens.
- Contrato:
```json
{
"imageIdentifier": "1081780_2_210251_20210511000000",
"productIdentifier": "1081780",
"imageUri": "https://cf-casadoproduto.multivarejogpa.com.br/product/simplus/7895000365548/20190430082336/7895000365548_1_1_1200_72_RGB.png",
"origin": "PRODUCT_HOUSE",
"data": {
"sku": "1081780"
},
"mainImage": true
}
```
- Especificações
|Campo|Campo obrigatório?|Descrição
|--|:-|--|
|imageIdentifier |Sim |Representa o identificador da imagem
|productIdentifier |Sim |Representa o identificador do produto
|imageUri |Sim |Representa o endereço da imagem que deve ser processada
| origin |Sim |Representa a origem que enviou a imagem para processamento, hoje existem duas: `MARKETPLACE` e `PRODUCT_HOUSE`
| mainImage |Não | Representa o identificador se é ou não a imagem principal do produto.
| data |Não | É um objeto que representa informações adicionais do produto e da imagem, esse campo não será salvo no mongo, apenas retornado após o processamento.
### dev.product.integration.importation.image.processed
Tópico que contém as informações das imagens após o processamento.
- Contrato:
```json
{
"localFilePath": "1/1138/",
"localFileName": "4a4aa02283773175b545d834271ff429c39f",
"imageIdentifier": "wp4676582",
"hash": "11384a4aa02283773175b545d834271ff429c39f",
"loaded": true,
"successfullyProcessed": true,
"status": {
"code": "PROCESSED",
"message": "Imagem processada com sucesso!"
},
"origin": "PRODUCT_HOUSE",
"mainImage": true,
"productId": "wp4676582",
"metaData": {
"width": 3840,
"height": 2160,
"length": 468085,
"extension": "jpg",
"internalUri": "https://wallpapercave.com/wp/wp4676582.jpg",
"originalFileName": "wp4676582.jpg"
},
"fullFilePath": "1/1138/4a4aa02283773175b545d834271ff429c39f.jpg",
"validProperties": true,
"valid": true
}
```
- Especificações
|Campo| Descrição|
|--|--|
| hash| Código gerado através dos bytes da imagem
|imageIdentifier| Identificador da imagem|
| productId| Identificador do produto
| localFilePath| Path da imagem salva no bucket
| localFileName| Nome da imagem salva no bucket
| fullFilePath | Endereço completo da imagem salva no bucket (localFilePath + localFileName + extension )
| loaded| Identificação se a imagem foi carregada com sucesso para o bucket
| successfullyProcessed| Identificação se a imagem foi carregada com sucesso para o bucket
|valid|Identificação se todas as validações de propriedades da imagem foram atendidas|
| status| Status do processamento
| origin| Nome da aplicação que solicitou o processamento da imagem
| mainImage| Identificação se é a imagem principal de um produto
| metaData| Objeto com informações da imagem
| metaData.width| Largura da imagem em px
| metaData.height| Altura da imagem em px
| metaData.length| Tamanho da imagem em bytes
| metaData.extension| Extensão da imagem
| metaData.internalUri| Endereço da imagem enviada para processamento
| metaData.originalFileName| Nome da imagem enviada
### dev.product.integration.importation.image-dlq
Tópico que contém as imagens que tiveram erro no processamento após 3 tentativas.
## O que o microserviço de imagens faz?
Consome imagens publicadas no tópico [dev.product.integration.importation.image](https://hackmd.io/tjRpCV-hR_yyG7dRK5juJQ?both#devproductintegrationimportationimage) e processa as imagens seguindo os passos abaixo.
### 1. Valida propriedades da imagem
|Propriedade|Valores aceitos|Status quando o valor não atender o esperado|
|--|--|--|
|Largura |De 600px até 1280px |INVALID_WIDTH
|Altura |De 600px até 1280px |INVALID_HEIGHT
|Tamanho |De 1000 bytes até 5MB |INVALID_SIZE
|Extensões |jpeg,jpg,jpe,png,webp |INVALID_EXTENSION
Caso as propriedades da imagem não estejam dentro dos valores aceitos listados acima, o processamento da imagem é encerrado, a imagem não será enviada para o bucket e nem salva no Mongo. A resposta do processamento da imagem com o status de erro será publicada no tópico [dev.product.integration.importation.image.processed](https://hackmd.io/tjRpCV-hR_yyG7dRK5juJQ?both#devproductintegrationimportationimageprocessed)
Para imagens com todas as propriedades dentro dos valores aceitos, o processamento segue para o passo abaixo.
### 2. Verifica se a imagem já foi processada
A partir da imagem, é gerado um código sha com base em todos os bytes da imagem.
É realizada uma consulta no Mongo, na collection Media, pelo código sha gerado.
Caso já exista um registro de imagem para este código, o processamento da imagem é encerrado e a imagem não é enviada para o bucket novamente. A imagem já processada é publicada no tópico [dev.product.integration.importation.image.processed](https://hackmd.io/tjRpCV-hR_yyG7dRK5juJQ?both#devproductintegrationimportationimageprocessed) com o status de processamento que está salvo no mongo.
Caso não tenha registro no mongo para o sha informado o processamento segue para o passo abaixo.
### 3. Envia imagem para o bucket
Nome do bucket: gpa-media-dev2
Atribuições de status após envio da imagem pro bucket:
- Quando envio realizado com **sucesso**:
- `loaded`: `true`
- `successfullyProcessed`: `true`
- `status`: `PROCESSED`
- `localFilePath`: Path da imagem no bucket
- `localFileName`: Nome da imagem no bucket
- Quando envio realizado com **erro**:
- `loaded`: `false`
- `successfullyProcessed`: `false`
- `status`: `ERROR_PROCESSING`
- `localFilePath`: `null`
- `localFileName`: `null`
### 4. Salva imagem no Mongo
- Database: imageWorker
- Collection: Media
- Estrutura da collection Media:
```json
{
"hash": "94c96ae10e8a20d98db1063ad55c14df4c855d88",
"productId": "1081780",
"localFilePath": "1/94c9/",
"localFileName": "6ae10e8a20d98db1063ad55c14df4c855d88",
"loaded": true,
"successfullyProcessed": true,
"status": {
"code": "PROCESSED",
"message": "Imagem processada com sucesso!"
},
"origin": "PRODUCT_HOUSE",
"mainImage": true,
"metaData": {
"width": 1200,
"height": 1200,
"length": 398873,
"extension": "png",
"internalUri": "https://cf-casadoproduto.multivarejogpa.com.br/product/simplus/7895000365548/20190430082336/7895000365548_1_1_1200_72_RGB.png",
"originalFileName": "7895000365548_1_1_1200_72_RGB.png"
}
}
```
As descrições dos campos da collection Media são as mesmas do contrato do tópico de imagens processadas.
### 5. Envia resposta do processamento para o tópico no kafka
A última etapa do processamento da imagem é o envio dos dados da imagem processada para o tópico [dev.product.integration.importation.image.processed](https://hackmd.io/tjRpCV-hR_yyG7dRK5juJQ?both#devproductintegrationimportationimageprocessed).
O envio acontece nos casos a seguir:
- Imagem possui todas as propriedades válidas e não foi processada ainda.
- Imagem possui todas as propriedades e já foi processada anteriormente.
- Imagem possui alguma propriedade inválida. (Neste caso, os campos localFilePath e localFileName serão nulos, por não ter seguido para a etapa de envio para o bucket).
Em casos de erros não tratados, a imagem passa por 3 tentativas, e se mesmo assim possuir algum erro, a imagem é publicada no tópico [dev.product.integration.importation.image-dlq](https://hackmd.io/tjRpCV-hR_yyG7dRK5juJQ?both#devproductintegrationimportationimage-dlq).
---
# Informações para testes
## Como enviar uma imagem para processamento?
As imagens serão enviadas para processamento através dos serviços do marketplace e da product-house, porém, para testes, é possível enviar uma imagem diretamente para o serviço de imagens das seguintes formas:
### 1. Chamando o endpoint do serviço de imagens
```json
curl -L -X POST 'localhost:8080/generate-image' \
-H 'Content-Type: application/json' \
--data-raw '{
"imageIdentifier": "1081780_2_210251_20210511000000",
"productIdentifier": "1081780",
"imageUri": "https://cf-casadoproduto.multivarejogpa.com.br/product/simplus/7895000365548/20190430082336/7895000365548_1_1_1200_72_RGB.png",
"origin": "PRODUCT_HOUSE",
"data": {
"sku": "1081780"
},
"mainImage": true
}'
```
__Observação__: Desta forma, é necessário fazer port-forward no serviço de imagens.
Exemplo: Executar o comando ```kubectl -n dev2 get pods``` e procurar pelo pod começando pelo nome de "gpa-product-image-worker". Encontrado o pod, executar o comando ```kubectl -n dev2 port-forward <NOME_DO_POD> 8080:8080```.
### 2. Publicando a imagem no tópico
1. Acessar https://akhq.hlg.fcd.gpa.digital/ui/kafka-fcd-dev2/topic/dev.product.integration.importation.image/data?sort=NEWEST&partition=All
2. Clicar em "Produce to topic".
3. Em Key, colocar o identificador da imagem.
4. Em Value, colocar o payload da imagem.
5. Clicar em Produce.
## Como verificar se a imagem enviada foi processada:
1. Consultando se ela consta no tópico [dev.product.integration.importation.image.processed](https://hackmd.io/tjRpCV-hR_yyG7dRK5juJQ?both#devproductintegrationimportationimageprocessed) e qual seu status.
2. Consultar na collection Media no Mongo (só vai ter registros se for uma imagem válida).
3. Consultando no bucket s3.
## Important!
Alguns links de imagens não são permitidas para baixar dentro do Cluster do Ecom, logo, deve-se considerar somente links de domnínios confiáveis e já homologados:
1. https://cf-casadoproduto.multivarejogpa.com.br
2. https://media-prod-use-1.mirakl.net
3. https://media-dev-eu-2.mirakl.net
## Use Case
1. https://cf-casadoproduto.multivarejogpa.com.br/product/carga-imagens/81139/20200922000000/248424.jpg
link válido, mas, imagem contém tamanho abaixo de 1KB (mínimo permitido pelo image worker);
2. https://upload.wikimedia.org/wikipedia/commons/e/e6/1kb.png
link válido com imagem de 1KB (mínimo permitido pelo image worker);
3. https://raw.githubusercontent.com/MicrosoftDocs/windows-itpro-docs/master/windows/deployment/images/UC_00_marketplace_search%20-%20Copy.PNG
link válido com imagem válida e extensão UPPERCASE, image worker não faz distinção por case sensitive e sim por conteúdo;
4. https://s2.glbimg.com/rKq2WZ6FCFPCXmugfhDiFGAHikU=/e.glbimg.com/og/ed/f/original/2021/11/30/giphy_6.gif
link de uma imagem com extensão ainda nao permitida;
5. https://www.silverdisc.co.uk/sites/default/files/sd_importer/lion_webp_10.webp
link de uma imagem com extensão .webp, permitida pelo image worker;
6. https://cf-casadoproduto.multivarejogpa.com.br/product/mk08/1197956/20190807000000/574524.jpg
link de uma imagem com extensão .jpg, permitida pelo image worker;
7. https://cf-casadoproduto.multivarejogpa.com.br/product/carga-imagens/2429564/20200922000000/609241.png
link de uma imagem com extensão .png, permitida pelo image worker;