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