async function insert(params) { const contribution = joi.attempt(params, insertSchema) return db(tableName) .insert(contribution) .returning('*') .then(fp.first) }
async function insertOrReplace(params) { const contribution = joi.attempt(params, insertSchema) const query = ` INSERT INTO :tableName: ("user", repository, line_count) VALUES (:user, :repository, :line_count) ON CONFLICT ("user", repository) DO UPDATE SET line_count = :line_count RETURNING *; ` return db.raw(query, Object.assign({ tableName }, contribution)) .then(fp.first) }
async function onTrigger(message) { logger.debug('trigger: received', message) // validate data let data try { data = joi.attempt(message, schema) } catch (err) { logger.error('trigger: invalid message', { data: message, error: err.message }) return } const { date, query } = data // only the first 1000 search results are available await Promise.all(_.range(10).map((page) => redis.publishObject(CHANNELS.collect.repository.v1, { date, page, query }) )) logger.debug('trigger: finished', message) }
async function read(params) { const selection = joi.attempt(params, readSchema) return db(tableName) .where(selection) .select() .first() }
async function read(params) { const repository = joi.attempt(params, readSchema)
data = joi.attempt(message, schema) } catch (err) { logger.error('contributions: invalid message', {
async function read(params) { const { repository = {}, user = {} } = joi.attempt(params, readSchema)
data = joi.attempt(message, schema) } catch (err) { logger.error('repository: invalid message', {
config.buckets.forEach(bucket => { const [name, size, ttlString] = bucket.split(',').map(_.trim); let ttl; try { ttl = ttlString && parseTTL(ttlString); } catch (e) { throw new Error(`${e.message} for bucket ${bucket}`); } if (!name || !size || !ttl) { throw new Error(`Could not parse bucket ${bucket} name:${name} size:${size} ttl:${ttl}`); } if (buckets[name]) { throw new Error(`Bucket ${name} was already defined`); } buckets[name] = {size: joi.attempt(size, validators.bucketSize, 'bucket size'), ttl}; });
_.each(service, (method, name) => { if (!method.schema) { return } const params = getParams(method) service[name] = async function () { const args = Array.prototype.slice.call(arguments) const value = _combineObject(params, args) const normalized = Joi.attempt(value, method.schema) const newArgs = [] // Joi will normalize values // for example string number '1' to 1 // if schema type is number _.each(params, (param) => { newArgs.push(normalized[param]) }) return method.apply(this, newArgs) } service[name].params = params })
/** * Check if ES refresh method is valid. * * @param {String} method method to be tested * @returns {String} method valid method */ async function validateESRefreshMethod (method) { Joi.attempt(method, Joi.string().label('ES_REFRESH').valid(['true', 'false', 'wait_for'])) return method }
async function insert(params) { const user = joi.attempt(params, insertSchema) return db(tableName) .insert(user) .returning('*') .then(fp.first) }
async function insert(params) { const repository = joi.attempt(params, insertSchema) return db(tableName) .insert(repository) .returning('*') .then(fp.first) }
config.buckets.forEach(bucket => { const [name, size, ttlString] = bucket.split(',').map(_.trim); let ttl; try { ttl = ttlString && parseTTL(ttlString); } catch (e) { throw new Error(`${e.message} for bucket ${bucket}`); } if (!name || !size || !ttl) { throw new Error(`Could not parse bucket ${bucket} name:${name} size:${size} ttl:${ttl}`); } if (buckets[name]) { throw new Error(`Bucket ${name} was already defined`); } buckets[name] = {size: joi.attempt(size, validators.bucketSize, 'bucket size'), ttl}; });