Transform keys of incoming legacy logs

pull/766/head
Rick Carlino 2018-04-01 13:20:10 -05:00
parent 93ff7ee770
commit ca0cde6f84
7 changed files with 38 additions and 14 deletions

View File

@ -21,6 +21,7 @@ class Device < ApplicationRecord
has_many :sensor_readings, dependent: :destroy
has_many :device_configs, dependent: :destroy
has_many :pin_bindings, dependent: :destroy
has_many :token_issuances, dependent: :destroy
validates_presence_of :name
validates :timezone,
inclusion: { in: TIMEZONES, message: BAD_TZ, allow_nil: true }

View File

@ -18,6 +18,7 @@ class Log < ApplicationRecord
belongs_to :device
validates :device, presence: true
validates :type, presence: true
serialize :meta
validates :meta, presence: true
# http://stackoverflow.com/a/5127684/1064917

View File

@ -28,7 +28,7 @@ module Logs
#
# TODO: Make the fields below mandadtory (allowing nil in some cases, but
# always requiring the key) and delete the `meta` field.
string :type, in: Log::TYPES
string :type, in: Log::TYPES
integer :x
integer :y
integer :z
@ -51,7 +51,17 @@ module Logs
end
def validate
@log = Log.new(inputs.except(:meta).merge(temporary_stub))
@log = Log.new
@log.device = device
@log.message = message
@log.channels = channels || []
@log.x = transitional_field(:x)
@log.y = transitional_field(:y)
@log.z = transitional_field(:z)
@log.verbosity = transitional_field(:verbosity)
@log.major_version = transitional_field(:major_version)
@log.minor_version = transitional_field(:minor_version)
@log.type = transitional_field(:type)
@log.validate!
add_error :log, :private, BAD_WORDS if has_bad_words
end
@ -66,17 +76,9 @@ module Logs
!!inputs[:message].upcase.match(BLACKLIST)
end
# We won't need this after `meta` field removal.
def temporary_stub
{
x: meta[:x],
y: meta[:y],
z: meta[:z],
verbosity: meta[:verbosity],
major_version: meta[:major_version],
minor_version: meta[:minor_version],
type: meta[:type]
}
# Helper for dealing with the gradual removal of the meta field.
def transitional_field(name, default = nil)
return inputs[name] || meta[name] || meta[name.to_s] || default
end
end
end

View File

@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord::Schema.define(version: 20180331183559) do
ActiveRecord::Schema.define(version: 20180401141611) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"

View File

@ -1,4 +1,5 @@
unless Rails.env == "production"
TokenIssuance.destroy_all
PinBinding.destroy_all
User.destroy_all
Device.destroy_all

View File

@ -24,6 +24,8 @@ import { talk } from "browser-speech";
import { getWebAppConfigValue } from "../config_storage/actions";
import { BooleanSetting } from "../session_keys";
import { versionOK } from "../util";
import * as _ from "lodash";
export const TITLE = "New message from bot";
const THROTTLE_MS = 600;
/** TODO: This ought to be stored in Redux. It is here because of historical
@ -124,9 +126,24 @@ type Client = { connected?: boolean };
export const onSent = (client: Client) => () => !!client.connected ?
dispatchNetworkUp("user.mqtt") : dispatchNetworkDown("user.mqtt");
const LEGACY_META_KEY_NAMES: (keyof Log)[] = [
"type",
"x",
"y",
"z",
"verbosity",
"major_version",
"minor_version"
];
function legacyKeyTransformation(log: Log, key: keyof Log) {
log[key] = log[key] || _.get(log, ["meta", key], undefined);
}
export const onLogs = (dispatch: Function, getState: GetState) => throttle((msg: Log) => {
bothUp();
if (isLog(msg)) {
LEGACY_META_KEY_NAMES.map(key => legacyKeyTransformation(msg, key));
actOnChannelName(msg, "toast", showLogOnScreen);
actOnChannelName(msg, "espeak", speakLogAloud(getState));
dispatch(initLog(msg));

View File

@ -45,6 +45,8 @@ export interface Log {
y?: number;
z?: number;
verbosity?: number;
major_version?: number;
minor_version?: number;
channels: string[];
created_at: number;
}