Skip to content

Instantly share code, notes, and snippets.

@rubikill
Last active December 14, 2022 07:06
Show Gist options
  • Save rubikill/cbe982f9a1dce302b135577ddb85c2a0 to your computer and use it in GitHub Desktop.
Save rubikill/cbe982f9a1dce302b135577ddb85c2a0 to your computer and use it in GitHub Desktop.
Railway js code
let requestData = {
  "email": "",
  "name": "",
  "userID": ""
}

function validateRequest(reqData) {
  return new Promise((resolve, reject) => {
    if (reqData.email == "") {
      reject(`Email should not empty`);
    } else {
      resolve(reqData);
    }
  });
}

function canonicalizeEmail(reqData) {
  return new Promise((resolve, _reject) => {
    resolve({...reqData, ...{
      "email": reqData.email.toLowerCase()
    }});
  });
}

const db = {
  save: function(data) {
    if (data) {
      return "ok"
    } else {
      return "Save to DB failed"
    }
  }
};

function updateDbFromRequest(reqData) {
  return new Promise((resolve, reject) => {
    const result = db.save(reqData)
    if (result == "ok") {
      resolve(reqData)
    } else {
      reject(`Saving to DB failed`);
    }
  });
}

const smtpServer = {
  sendEmail: function(data) {
    if (data) {
      return "ok"
    } else {
      return "Save to DB failed"
    }
  }
};

function sendEmail(data) {
  return new Promise((resolve, reject) => {
    const result = smtpServer.sendEmail(reqData)
    if (result == "ok") {
      resolve(reqData)
    } else {
      reject(`Sending email failed`);
    }
  });
}

new Promise(requestData)
  // .then(determineParity, troubleWithGetNumber)
  .then(validateRequest)
  .then(canonicalizeEmail)
  .then(updateDbFromRequest)
  .then(sendEmail)
  .then((info) => {
    console.log(`Got: ${info}`);
    return info;
  })
  .catch((reason) => {
    console.error(`Trouble with promiseGetWord(): ${reason}`);
  })
  .finally((_info) => console.log("All done"));
defmodule RailwayController do
    use Railway.Web, using: :controller
    alias Railway.Repo
    alias Railway.EmailSender

    def run(conn, request_data) do
        with :ok <- validate_request(request_data),
             {:ok, request_data} <- canonicalize_email(request_data),
             {:ok, request_data} <- update_db_from_request(request_data),
             {:ok, request_data} <- send_email(request_data) do
            conn |> put(200) |> json(request_data)
        else
            {:error, {:update_db_from_request, changeset}} ->
            conn |> put(400) |> json(%{code: "VALIDATION_FAILED", fields: translate_error(changeset)})
            {:error, {:validate_request_failed, message}} ->
                conn |> put(400) |> json(%{code: "VALIDATION_FAILED", fields: message})
            err ->
                conn |> put(500) |> json(%{code: "INTERNAL_SERVER_ERROR", message: })
        end
    end

    defp validate_request(request_data) do
        if request_data["email"] == "" do
            {:error, {:validate_request_failed, "Email is required"}}
        else
            :ok
        end
    end

    defp canonicalize_email(request_data) do
        {:ok, Map.put(request_data, "email", String.downcase(request_data["email"]))}
    end

    defp update_db_from_request(request_data) do
        case Railway.Repo(request_data) do
            {:ok, updated_data} -> {:ok, updated_data}
            {:error, changeset} -> {:error, {:update_db_from_request, changeset}}
        end
    end

    defp send_email(request_data) do
        Railway.EmailSender.send(request_data)
    end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment