@constructorfleet/ultimate-govee
Version:
Library for interacting with Govee devices written in Typescript.
115 lines • 6.05 kB
JavaScript
;
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