UNPKG

3.93 kBJavaScriptView Raw
1'use strict'
2const cli = require('heroku-cli-util')
3const co = require('co')
4const { ConnectClient } = require('../clients/connect')
5const { DiscoveryClient } = require('../clients/discovery')
6
7let request = exports.request = function (context, method, url, data) {
8 if (!context.region) {
9 throw new Error('Must provide region URL')
10 }
11 const connectClient = new ConnectClient(context)
12 return connectClient.request({
13 baseURL: context.region,
14 method,
15 url,
16 data
17 })
18}
19
20exports.withUserConnections = co.wrap(function * (context, appName, flags, allowNone, heroku) {
21 const connectClient = new ConnectClient(context)
22 const discoveryClient = new DiscoveryClient(context)
23
24 const searchResponse = yield discoveryClient.searchConnections(appName, context.flags.resource)
25 const connections = searchResponse.data.results
26
27 if (connections.length === 0) {
28 return yield Promise.resolve([])
29 }
30
31 const fetchConnectionDetailFuncs = connections.map(c => connectClient.getDetails(c))
32
33 const aggregatedConnectionsResponse = yield Promise.all(fetchConnectionDetailFuncs)
34 const aggregatedConnectionsData = aggregatedConnectionsResponse.map(resp => resp.data)
35 return yield Promise.resolve(aggregatedConnectionsData)
36})
37
38let withConnection = exports.withConnection = function (context, heroku) {
39 return co(function * () {
40 const connectClient = new ConnectClient(context)
41 const discoveryClient = new DiscoveryClient(context)
42
43 const searchResponse = yield discoveryClient.searchConnections(context.app, context.flags.resource)
44 const connections = searchResponse.data.results
45
46 if (connections.length === 0) {
47 yield Promise.reject(Error('No connection(s) found'))
48 } else if (connections.length > 1) {
49 throw new Error("Multiple connections found. Please use '--resource' to specify a single connection by resource name. Use 'connect:info' to list the resource names.")
50 } else {
51 const match = connections[0]
52 const matchDetailResponse = yield connectClient.getDetails(match)
53 const matchWithDetails = {
54 ...match,
55 ...matchDetailResponse.data
56 }
57 return yield Promise.resolve(matchWithDetails)
58 }
59 })
60}
61
62let withMapping = exports.withMapping = function (connection, objectName) {
63 return co(function * () {
64 let objectNameLower = objectName.toLowerCase()
65 let mapping
66 connection.mappings.forEach(function (m) {
67 if (m.object_name.toLowerCase().indexOf(objectNameLower) === 0) {
68 mapping = m
69 }
70 })
71 if (mapping !== undefined) {
72 return yield Promise.resolve(mapping)
73 } else {
74 throw new Error('No mapping configured for ' + objectName)
75 }
76 })
77}
78
79exports.getWriteErrors = co.wrap(function * (context, heroku) {
80 let url, action
81 let mappingName = context.args.name
82 let connection = yield withConnection(context, heroku)
83 context.region = connection.region_url
84 if (!mappingName) {
85 url = `/api/v3/connections/${connection.id}/errors`
86 action = `Retrieving write errors for ${connection.name}`
87 } else {
88 let mapping = yield withMapping(connection, mappingName)
89 url = `/api/v3/mappings/${mapping.id}/errors`
90 action = `Retrieving write errors for ${mappingName} on ${connection.name}`
91 }
92 let results = yield cli.action(action, co(function * () {
93 return yield request(context, 'GET', url)
94 }))
95 let errors = results.data
96
97 if (errors.count === 0) {
98 cli.log(cli.color.green('No write errors in the last 24 hours'))
99 } else {
100 if (context.flags.json) {
101 cli.styledJSON(errors.results)
102 } else {
103 cli.table(errors.results, {
104 columns: [
105 {key: 'id', label: 'Trigger Log ID'},
106 {key: 'table_name', label: 'Table Name'},
107 {key: 'record_id', label: 'Table ID'},
108 {key: 'message', label: 'Error Message'},
109 {key: 'created_at', label: 'Created'}
110 ]
111 })
112 }
113 }
114})