UNPKG

@bowtie/sls

Version:

Serverless helpers & utilities

135 lines (111 loc) 3.35 kB
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