Skip to content

Instantly share code, notes, and snippets.

@marcusradell
Last active January 24, 2018 13:12
Show Gist options
  • Save marcusradell/b860c48a83881c2a58e78cf749e42b81 to your computer and use it in GitHub Desktop.
Save marcusradell/b860c48a83881c2a58e78cf749e42b81 to your computer and use it in GitHub Desktop.
PoC pure server
import { makeModel } from './model'
import { makeRouteDefs } from './route-defs'
import { makeRouteResolvers } from './route-resolvers'
import { makeServices } from './services'
export const makeReports = props => {
const { provider, salesModel } = props
const { serviceEffects } = provider
const { db, token } = serviceEffects
const services = makeServices(db, token)
const model = makeModel(services, salesModel)
const routeDefs = makeRouteDefs()
const routeResolvers = makeRouteResolvers(model)
return {
model,
routeDefs,
routeResolvers,
}
}
const makeCreateReport = (reportServices, salesModel) => (
startDate,
endDate,
locationId
) => {
const { createCompleteReport, createReportToken } = reportServices
return (
// @TODO(MANI): calculate a Report Number here?
Promise.all([
createReportToken(),
salesModel.getSalesByLocationId(startDate, endDate, locationId),
salesModel.getSellerByLocationId(locationId),
salesModel.getKarma(),
])
.then(([token, salesData, sellerData, karmaData]) => {
// @TODO(MANI): validate that the salesData is complete, otherwise createIncompleteReport
return {
endDate,
karmaData,
locationId,
salesData: JSON.stringify(salesData),
sellerData: JSON.stringify(sellerData),
startDate: JSON.stringify(startDate),
token,
}
})
.then(reportData => createCompleteReport(reportData))
// @TODO(MANI): Return the created report ID
.then(a => a)
)
}
export const makeModel = (reportServices, salesModel) => {
const createReport = makeCreateReport(reportServices, salesModel)
return {
createReport,
}
}
export const makeRouteDefs = () => [
{
body: ['startDate', 'endDate', 'locationId'],
id: 'createReport',
method: 'post',
},
]
const makeCreateReport = reportModel => routeArgs => {
const { body } = routeArgs
const { startDate, endDate, locationId } = body
return reportModel.createReport(startDate, endDate, locationId)
}
export const makeRouteResolvers = reportModel => {
const createReport = makeCreateReport(reportModel)
return {
createReport,
}
}
interface ICreateReportData {
...
}
const createCompleteReportDef = (bind: ICreateReportData) => {
return [
`
INSERT INTO reports
(
...
) VALUES
(
...
)
`,
{
bind,
type: 'INSERT',
},
]
}
// @TODO(MANI): Implement
const createIncompleteReport = null
export const makeServices = (dbEffect, tokenEffect) => {
const createCompleteReport = data => dbEffect(createCompleteReportDef(data))
const createReportToken = () => tokenEffect()
return {
createCompleteReport,
createReportToken,
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment