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