UNPKG

@constructorfleet/ultimate-govee

Version:

Library for interacting with Govee devices written in Typescript.

115 lines 6.05 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; var __param = (this && this.__param) || function (paramIndex, decorator) { return function (target, key) { decorator(target, key, paramIndex); } }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var GoveeProductService_1; Object.defineProperty(exports, "__esModule", { value: true }); exports.GoveeProductService = void 0; const common_1 = require("@nestjs/common"); const class_transformer_1 = require("class-transformer"); const _ultimate_govee_persist_1 = require("../../../persist"); const govee_product_config_1 = require("./govee-product.config"); const utils_1 = require("../../utils"); const sku_list_response_1 = require("./models/sku-list.response"); const categories_json_1 = __importDefault(require("./assets/categories.json")); const path_1 = require("path"); const semaphore_async_await_1 = __importDefault(require("semaphore-async-await")); const moment_1 = __importDefault(require("moment")); let GoveeProductService = GoveeProductService_1 = class GoveeProductService { constructor(config, persistedProducts) { this.config = config; this.persistedProducts = persistedProducts; this.logger = new common_1.Logger(GoveeProductService_1.name); this.lock = new semaphore_async_await_1.default(1); this.lastUpdate = undefined; if (persistedProducts === undefined) { persistedProducts = {}; } Object.entries(GoveeProductService_1.previousProductMap).forEach(([key, value]) => { persistedProducts[key] = persistedProducts[key] ?? value; }); GoveeProductService_1.previousProductMap = persistedProducts; } async getProductCategories() { await this.lock.acquire(); this.logger.log(`Last Update: ${this.lastUpdate} isAfter? ${this.lastUpdate !== undefined ? this.lastUpdate.add(1, 'hour').isAfter((0, moment_1.default)()) : 'false'}`); try { if (this.lastUpdate !== undefined && this.lastUpdate.add(1, 'hour').isAfter((0, moment_1.default)())) { this.logger.debug('Updated within last hour, using previous result.'); return GoveeProductService_1.previousProductMap; } this.logger.debug('Retrieving product list from Govee REST API'); const productMap = GoveeProductService_1.parseResponse(await this.getApiReponse()); Object.entries(GoveeProductService_1.previousProductMap).forEach(([key, value]) => { productMap[key] = productMap[key] ?? value; }); GoveeProductService_1.previousProductMap = productMap; this.lastUpdate = (0, moment_1.default)(); return productMap; } catch (error) { this.logger.error('Error retrieving product list', error); return GoveeProductService_1.previousProductMap; } finally { this.lock.release(); } } async getApiReponse() { const response = await (0, utils_1.request)(this.config.skuListUrl, { accept: 'application/json', }).get(sku_list_response_1.SkuListResponse, (0, path_1.join)(_ultimate_govee_persist_1.PersistModule.persistRootDirectory, 'govee.products.raw.json')); return response.data; } static parseResponse(response) { const { categories } = response; return categories.reduce((productMap, category) => { category.groups.forEach((group) => { group.models.forEach((model) => { model.products.forEach((product) => { productMap[product.model] = { category: category.name, categoryId: category.id, group: group.name, groupId: group.id, modelName: model.modelName, skuUrl: product.skuUrl, iconUrl: model.iconUrl, ic: product.ic, goodsType: product.goodsType, }; }); }); }); return productMap; }, {}); } }; exports.GoveeProductService = GoveeProductService; GoveeProductService.previousProductMap = GoveeProductService_1.parseResponse((0, class_transformer_1.plainToInstance)(sku_list_response_1.SkuListResponse, categories_json_1.default ?? {})); __decorate([ (0, _ultimate_govee_persist_1.PersistResult)({ filename: 'govee.products.json' }), __metadata("design:type", Function), __metadata("design:paramtypes", []), __metadata("design:returntype", Promise) ], GoveeProductService.prototype, "getProductCategories", null); exports.GoveeProductService = GoveeProductService = GoveeProductService_1 = __decorate([ (0, common_1.Injectable)(), __param(0, (0, common_1.Inject)(govee_product_config_1.GoveeProductConfig.KEY)), __param(1, (0, _ultimate_govee_persist_1.InjectPersisted)({ filename: 'govee.products.json' })), __metadata("design:paramtypes", [void 0, Object]) ], GoveeProductService); //# sourceMappingURL=govee-product.service.js.map