---
# System prepended metadata

title: Serviço de Imagens
tags: [Micro serviços]

---

---
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;