├── .gitignore ├── claudia.json ├── README.md ├── package.json ├── lambda.js └── bin └── lambda.js /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules/ 2 | .env -------------------------------------------------------------------------------- /claudia.json: -------------------------------------------------------------------------------- 1 | { 2 | "lambda": { 3 | "role": "daryl-executor", 4 | "name": "daryl", 5 | "region": "us-east-1" 6 | } 7 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Daryl 2 | 3 | ### Dev Setup 4 | 5 | You will need AWS credentials, aws-cli, and claudia js installed, speak with Luke or Jimmy if you need help. 6 | 7 | [Installing the AWS Command Line Interface](http://docs.aws.amazon.com/cli/latest/userguide/installing.html) 8 | 9 | [Installing Claudia](https://claudiajs.com/tutorials/installing.html) 10 | 11 | [Claudia Docs](https://claudiajs.com/documentation.html) 12 | 13 | ##### see `package.json` for scripts 14 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "daryl", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "lambda.js", 6 | "files": [ 7 | "bin" 8 | ], 9 | "scripts": { 10 | "transpile": "babel --presets es2015 --plugins async-to-promises lambda.js --out-dir bin", 11 | "create": "npm run transpile && claudia create --region us-east-1 --handler bin/lambda.handler --set-env-from-json .env --timeout 300", 12 | "update": "npm run transpile && claudia update --region us-east-1 --handler bin/lambda.handler --set-env-from-json .env --timeout 300", 13 | "start": "claudia test-lambda", 14 | "destroy": "claudia destroy" 15 | }, 16 | "author": "", 17 | "license": "ISC", 18 | "dependencies": { 19 | "async": "^2.6.0", 20 | "claudia-api-builder": "^2.5.1", 21 | "lodash": "^4.17.4", 22 | "request": "^2.83.0", 23 | "request-promise": "^4.2.2" 24 | }, 25 | "devDependencies": { 26 | "babel-cli": "^6.26.0", 27 | "babel-plugin-async-to-promises": "^1.0.5", 28 | "babel-preset-es2015": "^6.18.0", 29 | "claudia": "^2.5.0" 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /lambda.js: -------------------------------------------------------------------------------- 1 | var _ = require('lodash'); 2 | var rp = require('request-promise'); 3 | var async = require('async'); 4 | 5 | exports.handler = function (event, context) { 6 | 7 | const harvestURL = type => ( 8 | { 9 | uri: `https://api.harvestapp.com/${type}`, 10 | headers: { 11 | 'Authorization': HARVEST_TOKEN, 12 | 'Harvest-Account-ID': HARVEST_ID, 13 | 'User-Agent': 'Poetic Timetracking Lambda (poeticsystems.com)' 14 | }, 15 | json: true, 16 | } 17 | ); 18 | 19 | const insertUsers = (users) => { 20 | users.forEach(({ first_name, last_name }) => { 21 | console.log('poetic user: ', `${first_name} ${last_name}`); 22 | }) 23 | } 24 | 25 | const syncUsers = async () => { 26 | console.log(''); 27 | console.log('syncUsers starting'); 28 | console.log(''); 29 | let syncing = true; 30 | let totalSynced = 0; 31 | while (syncing) { 32 | try { 33 | const harvestUsers = await rp(harvestURL('v2/users?page=1&per_page=100')) 34 | if (harvestUsers.users) { 35 | insertUsers(harvestUsers.users); 36 | totalSynced = totalSynced + harvestUsers.users.length; 37 | } 38 | console.log(''); 39 | console.log(`syncUsers complete, ${totalSynced} users synced`); 40 | console.log(''); 41 | syncing = false 42 | } catch(err) { 43 | console.log(''); 44 | console.log('syncUsers err: ', err); 45 | console.log(''); 46 | syncing = false 47 | } 48 | } 49 | } 50 | 51 | return syncUsers().then(() => { 52 | context.succeed('finished sync'); 53 | }) 54 | }; -------------------------------------------------------------------------------- /bin/lambda.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | var _ = require('lodash'); 4 | var rp = require('request-promise'); 5 | var async = require('async'); 6 | 7 | exports.handler = function (event, context) { 8 | 9 | var harvestURL = function harvestURL(type) { 10 | return { 11 | uri: 'https://api.harvestapp.com/' + type, 12 | headers: { 13 | 'Authorization': HARVEST_TOKEN, 14 | 'Harvest-Account-ID': HARVEST_ID, 15 | 'User-Agent': 'Poetic Timetracking Lambda (poeticsystems.com)' 16 | }, 17 | json: true 18 | }; 19 | }; 20 | 21 | var insertUsers = function insertUsers(users) { 22 | users.forEach(function (_ref) { 23 | var first_name = _ref.first_name, 24 | last_name = _ref.last_name; 25 | 26 | console.log('poetic user: ', first_name + ' ' + last_name); 27 | }); 28 | }; 29 | 30 | var syncUsers = function syncUsers() { 31 | function _recursive() { 32 | if (syncing) { 33 | return Promise.resolve().then(function () { 34 | return Promise.resolve().then(function () { 35 | return rp(harvestURL('v2/users?page=1&per_page=100')); 36 | }).then(function (_resp) { 37 | harvestUsers = _resp; 38 | 39 | if (harvestUsers.users) { 40 | insertUsers(harvestUsers.users); 41 | totalSynced = totalSynced + harvestUsers.users.length; 42 | } 43 | console.log(''); 44 | console.log('syncUsers complete, ' + totalSynced + ' users synced'); 45 | console.log(''); 46 | syncing = false; 47 | }).catch(function (err) { 48 | console.log(''); 49 | console.log('syncUsers err: ', err); 50 | console.log(''); 51 | syncing = false; 52 | }); 53 | }).then(function () { 54 | return _recursive(); 55 | }); 56 | } 57 | } 58 | 59 | var syncing, totalSynced, harvestUsers; 60 | return Promise.resolve().then(function () { 61 | console.log(''); 62 | console.log('syncUsers starting'); 63 | console.log(''); 64 | syncing = true; 65 | totalSynced = 0; 66 | return _recursive(); 67 | }).then(function () {}); 68 | }; 69 | 70 | return syncUsers().then(function () { 71 | context.succeed('finished sync'); 72 | }); 73 | }; --------------------------------------------------------------------------------