Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

View raynerpupo's full-sized avatar

Rayner Pupo raynerpupo

  • ThoughtWorks.
View GitHub Profile

TechOps Chatbot backend

Architecture overview

The TechOps Chatbot backend is a NodeJS API written in TypeScript, served with ExpressJS, secured with Passport through a secret bearer token and provisioned on AWS using Terraform. The users feedback is stored in a DynamoDB database on AWS using the aws-sdk and dynamodb-data-mapper.

API endpoints

POST::/feedback

Intro

Discipline is the future

https://www.youtube.com/watch?v=ecIWPzGEbFc blah Uncle Bob Martin conference about the Future of programming, can reduce the whole conference in one word "discipline" FP paradigm is even older than others mainstream like OOP. It's taking a rise lately given most of the current languages/ecosystems can eventually get an approximate result, yet the time and effort to build and refactor could be very different.

export {}
// A monoid is a binary associative operation with an identity
// Laws
// 1 - Associativity: (x <> y) <> z = x <> (y <> z)
// 2 - Left identity: mempty <> x = x
// 3 - Right identity: x <> mempty = x
type Monoid<A = any> = {
mempty: A,

Modern JavaScript

Template literals

Multiline strings

Default parameters

Classes

Coercion

Coercion is an implicit conversion of types:

// amount is a number
var amount = 32;

// since " years" is a string there is a implicit conversion of amount to string
var age = amount + " years";
console.log(age); // =&gt; 32 years

Mixins

Mixins favors composition over inheritance by adding some custom behavior to an existing object

const fulfillable = {
  fullfill: (doneFunction) => done("OK")
};

const myObj = {
 quit: () =&gt; console.log("quit"),

Async / Await

Async and await let us handle asynchronous code easily, it's somehow similar to generators, pausing the execution whenever the await is prefixed:

// To be able to wait for a call we need to mark a function as async
async function getTemperature () {
// We wait until the getWeather function returns the value
  const weather = await getWeather(....);
 

Call apply and bind

Call and Apply

The call and apply functions are similar, they expect a the contex (this) and the parameter to call the function, the only difference is that apply accepts the function parameters in an array.

const calculate = function(x, y) {
  return this.operation(x, y);
}

const multiply = {

Node Error first callback

The expected callback function

This kind of callback function have the error as the first parameter and the actual value as the second

function incrementAndLog(err, value) {
  if (err) {
    console.log("there's no value to increment");
    return;

Callbacks

Are basically functions that are called when some result is ready or they can also be used to signal errors.

function aDividedByB(a, b, onResultFn, onErrorFn) {
  if (b != 0) {
    return onResultFn(a / b);
  }
  return onErrorFn("The divisor can't be zero!");
}