diff --git a/lib/index.js b/lib/index.js new file mode 100644 index 0000000..e66acda --- /dev/null +++ b/lib/index.js @@ -0,0 +1,116 @@ +'use strict'; +var Client = require('pg').Client; +var promisify = require('util').promisify; + +var defaults = { + tableName: 'acme_challenge' +}; + +module.exports.create = function(config) { + + var tableName = config.tableName || defaults.tableName; + var databaseUrl = config.databaseUrl; + var client; + + return { + init: function(opts) { + console.log('init'); + client = new Client({ + connectionString: databaseUrl + }); + + var dropTableQuery = 'DROP TABLE IF EXISTS "' + tableName + '" CASCADE;'; + var createTableQuery = 'CREATE TABLE IF NOT EXISTS "' + tableName + '" (' + + '"id" SERIAL , ' + + '"domain" VARCHAR(255) NOT NULL, ' + + '"tokenName" VARCHAR(255), ' + + '"keyAuthorization" VARCHAR(255), PRIMARY KEY ("id"));'; + + return client.connect().then(function() { + return client.query(dropTableQuery + createTableQuery) + .then(function(res) { + // console.log(res); + + return null; + }).catch(function(err) { + console.error(err.stack); + throw err; + }); + }).catch(function(err) { + console.error('Unable to connect to the database:', err); + throw err; + }); + + }, + + set: function(data) { + // console.log('Add Key Auth URL', data); + + var ch = data.challenge; + + var setQuery = 'INSERT INTO "'+tableName+'" ("id","domain","tokenName","keyAuthorization") VALUES (DEFAULT,$1,$2,$3) RETURNING *;'; + var setValues = [ch.identifier.value,ch.token,ch.keyAuthorization]; + + return client.query(setQuery,setValues) + .then(function(res) { + // console.log(res); + console.log( + 'acmeChallenge auto-generated ID:', + res.rows[0].id + ); + return true; + + }).catch(function(err) { + console.error(err.stack); + throw err; + }); + + }, + get: function(data) { + // console.log('List Key Auth URL', data); + + var ch = data.challenge; + + var getQuery = 'SELECT "id", "domain", "tokenName", "keyAuthorization" FROM "'+tableName+'" AS "acme_challenge" WHERE "acme_challenge"."domain" = $1 AND "acme_challenge"."tokenName" = $2 LIMIT 1;'; + var getValues = [ch.identifier.value,ch.token]; + + return client.query(getQuery,getValues) + .then(function(res) { + // console.log(res); + var acmeChallenge = res.rows[0]; + if (acmeChallenge) { + return { + keyAuthorization: acmeChallenge.keyAuthorization + }; + } + return null; + + + }).catch(function(err) { + console.error(err.stack); + throw err; + }); + }, + + remove: function(data) { + var ch = data.challenge; + + var deleteQuery = 'DELETE FROM "'+tableName+'" WHERE "domain" = $1 AND "tokenName" = $2'; + var deleteValues = [ch.identifier.value,ch.token]; + + return client.query(deleteQuery,deleteValues) + .then(function(res) { + // console.log(res); + return null; + + }).catch(function(err) { + console.error(err.stack); + throw err; + }); + + } + }; +}; + +// close connection +// client.end();