Get progress info from trello

This commit is contained in:
Jonathan Barrow 2021-04-19 16:21:50 -04:00
parent 5f50fe4ed1
commit 9be553cd9f
8 changed files with 457 additions and 13 deletions

View File

@ -1,5 +1,10 @@
{
"http": {
"port": 80
},
"trello": {
"api_key": "key",
"api_token": "token",
"board_name": "name"
}
}

357
package-lock.json generated
View File

@ -5,14 +5,16 @@
"requires": true,
"packages": {
"": {
"name": "website",
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"colors": "^1.4.0",
"express": "^4.17.1",
"express-handlebars": "^4.0.4",
"fs-extra": "^9.1.0"
"fs-extra": "^9.1.0",
"ioredis": "^4.26.0",
"redis-json": "^5.0.0",
"trello": "^0.10.0"
}
},
"node_modules/accepts": {
@ -87,6 +89,14 @@
"node": ">= 0.8"
}
},
"node_modules/cluster-key-slot": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
"integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw==",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
@ -157,6 +167,14 @@
"node": ">= 0.4"
}
},
"node_modules/denque": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ==",
"engines": {
"node": ">=0.10"
}
},
"node_modules/depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@ -183,6 +201,11 @@
"node": ">= 0.8"
}
},
"node_modules/es6-promise": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
"integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y="
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -397,6 +420,51 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"node_modules/ioredis": {
"version": "4.26.0",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.26.0.tgz",
"integrity": "sha512-nh39okWezWWZ35/RxXXzHksMFt4WCaev8SNO2kozRDeVdEAJj16EarqPP3JeHz8IEjEXN5CiVtbWMk62Z0eveQ==",
"dependencies": {
"cluster-key-slot": "^1.1.0",
"debug": "^4.3.1",
"denque": "^1.1.0",
"lodash.defaults": "^4.2.0",
"lodash.flatten": "^4.4.0",
"p-map": "^2.1.0",
"redis-commands": "1.7.0",
"redis-errors": "^1.2.0",
"redis-parser": "^3.0.0",
"standard-as-callback": "^2.1.0"
},
"engines": {
"node": ">=6"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/ioredis"
}
},
"node_modules/ioredis/node_modules/debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/ioredis/node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
},
"node_modules/ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@ -416,6 +484,16 @@
"graceful-fs": "^4.1.6"
}
},
"node_modules/lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
},
"node_modules/lodash.flatten": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
},
"node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -501,6 +579,14 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
"integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
},
"node_modules/object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@ -542,6 +628,14 @@
"wrappy": "1"
}
},
"node_modules/p-map": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
"integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
"engines": {
"node": ">=6"
}
},
"node_modules/parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -613,6 +707,65 @@
"node": ">= 0.8"
}
},
"node_modules/redis-commands": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
},
"node_modules/redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=",
"engines": {
"node": ">=4"
}
},
"node_modules/redis-json": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/redis-json/-/redis-json-5.0.0.tgz",
"integrity": "sha512-Yu/MzHg9EXp/lS3TonbA1mtMPwSew3xPJtKTJiLo9tpsIkLHmW6rdFmdf14KOyqiLOeFvktodeiJ9H9bhsO0aA==",
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/redis-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
"dependencies": {
"redis-errors": "^1.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/restler": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/restler/-/restler-3.3.0.tgz",
"integrity": "sha1-+TpZteG8LFrQwrlz94EpshgbYHY=",
"dependencies": {
"iconv-lite": "0.2.11",
"qs": "1.2.0",
"xml2js": "0.4.0",
"yaml": "0.2.3"
},
"engines": {
"node": ">= 0.10.x"
}
},
"node_modules/restler/node_modules/iconv-lite": {
"version": "0.2.11",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
"integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/restler/node_modules/qs": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-1.2.0.tgz",
"integrity": "sha1-7Qeb4oaCFH5v2aNMwrDB4OxkU+4="
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@ -623,6 +776,11 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sax": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
"integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
},
"node_modules/send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@ -678,6 +836,11 @@
"node": ">=0.10.0"
}
},
"node_modules/standard-as-callback": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
},
"node_modules/statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@ -694,6 +857,19 @@
"node": ">=0.6"
}
},
"node_modules/trello": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/trello/-/trello-0.10.0.tgz",
"integrity": "sha512-l2uDieuUkFU+qlZG1dtu11Uzg5yKZLl+NjVCAQWumaHnclH46cTuBEyHjnz7kPqZDNoGf7qzcsln0BOVjrFajw==",
"dependencies": {
"es6-promise": "~3.0.2",
"object-assign": "~4.1.0",
"restler": "~3.3.0"
},
"engines": {
"node": ">= 0.10.x"
}
},
"node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@ -762,6 +938,31 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"node_modules/xml2js": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.0.tgz",
"integrity": "sha1-Ek/EEUtBKcgQgA7LKshs8lRiy5o=",
"dependencies": {
"sax": "0.5.x",
"xmlbuilder": ">=0.4.2"
}
},
"node_modules/xmlbuilder": {
"version": "15.1.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
"integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==",
"engines": {
"node": ">=8.0"
}
},
"node_modules/yaml": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-0.2.3.tgz",
"integrity": "sha1-tUUOkudu82td0k42YAkeuu7z5cc=",
"engines": {
"node": "*"
}
}
},
"dependencies": {
@ -825,6 +1026,11 @@
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz",
"integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg=="
},
"cluster-key-slot": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.0.tgz",
"integrity": "sha512-2Nii8p3RwAPiFwsnZvukotvow2rIHM+yQ6ZcBXGHdniadkYGZYiGmkHJIbZPIV9nfv7m/U1IPMVVcAhoWFeklw=="
},
"colors": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz",
@ -880,6 +1086,11 @@
"object-keys": "^1.0.12"
}
},
"denque": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/denque/-/denque-1.5.0.tgz",
"integrity": "sha512-CYiCSgIF1p6EUByQPlGkKnP1M9g0ZV3qMIrqMqZqdwazygIA/YP2vrbcyl1h/WppKJTdl1F85cXIle+394iDAQ=="
},
"depd": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
@ -900,6 +1111,11 @@
"resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
"integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
},
"es6-promise": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz",
"integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y="
},
"escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@ -1073,6 +1289,38 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
},
"ioredis": {
"version": "4.26.0",
"resolved": "https://registry.npmjs.org/ioredis/-/ioredis-4.26.0.tgz",
"integrity": "sha512-nh39okWezWWZ35/RxXXzHksMFt4WCaev8SNO2kozRDeVdEAJj16EarqPP3JeHz8IEjEXN5CiVtbWMk62Z0eveQ==",
"requires": {
"cluster-key-slot": "^1.1.0",
"debug": "^4.3.1",
"denque": "^1.1.0",
"lodash.defaults": "^4.2.0",
"lodash.flatten": "^4.4.0",
"p-map": "^2.1.0",
"redis-commands": "1.7.0",
"redis-errors": "^1.2.0",
"redis-parser": "^3.0.0",
"standard-as-callback": "^2.1.0"
},
"dependencies": {
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"requires": {
"ms": "2.1.2"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
}
}
},
"ipaddr.js": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
@ -1087,6 +1335,16 @@
"universalify": "^2.0.0"
}
},
"lodash.defaults": {
"version": "4.2.0",
"resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
"integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw="
},
"lodash.flatten": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
"integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8="
},
"media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
@ -1148,6 +1406,11 @@
"resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz",
"integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw=="
},
"object-assign": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
"integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
},
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
@ -1180,6 +1443,11 @@
"wrappy": "1"
}
},
"p-map": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
"integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw=="
},
"parseurl": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
@ -1233,6 +1501,52 @@
"unpipe": "1.0.0"
}
},
"redis-commands": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.7.0.tgz",
"integrity": "sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ=="
},
"redis-errors": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz",
"integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60="
},
"redis-json": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/redis-json/-/redis-json-5.0.0.tgz",
"integrity": "sha512-Yu/MzHg9EXp/lS3TonbA1mtMPwSew3xPJtKTJiLo9tpsIkLHmW6rdFmdf14KOyqiLOeFvktodeiJ9H9bhsO0aA=="
},
"redis-parser": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz",
"integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=",
"requires": {
"redis-errors": "^1.0.0"
}
},
"restler": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/restler/-/restler-3.3.0.tgz",
"integrity": "sha1-+TpZteG8LFrQwrlz94EpshgbYHY=",
"requires": {
"iconv-lite": "0.2.11",
"qs": "1.2.0",
"xml2js": "0.4.0",
"yaml": "0.2.3"
},
"dependencies": {
"iconv-lite": {
"version": "0.2.11",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz",
"integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg="
},
"qs": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/qs/-/qs-1.2.0.tgz",
"integrity": "sha1-7Qeb4oaCFH5v2aNMwrDB4OxkU+4="
}
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
@ -1243,6 +1557,11 @@
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"sax": {
"version": "0.5.8",
"resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
"integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
},
"send": {
"version": "0.17.1",
"resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
@ -1291,6 +1610,11 @@
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
},
"standard-as-callback": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/standard-as-callback/-/standard-as-callback-2.1.0.tgz",
"integrity": "sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A=="
},
"statuses": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
@ -1301,6 +1625,16 @@
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
"integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw=="
},
"trello": {
"version": "0.10.0",
"resolved": "https://registry.npmjs.org/trello/-/trello-0.10.0.tgz",
"integrity": "sha512-l2uDieuUkFU+qlZG1dtu11Uzg5yKZLl+NjVCAQWumaHnclH46cTuBEyHjnz7kPqZDNoGf7qzcsln0BOVjrFajw==",
"requires": {
"es6-promise": "~3.0.2",
"object-assign": "~4.1.0",
"restler": "~3.3.0"
}
},
"type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
@ -1348,6 +1682,25 @@
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
"integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
},
"xml2js": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.0.tgz",
"integrity": "sha1-Ek/EEUtBKcgQgA7LKshs8lRiy5o=",
"requires": {
"sax": "0.5.x",
"xmlbuilder": ">=0.4.2"
}
},
"xmlbuilder": {
"version": "15.1.1",
"resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-15.1.1.tgz",
"integrity": "sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg=="
},
"yaml": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/yaml/-/yaml-0.2.3.tgz",
"integrity": "sha1-tUUOkudu82td0k42YAkeuu7z5cc="
}
}
}

View File

@ -20,6 +20,9 @@
"colors": "^1.4.0",
"express": "^4.17.1",
"express-handlebars": "^4.0.4",
"fs-extra": "^9.1.0"
"fs-extra": "^9.1.0",
"ioredis": "^4.26.0",
"redis-json": "^5.0.0",
"trello": "^0.10.0"
}
}

View File

@ -47,13 +47,13 @@ app.engine('handlebars', handlebars({
},
customCheckbox(type) {
switch(type) {
case 'done':
case 'completed':
return `
<div class="custom-checkbox done">
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-check"><polyline points="20 6 9 17 4 12"></polyline></svg>
</div>
`;
case 'ongoing':
case 'started':
return `
<div class="custom-checkbox ongoing">
<div class="small-dot"></div>

View File

@ -2,14 +2,16 @@ const getLocale = require('../../util/getLocale');
const { Router } = require('express');
const router = new Router();
const progressLists = require('../progress-lists');
const { getTrelloCache } = require('../../util/trello');
router.get('/', (req, res) => {
router.get('/', async (request, response) => {
const tmpLocale = getLocale('US', 'en');
res.render('progress', {
const cache = await getTrelloCache();
response.render('progress', {
layout: 'main',
locale: tmpLocale,
progressLists
progressLists: cache
});
});

67
util/trello.js Normal file
View File

@ -0,0 +1,67 @@
const Trello = require('trello');
const Redis = require('ioredis');
const JSONCache = require('redis-json');
const config = require('../config.json');
const trello = new Trello(config.trello.api_key, config.trello.api_token);
const redis = new Redis();
const trelloCache = new JSONCache(redis, { prefix: 'trello:' });
async function getTrelloCache() {
let cache = await trelloCache.get('latest');
if (!cache) {
cache = await updateTrelloCache();
}
if (cache.update_time < Date.now() - (1000 * 60 * 60)) {
cache = await updateTrelloCache();
}
return cache;
}
async function updateTrelloCache() {
const progressData = {
update_time: Date.now(),
sections: []
};
const boards = await trello.getOrgBoards(config.trello.board_name);
for (const board of boards) {
const meta = {
title: '',
progress: {
not_started: [],
started: [],
completed: []
}
};
meta.title = board.name;
const lists = await trello.getListsOnBoard(board.id);
const cards = await trello.getCardsOnBoard(board.id);
for (const card of cards) {
const cardList = lists.find(({ id }) => id === card.idList);
const listName = cardList.name.toLowerCase().replace(' ', '_');
if (meta.progress[listName]) {
meta.progress[listName].push(card.name);
}
}
if (meta.progress.not_started.length !== 0 && meta.progress.started.length !== 0 && meta.progress.completed.length !== 0) {
progressData.sections.push(meta);
}
}
await trelloCache.set('latest', progressData);
return progressData;
}
module.exports = {
getTrelloCache,
updateTrelloCache
};

View File

@ -13,10 +13,24 @@
<h3>{{ data.title }}</h3>
</div>
<div class="feature-list">
{{#each data.features}}
{{#each data.progress.completed}}
<div class="feature">
{{> custom-checkbox status=status }}
<span>{{ name }}</span>
{{> custom-checkbox status="completed" }}
<span>{{ this }}</span>
</div>
{{/each}}
{{#each data.progress.started}}
<div class="feature">
{{> custom-checkbox status="started" }}
<span>{{ this }}</span>
</div>
{{/each}}
{{#each data.progress.not_started}}
<div class="feature">
{{> custom-checkbox status="not_started" }}
<span>{{ this }}</span>
</div>
{{/each}}
</div>

View File

@ -11,7 +11,7 @@
</div>
<div class="all-progress-lists">
{{#each progressLists}}
{{#each progressLists.sections}}
<div class="purple-card">
{{> progress-list data=this }}
</div>