-
Notifications
You must be signed in to change notification settings - Fork 16
/
index.js
149 lines (124 loc) · 4.04 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
const express = require('express')
const bodyParser = require('body-parser')
const morgan = require('morgan')
const uuid = require('./lib/uuid')
const app = express()
const PORT = process.env.PORT || 5000
/*
Example implementation of a Netlify Addon Provider
GET / # returns the manifest for the API (in development - not required yet)
POST /instances # create a new instance of your microservice
GET /instances/:id # get the current configuration of an instance
PUT /instances/:id # update the configuration of an instance
DELETE /instances/:id # delete an instance
*/
// Load express middleware
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({ extended: true }))
app.use(morgan('combined'))
/**
* Required Provisioning Routes needed by Netlify
*/
// Manifest Route. Returns data about the integration
app.get('/', function (req, res) {
res.status(200).send({ name: 'example-addon' })
})
// Create an instance of your Service for Netlify Site
app.post('/instances', function (req, res) {
const body = req.body
console.log('Create body', body)
const config = body.config
console.log(`Create ${body.service_id} Instance for site ${config.site_url}`)
/*
CLI Command: `netlify addons:create express-example --name woooooo`
The config `name: woooo` is user supplied via the CLI
*/
const userConfig = config.config
console.log('Create userConfig', userConfig)
/* Do provisioning logic here */
const logValue = userConfig.name || 'Express App'
// This ID will be used for all update/create/delete calls
// example DELETE `/instances/${id}`
const id = uuid()
console.log(`ID for subsequent Update/Get/Delete calls: ${id}`)
const responseToNetlify = {
id: id,
config: config.config,
env: {
'YOUR_SERVICE_API_SECRET': 'value'
},
snippets: [
{
title: 'Snippet From Demo App',
position: 'head',
html: `<script>console.log("Hello from ${logValue}")</script>`
}
]
}
// Create must return 201 response
res.status(201).json(responseToNetlify)
})
// Get details on an instance of your Service for Netlify Site
app.get('/instances/:id', function (req, res) {
const id = req.params.id
console.log(`Get instanceId: ${id}`)
console.log('Get body', req.body)
/* Run logic to get information about instance */
// const instanceData = fetchDataFromDatabase(id)
const instanceData = {
env: {
'YOUR_SERVICE_API_SECRET': 'value'
},
snippets: [
{
title: 'Snippet From Demo App',
position: 'head',
html: '<script>console.log("Hello from App")</script>'
}
]
}
res.status(200).json(instanceData)
})
// Update details on an instance of your Service for Netlify Site
app.put('/instances/:id', function (req, res) {
const id = req.params.id
console.log(`Update instanceId: ${id}`)
const body = req.body
console.log('Update body', body)
const config = body.config
console.log('Update config', config)
// Run Update logic to change values in your service
const logValue = config.name || 'Express App'
// Return updated values to Netlify Site
const responseToNetlify = {
env: {
'YOUR_SERVICE_API_SECRET': 'updated-value'
},
snippets: [
{
title: 'Snippet From Demo App',
position: 'head',
html: `<script>console.log("Goodbye from ${logValue}")</script>`
}
]
}
res.status(200).json(responseToNetlify)
})
// Delete details on an instance of your Service for Netlify Site
app.delete('/instances/:id', function (req, res) {
const id = req.params.id
console.log(`Delete instanceId: ${id}`)
console.log(`Delete body`, req.body)
/* Run Deletion logic to remove the instance from your application */
// Return any data you want back to Netlify cli
const instanceInfo = {
data: {
lol: 'true'
}
}
// Delete must return 204
res.status(204).json(instanceInfo)
})
const server = app.listen(PORT, function () {
console.log('Netlify Addon Provisioning API running on port.', server.address().port)
})