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
// src/actions/user.action.ts
export async function getUsersAction() {
const response = await api.get('/users');
return response.data;
}Ação de Recurso Local
// 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
// 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.
// 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:
- Tecnicidade: O código é focado em como o sistema funciona tecnicamente (headers, storage, interceptors).
- Globalidade: Afeta o comportamento de toda a aplicação, não apenas uma tela ou módulo.
- Abstração: Fornece métodos genéricos para as camadas superiores (ex:
api.get,logger.info).