liatrio/gratibot

View on GitHub
service/redeem.js

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
const config = require("../config");
const fs = require("fs");
 
const path = require("path");
// TODO: Long term this should be sourced from DB
let rawdata = fs.readFileSync(path.resolve(__dirname, "../rewards.json"));
const gratibotRewards = JSON.parse(rawdata);
 
const { redemptionAdmins } = config;
 
function createRedeemBlocks(currentBalance) {
let blocks = [];
 
blocks.push(redeemHeader());
blocks.push(redeemHelpText(currentBalance));
blocks.push(...redeemItems(gratibotRewards));
blocks.push(redeemSelector(gratibotRewards));
 
return blocks;
}
 
function redeemHeader() {
return {
type: "header",
text: {
type: "plain_text",
text: "Gratibot Rewards",
},
};
}
 
function redeemHelpText(currentBalance) {
return {
type: "section",
text: {
type: "mrkdwn",
text: `Take a look at the currently available rewards!\nBalance: ${currentBalance}`,
},
};
}
 
function redeemItems(gratibotRewards) {
let blocks = [];
for (let i = 0; i < gratibotRewards.length; i++) {
blocks.push({
type: "section",
text: {
type: "mrkdwn",
text: `*${gratibotRewards[i].name}*\n${gratibotRewards[i].description}\nCost: ${gratibotRewards[i].cost}`,
},
accessory: {
type: "image",
image_url: `${gratibotRewards[i].imageURL}`,
alt_text: `Image of ${gratibotRewards[i].name}`,
},
});
}
return blocks;
}
 
Function `redeemSelector` has 48 lines of code (exceeds 25 allowed). Consider refactoring.
function redeemSelector(gratibotRewards) {
let options = [];
for (let i = 0; i < gratibotRewards.length; i++) {
const item = {
name: `${gratibotRewards[i].name}`,
cost: `${gratibotRewards[i].cost}`,
};
options.push({
text: {
type: "plain_text",
text: `${gratibotRewards[i].name}`,
},
value: JSON.stringify(item),
});
}
return {
type: "section",
text: {
type: "mrkdwn",
text: "Pick an item from the dropdown list",
},
accessory: {
type: "static_select",
placeholder: {
type: "plain_text",
text: "Select an item",
},
options: options,
confirm: {
title: {
type: "plain_text",
text: "Are you sure?",
},
text: {
type: "mrkdwn",
text: "You're sure you want to buy?",
},
confirm: {
type: "plain_text",
text: "Yes",
},
deny: {
type: "plain_text",
text: "Stop, I've changed my mind!",
},
},
action_id: "redeem",
},
};
}
 
function redeemNotificationUsers(redeemingUser, admins = redemptionAdmins) {
let mpimGroup = `${redeemingUser}`;
for (let i = 0; i < admins.length; i++) {
mpimGroup += `, ${admins[i]}`;
}
return mpimGroup;
}
 
// Assumes value is json string
function getSelectedItemDetails(selectedItem) {
const item = JSON.parse(selectedItem);
return {
itemName: item.name,
itemCost: item.cost,
};
}
 
module.exports = {
createRedeemBlocks,
redeemNotificationUsers,
getSelectedItemDetails,
redeemHeader,
redeemHelpText,
redeemItems,
redeemSelector,
};