1.1.2 • Published 6 years ago

bg-hive v1.1.2

Weekly downloads
3
License
ISC
Repository
-
Last release
6 years ago

BG Hive

Collection of highly abstracted and modular key-value stores, optimized to our different data types (e.g. articles, alerts, users, ...) with bg-object-cache used for caching.

So.. why? With this you don't have to implement the same logic to retrieve the same data across different node services. For example, notification server uses this to retrieve instruments, beemail and alerting for articles, alerting and notification server for alerts and so on. Cache is shared module-wide, no instantiation needed.

So.. another api wrapper? Not really, this additionally enhances the returned data to accelerate access to specific, often-used values. E.g. Instrument quotations are conveniently available in a hashmap by quotationId, return expectation and breakout direction are copied and merged from sub-sub-sub-nodes of the chartpattern object to top level. This basically tries to hide our sometimes sadly ugly data models. Be aware that these optimizations are only for faster in-service usage and produces redundancy. Any enhancement and the final data model is mentioned above.

Usage

var userStore = require('bg-hive').user;

userStore.get(109369)
    .then(function(user) {})
    .catch(function(err) {});

There is an instantiated key-value cache for each data type called a 'Store'. Each store has his own retrieve method, which gets an object from our api over http if not already cached. This 'retrieve' method can be overwritten to bypass the http overhead, for example if a database connection is already available to perform a direct lookup.

var alertStore = require('bg-hive').alert;

alertStore.retrieve = function(id, callback) {
    db.list({ _id: new db.ObjectID(id)}, function(err, data) {
        if (err) { return callback(err); }
        else { callback(null, data); }
    });
}

alertStore.get('568150ee897d878801076ca2');
// if the alert is not cached yet, it will retrieve it with the direct db connection already available.

Attributes

Each store has a list of requested attributes for our api. This can be mutated to match any needs.

var articleStore = require('bg-hive').article;

articleStore.attributes = [
    'title',
    'teaser',
    'body',
    'author',
    'categories'
];

Supported Data Types

Returned data is directly taken from the response below the 'data' attribute, if not otherwise enhanced. The enhancements for each data type are mentioned in the corresponding type entry.

Alert

var alertStore = require('bg-hive').alert;

alertStore.get('568150ee897d878801076ca2')
    .then(function(alert) {})
    .catch(function(err) {});

Enhancements

Hooray, no enhancements needed!

Article

var articleStore = require('bg-hive').article;

articleStore.get(4598918)
    .then(function(article) {})
    .catch(function(err) {});

Enhancements

Hooray, no enhancements needed!

Beemail

Beemail is the first to have two stores, the simple 'data' store retrieves the template json object, the 'rendered' one returns the same json with the rendered HTML code added as string under 'html'.

var beemailDataStore = require('bg-hive').beemail.data;
var beemailRenderedStore = require('bg-hive').beemail.rendered;

beemailRenderedStore.get('56efd4113636583124ada5dd')
    .then(function(mail) {})
    .catch(function(err) {});

Enhancements

Hooray, no enhancements needed!

Chartpattern

var chartpatternStore = require('bg-hive').chartpattern;

chartpatternStore.get(109369)
    .then(function(chartpattern) {})
    .catch(function(err) {});

Enhancements

Return expectation and breakout direction are two important values, which are found separated across possibly multiple breakout entries. Breakout direction is the 'direction' attribute of the first entry in the breakout array. Default is 0. Return expectation is the highest 'quotePotential.distPercentBreakoutFrom' of all breakout entries. Default is 0.

Resulting Data Model

{ id: 8520152,
  patternType: 
   { id: 2,
     name: 'Trendkanal',
     desc: 'Ein Trendkanal grenzt die Schw...',
     direction: 0 },
  patternStatus: '10',
  instrument: { id: 118935, name: 'Activision, Inc.', refQuotation: null },
  exchangeId: 45,
  calculationTimestamp: 1313227559,
  beginX: 1299508200,
  endX: 1306935000,
  timeSort: 1308159000,
  patternLength: 137,
  resolution: 14400,
  timeHorizon: 0,
  confirmed: -1,
  instrumentSort: 'stock',
  closeTriggered: 1,
  closeTriggeredRegular: 1,
  ad: {},
  breakout: 
   [ { id: 2394205,
       patternId: 8520152,
       type: 1,
       timestamp: 1313227559,
       maxReturn: 0.02043188626101,
       value: 11.1835,
       candle: 1308159000,
       direction: -1,
       candlesTillBreakout: 137,
       quotePotential: [Object] },
     { id: 2394208,
       patternId: 8520152,
       type: 2,
       timestamp: 1313227559,
       maxReturn: 0.02043188626101,
       value: 11.1835,
       candle: 1308159000,
       direction: -1,
       candlesTillBreakout: 137,
       quotePotential: [Object] } (...) ],
  version: 0,
  points: null,
  lines: 
   [ { x1Date: 1298917800,
       x1Offset: 0,
       x2Date: 1307035800,
       x2Offset: 0,
       y1: 11.254,
       y2: 12.0795,
       type: 1 },
     { x1Date: 1298917800,
       x1Offset: 0,
       x2Date: 1307035800,
       x2Offset: 0,
       y1: 11.254,
       y2: 12.0795,
       type: 2 } (...) ],
  returnExpectation: 0.13586980819958,
  breakoutDirection: -1 }

Comment

var commentStore = require('bg-hive').comment;

commentStore.get(3344565)
    .then(function(comment) {})
    .catch(function(err) {});

Enhancements

Hooray, no enhancements needed!

Instrument

var instrumentStore = require('bg-hive').instrument;

instrumentStore.get(133962)
    .then(function(instrument) {})
    .catch(function(err) {});

Enhancements

Quotations are remapped and often-used fields from quoteSource and currency are merged into a new object. This applies to refQuotation and quotations, which is now a hashmap by quotationId, instead of an array. The original quotation is still available under '_origin'.

Resulting Data Model

{ id: 133962,
  name: 'DAX',
  assetClass: { id: 2, title: 'Index' },
  identifiers: { isin: 'DE0008469008', wkn: '846900' },
  refQuotation: 
   { id: 4,
     name: 'XETRA',
     type: 'last',
     precision: 2,
     currency: 'Pkt',
     _origin: { quoteSource: [Object], currency: [Object] } },
  quotations: 
   { '4': 
      { id: 4,
        name: 'XETRA',
        type: 'last',
        precision: 2,
        currency: 'Pkt',
        _origin: [Object] },
     '22': 
      { id: 22,
        name: 'Lang & Schwarz',
        type: 'last',
        precision: 2,
        currency: 'Pkt',
        _origin: [Object] },
     '57': 
      { id: 57,
        name: 'Deutsche Bank Indikation',
        type: 'last',
        precision: 2,
        currency: 'Pkt',
        _origin: [Object] }
      (...) } }

User

var userStore = require('bg-hive').user;

userStore.get(109369)
    .then(function(user) {})
    .catch(function(err) {});

Enhancements

The user devices are way too unstructured, therefore it will be rewired.

  • Devices are listed in arrays for each device type.
  • A 'target' field is added for each device, which is the resolved 'externalId' (email devices store the Email id as externalId, this will be resolved to the email address string).
  • Solvians is a special case, in that it can only be one solvians device without externalId, thus it is boolean. (solvians should really be a portal entry..)
  • Disabled devices are filtered out
  • Devices with invalid externalId are filtered out The original structure is available under devices._origin.

Resulting Data Model

{ id: 109369,
  domain: 'ad',
  title: 'Herr',
  firstname: 'Thomas',
  lastname: 'Lukacs',
  devices: 
   { portal: 
      [ { id: 181097,
          externalId: '26',
          type: 'portal',
          group: null,
          name: null,
          isEnabled: true,
          target: '26' } ],
     gcm: 
      [ { id: 168078,
          externalId: 'APA91bFGgoPFlpgt7rO38mc7AyW8DjhYda3eB73MPUz6GeUnOV8pk1qzFFSUgCenoI6IaZ1CK0MptRHU9ENMhNGmDhBRR-sZlKSwyWcAEcG3Xz_E_ERdVj0vdqJFVT6dPzOPdf3-cq33',
          type: 'gcm',
          group: 'phone',
          name: 'HTC HTC ONE X',
          isEnabled: true,
          target: 'APA91bFGgoPFlpgt7rO38mc7AyW8DjhYda3eB73MPUz6GeUnOV8pk1qzFFSUgCenoI6IaZ1CK0MptRHU9ENMhNGmDhBRR-sZlKSwyWcAEcG3Xz_E_ERdVj0vdqJFVT6dPzOPdf3-cq33' },
        { id: 167269,
          externalId: 'APA91bGApPnxjNIqeFgZqwaNh-Q5sPeaKQlXGIKXGzMyLJrSmBqyN7RXD6LRpuvok3d6lQjJORx5TY7PKSv6gP0zvWeaM4N55MXCxxC0Plj0tX1zNYk_Jjen-HvVmrZv05cd6KRCEmUW',
          type: 'gcm',
          group: 'phone',
          name: 'GOOGLE NEXUS 6P',
          isEnabled: true,
          target: 'APA91bGApPnxjNIqeFgZqwaNh-Q5sPeaKQlXGIKXGzMyLJrSmBqyN7RXD6LRpuvok3d6lQjJORx5TY7PKSv6gP0zvWeaM4N55MXCxxC0Plj0tX1zNYk_Jjen-HvVmrZv05cd6KRCEmUW' } ],
     email: 
      [ { id: 109572,
          externalId: '89502',
          type: 'email',
          group: null,
          name: null,
          isEnabled: true,
          target: 'thomas.lukacs@boerse-go.de' } ],
     solvians: true,
     _origin: 
      [ { id: 29,
          externalId: '1337',
          type: 'email',
          group: 'desktop',
          name: null,
          isEnabled: true },
        { id: 40416,
          externalId: '1',
          type: 'solvians',
          group: 'desktop',
          name: 'Helloooooo',
          isEnabled: true } (...) ] },
  Emails:
   [ { id: 89502, email: 'thomas.lukacs@boerse-go.de', active: true },
     { id: 46588, email: 'lukacs@boerse-go.de', active: true } ],
  rights: 
   [ 'advertisement.admin',
     'article.read' (...) ] }

Changelog

1.1.1

  • Fix: Beemail api returns rendered template in json

1.1.0

  • Feature: Added Beemail template stores
  • Improvement: Added user.device enhancement