1 | 'use strict'
|
2 | const cli = require('heroku-cli-util')
|
3 | const co = require('co')
|
4 | const { ConnectClient } = require('../clients/connect')
|
5 | const { DiscoveryClient } = require('../clients/discovery')
|
6 |
|
7 | let 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 |
|
20 | exports.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 |
|
38 | let 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 |
|
62 | let 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 |
|
79 | exports.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 | })
|