diff --git a/README.md b/README.md index 81de1ff..2d0ea74 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,24 @@ # Breakups -Creating a payment chain for bill splitting needs +Creating a payment chain for bill splitting needs. [Try it](https://breakups-webapp.herokuapp.com/) out now! [![Dependency Status](https://gemnasium.com/badges/github.com/binhonglee/Breakups.svg)](https://gemnasium.com/github.com/binhonglee/Breakups) -api domain: `https:\\breakups.herokuapp.com\` +api domain: `https://breakups.herokuapp.com/` ## API Call Documentations | Type | Call | Request | Response | |:-----|:-----|:--------|:---------| -| `GET` | `help` | - | URL to github repository | -| `POST` | `total` | [standard](#standard) / [email](#email) | `{ "total": 200 }` | -| `POST` | `perPerson` | [standard](#standard) / [email](#email) | `{ "perPerson": 30 }` | -| `POST` | `oweChart` | [standard](#standard) / [email](#email) | [standard](#standard) / [email](#email) | -| `POST` | `sortedOweChart` | [standard](#standard) / [email](#email) | [standard](#standard) / [email](#email) | -| `POST` | `paymentChain` | [standard](#standard) / [email](#email) | [chain](#chain) | -| `POST` | `emailPaymentChain` | [email](#email) | `["Email sent to user1@domain.com", "Email sent to user2@domain.com"]` | +| `GET` | `/` | - | redirects to [documentation page](https://binhonglee.github.io/Breakups) | +| `GET` | `/help` | - | redirects to github repository | +| `GET` | `/webapp` | - | redirects to the [webapp](https://breakups-webapp.herokuapp.com/) | +| `POST` | `/emailPaymentChain` | [email](#email) | `["Email sent to user1@domain.com", "Email sent to user2@domain.com"]` | +| `POST` | `/total` | [standard](#standard) / [email](#email) | `{ "total": 200 }` | +| `POST` | `/oweChart` | [standard](#standard) / [email](#email) | [standard](#standard) / [email](#email) | +| `POST` | `/paymentChain` | [standard](#standard) / [email](#email) | [chain](#chain) | +| `POST` | `/perPerson` | [standard](#standard) / [email](#email) | `{ "perPerson": 30 }` | +| `POST` | `/sortedOweChart` | [standard](#standard) / [email](#email) | [standard](#standard) / [email](#email) | ## Expected Request / Response diff --git a/index.js b/index.js index 82793a5..31b2137 100644 --- a/index.js +++ b/index.js @@ -18,8 +18,16 @@ app.use(bodyParser.json({ type: 'application/json' })) +app.get('/', function (req, res) { + res.redirect('https://binhonglee.github.io/Breakups/') +}) + app.get('/help', function (req, res) { - res.send('https://github.com/binhonglee/Breakups') + res.redirect('https://github.com/binhonglee/Breakups') +}) + +app.get('/webapp', function (req, res) { + res.redirect('https://breakups-webapp.herokuapp.com/') }) app.post('/total', function (req, res) { @@ -50,7 +58,9 @@ app.post('/sortedOweChart', function (req, res) { app.post('/paymentChain', function (req, res) { input = req.body - res.json(paymentChain(mergeSort(oweChart(input.users)))) + var sorted1 = mergeSort(oweChart(input.users)) + var sorted2 = mergeSort(oweChart(input.users)) + res.json(paymentNetwork(sorted1, sorted2)) }) app.post('/emailPaymentChain', function (req, res) { @@ -67,8 +77,8 @@ app.post('/emailPaymentChain', function (req, res) { res.json(emails) }) -// app.listen(5000) -app.listen(process.env.PORT) +app.listen(5000) +// app.listen(process.env.PORT) function total (input) { var total = 0 @@ -129,6 +139,10 @@ function paymentChain (users) { var stack = 0 for (var i = 0; i < users.length - 1; i++) { + while (users[i + 1].amount === 0) { + users.splice((i + 1), 1) + } + var item = {'from': '', 'to': '', 'amount': 0} item['from'] = users[i].name item['to'] = users[i + 1].name @@ -141,6 +155,43 @@ function paymentChain (users) { return chain } +function paymentNetwork (users, backup) { + var chain = [] + + while (chain.length < users.length && backup.length > 0) { + if (backup.length > 0 && backup[0].amount === 0) { + backup.splice(0, 1) + } else if ((0 !== (backup.length - 1)) && (backup[0].amount === (backup[backup.length - 1].amount * -1))) { + chain.push(createItem(backup[0].name, backup[backup.length - 1].name, backup[backup.length - 1].amount)) + backup.splice((0), 1) + backup.splice((backup.length - 1), 1) + } else if (backup[0].amount * -1 < (backup[backup.length - 1].amount)) { + chain.push(createItem(backup[0].name, backup[backup.length - 1].name, backup[0].amount * -1)) + backup[backup.length - 1].amount += backup[0].amount + backup.splice((0), 1) + } else { + chain.push(createItem(backup[0].name, backup[backup.length - 1].name, backup[backup.length - 1].amount)) + backup[0].amount += backup[backup.length - 1].amount + backup.splice((backup.length - 1), 1) + } + } + + if (backup.length > 0) { + return paymentChain(users) + } else { + return chain + } +} + +function createItem (from, to, amount) { + console.log('from: ' + from + ' to: ' + to + ' amount: ' + amount) + var item = {'from': '', 'to': '', 'amount': 0} + item['from'] = from + item['to'] = to + item['amount'] = amount + return item +} + function messageCreation (user1, user2, amount) { var signature = '

Sincerely,
BreakupBills

' var message = {}