O que é um Interceptor?
Um interceptor é uma classe anotada com o decorator @Injectable() (uma das features do Nest), e devem conter um implement da interface Nest Interceptor.
Os Interceptors tem um conjunto de capacidades inspiradas na técnica de AspectOriented Programming (AOP), em português: Programação orientada a aspecto. Isso torna possível:
- Vincular lógica de programação extra antes/ depois da execução do método
- Transformar o resultado retornado de uma função
- Transformar o erro de exception retornado de uma função
- Estender o comportamento básico de uma função
- Substituir completamente uma função dependendo de condições específicas (por exemplo, para fins de armazenamento em cache)
Se você vem do mundo do Express, já deve estar familiarizado com a ideia de um middleware. Um middleware é basicamente uma função que recebe um request e retorna uma response baseada no request.
No entanto,o problema do middleware é que ele é chamado apenas antes de o manipulador de rota ser chamado. Você tem acesso ao objeto de resposta, mas não tem o resultado do manipulador de rota.
Não há uma maneira simples de ter uma função que pode configurar alguns dados antes que a solicitação seja tratada, ao mesmo tempo que também pode executar alguma lógica após a solicitação.
Um Interceptor, no entanto, consegue fazer isso. Ao usar RxJs Observables,os Interceptors permitem que você programe a lógica em qualquer ponto do ciclo de vida da solicitação.
O primeiro use-caseque vamos observar utiliza um interceptor para registrar a interação do usuário(por exemplo, armazenar chamadas do usuário, despachar eventos de forma assíncrona ou calcular um carimbo de data / hora). Observe no “Interceptor.ts”abaixo:
Interceptors,assim como controllers, providers, guards, e assim por diante, podeminjetar dependências por meio de seu construtor.
Fazendo isso, toda vez que alguém acessar um endpoint de sua aplicação, ele registrará o tempo que levou para fazer a solicitação. Isso também pode escalar para contextos maiores e mais complexos.
Interceptor Global
Você pode configurar o interceptor para ser executado em um controller ou em uma parte específica de sua API, ou pode apenas configurá-lo globalmente e ele funcionará em toda a sua API.
Os Global Interceptors são usados em toda a aplicação, para cada controller e cada manipulador de rota. Em termos de injeção de dependência, interceptores globais registrados de fora de qualquer módulo não podem injetar dependências, pois isso é feito fora do contexto de qualquer módulo. Para resolver esse problema,você pode configurar um interceptor diretamente de qualquer módulo usando a seguinte construção:
Ao usar essa abordagem para realizar injeção de dependência para o interceptor, observe que,independentemente do módulo onde esta construção é empregada, o interceptor é,de fato, global.
Também podemos separar o tipo de ação que o Interceptor realizará com base no tipo de solicitação, se é uma solicitação HTTP ou mesmo uma solicitação GraphQL. Dê uma olhada nos exemplos abaixo:
Olhando para o ExecutionContext, podemos descobrir se é uma solicitação HTTP ou GraphQL e tratá-la de forma diferente. Nesse caso, queremos informações diferentes dependendo do tipo de solicitação. Quando se trata de uma solicitação Http, queremos retornar um objeto “http Info” com um timestamp de quando esse usuário acessou o endpoint, seu nome de usuário, o caminho desse endpoint e o método de solicitação (GET, POST, PATCH…). Mas quando a requisição é do tipo GraphQL, ela muda um pouco e traz um novo campo, os params daquela requisição, retornando em um objeto chamado “graphqlInfo”.
Outros decorators
Vamos dar uma olhada em outro uso comum para o interceptor. Imagine que você gostaria de lidar com os timeouts em solicitações de rota. Quando seu endpoint não retorna nada após um período de tempo, você deseja encerrar com uma resposta de erro.
Após 5 segundos,o processamento da solicitação será cancelado. Você também pode adicionar lógica personalizada antes de lançar o RequestTimeoutException.
Conclusão
Pudemos observar as diferentes aplicações do Interceptor, e agora é com você DEV! Não esqueça de checar a documentação se surgir interesse nesta ferramenta tão completa que é o Nest.
Gostou do artigo? Agora aprenda com nosso artigo de introdução ao Interceptors NestJS!
Por fim a execução da tarefa, com o comando :
bash_command = ‘bq extract–destination_format CSV –field_delimiter “;” –print_header=TRUEvtex.tbl_cie_food.
Extraio o conteúdo da tabela vtex.tbl_cie_food para um arquivo no format CSV , com header e delimitador ; (ponto e virgula).
Após a extração o arquivo é enviado para o bucket do projeto:
gs://cie_vtex/FOOD/QUARTA/CIE_FOOD_$(date +”%Y%m%d” ).csv’
Onde $( date +”%Y%m%d” ).csv criará arquivos com Ano/Mes/Dia a cada nova execução da DAG.
Salve este arquivo como <<file_name>> .py e coloque-o na pasta DAGs (esta pasta pode ser aberta clicando na opção DAGs na GUI e arrastando o arquivo para dentro da pasta.
Em seguida, abra o ambiente do Airflow clicando na opção Airflow
Nome: É o nome do seu projeto no qual o ambiente do Composer foi criado, este será anexado ao seu projeto. Se você deseja criar uma programação entre projetos, é necessário estabelecer uma conexão de projeto https://cloud.google.com/composer/docs/how-to/managing/connections
Airflow: Isso abrirá a interface de programação , onde você pode ver o fluxo de trabalho, acionar um fluxo de trabalho (DAG), verificar os registros etc.
DAGs: Directed Acyclic Graph é uma coleção de todas as tarefas que você deseja executar, organizadas de uma forma que reflita seus relacionamentos e dependências. Um DAG é definido em um script Python, que representa a estruturados DAGs (tarefas e suas dependências) como código.
DAG de amostra : vamos criar e entender um DAG de amostra, digamos que você queira criar e agendar um fluxo de trabalho, que pega uma determinada tabela e transforma em um arquivo . Csv e faz a entrega em um determinado Bucket , para ser consumido pela área solicitante.
—————————————– início do código ————————————————
importairflow
fromairflow
import DAG
fromairflow.operators.bash_operator import BashOperator
from datetime import datetime,timedelta
default_args = {
‘start_date’: datetime(2021, 4, 16),
‘retries’: 36,
‘retry_delay’:timedelta(minutes=5),
‘depends_on_past’: False,
}
dag = DAG(
‘FOOD_quarta,
default_args=default_args,
description=’FOOD_quarta,
schedule_interval=’0 9 * * WED,
catchup=False,
max_active_runs=1,
concurrency=3
)
FOOD_segunda = BashOperator(
task_id=’FOOD_quarta,
bash_command=’bq extract–destination_format CSV –field_delimiter “;”–print_header=TRUE vtex.tbl_cie_foodgs://cie_vtex/FOOD/QUARTA/CIE_FOOD_$( date +”%Y%m%d” ).csv’,
dag=dag,
depends_on_past=False)
FOOD_quarta
—————————————– fim do código————————————————
Em uma DAG, primeiro você precisa importar as bibliotecas que deseja usar, neste exemplo, importei os modelos de biblioteca padrão usados para executar o DAG, depois o operador from airflow.operators.bash_operator import BashOperator e ,em seguida, as bibliotecas from datetime import datetime, timedelta para agendamento .
Agora definimos nossos locais de intervalo e argumento padrão, em default_args para oDAG, como data de início, novas tentativas e há muitos outros que podem ser definidos conforme necessário, mas aqui defini apenas alguns que são necessários.
Agora o nome da DAG , sendo o schedule_interval o item mais importante para os agendamentos.
Neste caso o processo executa todas as quartas-feiras. ás 09:00 horas AM. Usei como apoio o link https://airflow.apache.org/docs/apache-airflow/1.10.1/scheduler.html novamente,há muitos parâmetros que podem ser definidos, usei apenas os que são necessários.
Clique nas DAG escolhidas, e isso abrirá os detalhes do fluxo de trabalho conforme mostrado abaixo, Existem vários estágios mencionados como agendado, ignorado,sucesso, falha, execução, etc. Aqui, todas as DAGs estão em sucesso, sendo mostrado como Verde Escuro.
Em Task instance details , todos os detalhes da execução
Então,isso é tudo para criar e agendar uma DAG. Há muito que você pode explorar e fazer por meio do Composer / Airflow. Este foi um exemplo simples e prático aplicado no ambiente de produção, em Google Cloud Platform.
Gostou do artigo? Leia agora nossos estudos sobre Funções Mais Legíveis em Javascript com Option Object.