@bowtie/sls
Version:
Serverless helpers & utilities
135 lines (111 loc) • 3.35 kB
JavaScript
const AWS = require('aws-sdk');
const uuidv1 = require('uuid/v1')
// const merge = require('deepmerge')
const { verifySchema } = require('@bowtie/utils')
const { dynamoose, defaults, helpers } = require('../config')
const { parseServiceConfig, scanRecursive, findDeploymentHost, findDeploymentLinks } = require('../utils')
const pubnub = require('../pubnub')
// [HIGH] TODO: WTF?!?
// const Build = require('./Build')
// const Document = require('./Document');
const { Schema } = dynamoose
const { envGetAlias, tagIsRelease } = helpers
const AuditSchema = new Schema({
id: {
type: String,
required: true,
hashKey: true,
default: (model) => uuidv1()
},
timestamp: {
type: Number,
// index: true,
required: true,
// rangeKey: true,
default: (model) => Date.now()
},
operation: {
type: String,
enum: [ 'putObject', 'getObject' ],
required: true,
default: 'getObject',
},
documentId: {
type: String,
required: true,
},
lifetime: {
type: Number,
required: true
},
user: {
type: String,
required: true,
},
host: String,
origin: String,
sourceIp: String,
userAgent: String,
}, {
timestamps: true,
throughput: 'ON_DEMAND'
})
const AuditModel = dynamoose.model(process.env.AUDITS_TABLE_NAME, AuditSchema);
AuditModel.methods.set('scanAll', async function (params = {}) {
return scanRecursive(this, params)
})
AuditModel.methods.document.set('publish', function (data = {}, action = 'saved') {
return new Promise(
(resolve, reject) => {
const payload = {
channel: 'audits',
message: {
data,
action,
service: process.env.SERVICE_NAME,
subject: this
}
}
console.log('Audit publish', { payload, data }, this)
if (pubnub) {
pubnub.publish(payload, (status, response) => {
console.log('PN Publish', { status, response })
if (status.error) {
const { operation, statusCode } = status
reject(new Error(`FAIL: Document#publish() failed: (${operation} -> ${statusCode}})`))
} else {
resolve(this)
}
})
} else {
console.log('PubNub is not configured, not publishing updates')
resolve(this)
}
}
)
})
AuditModel.methods.document.set('saveNotify', async function (options = {}) {
// const data = await this.save()
// return await this.publish(data, 'saved')
return await this.save()
})
// AuditModel.methods.document.set('getDocument', async function (options = {}) {
// return await Document.get(this.documentId)
// })
AuditModel.methods.document.set('getSignedUrl', async function (options = {}) {
const Document = require('./Document');
const document = await Document.get(this.documentId);
if (!document) {
throw new Error(`FAIL: Document.getSignedUrl() (documentId not found: ${this.documentId})`);
}
// AWS.config.update({region: 'us-east-1'});
const s3 = new AWS.S3({
signatureVersion: 'v4'
});
const params = document.signedUrlParams();
console.log('INFO: Audit.getSignedUrl()', { params });
const signedUrl = await s3.getSignedUrlPromise(this.operation, params)
console.log('INFO: Audit.getSignedUrl()', { signedUrl });
return signedUrl;
})
module.exports = AuditModel