[go: up one dir, main page]

Skip to content

lucas-aragno/performpal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

17 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Performpal

Performpal is a library that provides a way to remove all the business logic from different layers of your application and re structure it with "service objects".

Installation

npm install --save performpal

How to use it

Performpal provides an object called Operation that acts as an orchestrator between your business logic and endpoints, models, or services. They implement particular use cases of your application like placing an order or registering a new user.

The Operation object provides a "react"-ish way to handle actions for your use cases:

Example

const { Operation } = require('performpal')
const pug = require('pug')
const emailService = require('../emailService')
const registeredUserEmail = pug.compileFile('../templates/users/register')


class SendEmail extends Operation {
  constructor () {
    super()
    this.steps = [
      this.createEmailBody,
      this.sendEmail
    ]

    this.failures = [
      this.handleSubmitEmailError
    ]
  }

  // on constructor handle this, like react does with this.state

  createEmailBody ({params, options}) {
    let { email } = params
    options['emailBody'] = registeredUserEmail({email})
  }


  sendEmail ({params, options}) {
    const { emailBody } = options
    const { email } = params
    return emailService.send({ email, emailBody })
  }

  handleSubmitEmailError ({params}) {
    const { email } = params
    throw new Error(`Error sending email to ${email}`)
  }
}

module.exports = SendEmail
// this is an express route

const SendEmail = require('../operations/SendEmail')

app.post('/sendEmail', async (req) => {
  try {
    let { email } = req.body
    let result = await (new SendEmail()).run({params: {email}})
    res.send(200).json({result})
  } catch (error) {
    res.send(500).json({error})
  }
})

For more examples check:

Why?

"Service Objects" are a good way to keep business logic away from other application layers. Specially in nodejs that has frameworks like express, koa, hapi, etc that gives to the developer a lot of freedom regarding the implementation of the architecture the lack of a clear division of concerns between layers can be a problem.

Perfompal provides an Object-oriented way to encapsulate business logic into units that are composable.

This allows an easier way to follow a "clean architecture" pattern.

You can learn more of this style on this talks:

Also from this books:

And Following this guys:

performpal is inspired by traiblazer's operations.