Robię sobie dla sportu collaborative todo app z wykorzystaniem Reduksa i event sourcingu. Apka działa tak, że każda akcja modyfikująca state jest odpalana jako akcja reduksowa (dodatkowo jest zrobiony middleware reduksowy, który zrzuca wszystkie akcje do event loga). Zastanawiam się czy stosować RESTa czy go olać i wysyłać wszystko POSTem jako gotowe message. Docelowo apka będzie pewnie na Socket.io, no ale aktualnie rozważam przypadek z "klasycznym" backendem. Konkrety:
- mam na backendzie podefiniowane akcje w stylu:
export const ADD_TODO = 'ADD_TODO'
export const REMOVE_TODO = 'REMOVE_TODO'
export const DELETE_TODO = 'DELETE_TODO'
// i dalej action creatory w stylu:
export const addTodo = (title, description) => ({
type: ADD_TODO,
payload: {
id: uuid(),
title,
description
}
})
export const removeTodo = (id) => ({
type: REMOVE_TODO,
payload: {
id
}
})
- pominę reducery bo sa nieistotne dla przykładu, routing teraz wygląda mniej więcej tak (orginalna apka jest w Koa, ale pokazuję Expressa bo więcej osób go zna):
router
.get('/todos', (req, res) => {
res.send(store.getState().todos)
})
.post('/todos', (req, res) => {
store.dispatch(addTodo(req.body.title, req.body.description))
res.statusStatus(201)
})
.delete('/todos/:id', (req, res) => {
store.dispatch(removeTodo(req.params.id))
res.sendStatus(200)
})
Alternatywnie mógłbym praktycznie pozbyć się action creatorów z backendu i wysyłać POSTem gotowe akcje na backend, wtedy routing ograniczyłby się do POSTa i GETa, coś w stylu:
router
.get('/todos', (req, res) => {
res.send(store.getState().todos)
})
.post('/', (req, res) => {
store.dispatch(req.body) // body zawiera gotową akcję
res.sendStatus(200)
})
Pomijam powyżej obsługę błedów itp
Które podejście wydaje się Wam lepsze? Pełen REST czy GETy dla kolekcji i pojedynczy POST rozpakowujący przesłaną z frontendu akcję? Może jeszcze coś innego?
Maciej Cąderek