UNPKG

node-hue-api

Version:
120 lines (119 loc) 4.24 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.rulesApi = void 0; const hue_bridge_model_1 = require("@peter-murray/hue-bridge-model"); const RuleIdPlaceholder_1 = require("../../placeholders/RuleIdPlaceholder"); const ApiEndpoint_1 = require("./ApiEndpoint"); const util_1 = require("../../../util"); const ApiError_1 = require("../../../ApiError"); const instanceChecks = hue_bridge_model_1.model.instanceChecks; const RULE_ID_PLACEHOLDER = new RuleIdPlaceholder_1.RuleIdPlaceholder(); const rulesApi = { getAll: new ApiEndpoint_1.ApiEndpoint() .get() .acceptJson() .uri('/<username>/rules') .pureJson() .postProcess(createAllRulesResult), getRule: new ApiEndpoint_1.ApiEndpoint() .get() .acceptJson() .uri('<username>/rules/<id>') .placeholder(RULE_ID_PLACEHOLDER) .pureJson() .postProcess(createGetRuleResult), createRule: new ApiEndpoint_1.ApiEndpoint() .post() .acceptJson() .uri('/<username>/rules') .pureJson() .payload(createRulePayload) .postProcess(getCreateRuleResult), updateRule: new ApiEndpoint_1.ApiEndpoint() .put() .acceptJson() .uri('/<username>/rules/<id>') .placeholder(RULE_ID_PLACEHOLDER) .pureJson() .payload(createRuleUpdatePayload) .postProcess(util_1.extractUpdatedAttributes), deleteRule: new ApiEndpoint_1.ApiEndpoint() .delete() .acceptJson() .uri('/<username>/rules/<id>') .placeholder(RULE_ID_PLACEHOLDER) .pureJson() .postProcess(validateRuleDeletion), }; exports.rulesApi = rulesApi; function createAllRulesResult(result) { let rules = []; Object.keys(result).forEach(function (id) { const rule = hue_bridge_model_1.model.createFromBridge('rule', id, result[id]); rules.push(rule); }); return rules; } function createGetRuleResult(data, requestParameters) { const id = RULE_ID_PLACEHOLDER.getValue(requestParameters); return hue_bridge_model_1.model.createFromBridge('rule', id, data); } function validateRuleDeletion(result) { if (!(0, util_1.wasSuccessful)(result)) { const parsed = (0, util_1.parseErrors)(result); throw new ApiError_1.ApiError(parsed ? parsed.join(', ') : `Unexpected result: ${JSON.stringify(result)}`); } return true; } function createRulePayload(parameters) { const rule = parameters.rule; if (!rule) { throw new ApiError_1.ApiError('No rule provided'); } else if (!instanceChecks.isRuleInstance(rule)) { throw new ApiError_1.ApiError('Must provide a valid Rule object'); } const body = rule.getHuePayload(); validateRulePayloadForBridge(body); return { type: 'application/json', body: body }; } function createRuleUpdatePayload(parameters) { const rule = parameters.rule; if (!rule) { throw new ApiError_1.ApiError('No rule provided'); } else if (!instanceChecks.isRuleInstance(rule)) { throw new ApiError_1.ApiError('Must provide a valid Rule object'); } const hueRule = rule.getHuePayload(), body = { name: hueRule.name, conditions: hueRule.conditions, actions: hueRule.actions }; validateRulePayloadForBridge(body); return { type: 'application/json', body: body }; } function getCreateRuleResult(result) { const hueErrors = (0, util_1.parseErrors)(result); //TODO not sure if this still gets called as the request handles some of this if (hueErrors) { throw new ApiError_1.ApiError(`Error creating rule: ${hueErrors[0].description}`, hueErrors[0]); } return { id: result[0].success.id }; } function validateRulePayloadForBridge(rule) { if (!rule.name) { throw new ApiError_1.ApiError('A name must be provided for the Rule'); } if (!rule.conditions || rule.conditions.length < 1) { throw new ApiError_1.ApiError('A Rule must have at least one condition'); } if (!rule.actions || rule.actions.length < 1) { throw new ApiError_1.ApiError('A Rule must have at least one action'); } }