Skip to content

Camada de Aplicação (Application Layer)

A Camada de Aplicação é a base técnica do sistema. Ela lida com infraestrutura, configurações globais e ferramentas que sustentam as camadas superiores.

Actions e Execução de Tarefas

As Actions pertencem a esta camada. Elas centralizam não apenas as chamadas de API, mas qualquer execução de ação técnica ou obtenção de dados de fontes externas/globais (como Cookies, LocalStorage ou listas estáticas). Como são agnósticas a regras de negócio complexas, elas podem ser reutilizadas por múltiplas funcionalidades (Features).

Exemplos de Actions de Aplicação

Chamada de API

typescript
// src/actions/user.action.ts
export async function getUsersAction() {
  const response = await api.get('/users');
  return response.data;
}

Ação de Recurso Local

typescript
// src/actions/storage.action.ts
export function getLocalPreferencesAction() {
  const prefs = localStorage.getItem('@app:preferences');
  return prefs ? JSON.parse(prefs) : null;
}

Exemplo Prático: Redux Saga (Middlewares e Side Effects)

Em nossa arquitetura, o Redux Saga reside na Camada de Aplicação para gerenciar efeitos colaterais complexos de forma centralizada e desacoplada da lógica de negócio específica de uma funcionalidade.

Configuração do Root Saga

typescript
// src/application/store/root-saga.ts
import { all, fork } from 'redux-saga/effects';
import { authSaga } from './auth/sagas';
import { socketSaga } from './socket/sagas';

export function* rootSaga() {
  yield all([
    fork(authSaga),
    fork(socketSaga),
  ]);
}

Implementação de um Saga de Infraestrutura

Neste exemplo, um Saga gerencia a persistência do token de autenticação e a configuração do cliente de API globalmente.

typescript
// src/application/store/auth/sagas.ts
import { takeLatest, call, put } from 'redux-saga/effects';
import { api } from '../../api/client';
import { AUTH_LOGIN_SUCCESS, setToken } from './actions';

function* handleLoginSuccess(action: any) {
  const { token } = action.payload;
  
  // Configura o header global de todas as chamadas futuras
  yield call(api.setAuthorizationHeader, token);
  
  // Persiste no storage local (infraestrutura)
  yield call(localStorage.setItem, '@ptm:token', token);
}

export function* authSaga() {
  yield takeLatest(AUTH_LOGIN_SUCCESS, handleLoginSuccess);
}

Características nesta camada:

  1. Tecnicidade: O código é focado em como o sistema funciona tecnicamente (headers, storage, interceptors).
  2. Globalidade: Afeta o comportamento de toda a aplicação, não apenas uma tela ou módulo.
  3. Abstração: Fornece métodos genéricos para as camadas superiores (ex: api.get, logger.info).