component-dbs-core
Version:
DTO objects shared among device backend
208 lines • 10.9 kB
JavaScript
"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 __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DeviceService = void 0;
const common_1 = require("@nestjs/common");
const uuid_1 = require("uuid");
const graphql_tag_1 = __importDefault(require("graphql-tag"));
const deviceMetrics_1 = require("./deviceMetrics");
const config_1 = require("../common_services/config");
const deviceVerification_1 = require("./deviceVerification");
const deviceDb_1 = require("./deviceDb");
const common_services_1 = require("../common_services");
const common_interfaces_1 = require("../common_interfaces");
const deviceUtils_1 = require("./deviceUtils");
let DeviceService = class DeviceService extends common_interfaces_1.UpdateEventPublisher {
constructor(dynamodbService, envService, deviceMetrics, deviceVerify, appsyncClient) {
super(appsyncClient, (deviceUuid) => this.getDeviceStatus(deviceUuid));
this.dynamodbService = dynamodbService;
this.envService = envService;
this.deviceMetrics = deviceMetrics;
this.deviceVerify = deviceVerify;
this.appsyncClient = appsyncClient;
this.getDeviceUuid = (event) => __awaiter(this, void 0, void 0, function* () {
try {
console.log('device service: getDeviceUuid:', event);
const { model, serial } = event;
const response = yield this.deviceDb.getDeviceByModelSerial(model, serial);
if (response.Items && response.Items.length > 0) {
const item = response.Items[0];
return Promise.resolve({
id: item.id,
model: item.model,
serial: item.serial,
});
}
console.log(`Device ${model}, ${serial} doesnt exist, create new uuid.`);
const id = uuid_1.v4();
yield this.deviceDb.saveDeviceUuid(model, serial, id);
return Promise.resolve({ id, model, serial });
}
catch (err) {
console.error(err);
throw err;
}
});
this.getDeviceMetrics = (deviceUuid, type) => this.deviceMetrics.getDeviceMetrics(deviceUuid, type);
this.createDeviceMetrics = (input) => __awaiter(this, void 0, void 0, function* () { return this.deviceMetrics.createDeviceMetrics(input); });
this.saveDeviceRecord = (deviceUuid, type, data) => __awaiter(this, void 0, void 0, function* () {
const valid = yield this.deviceVerify.isDeviceUuidValid(deviceUuid);
if (!valid) {
console.error('Device uuid not found ', deviceUuid);
throw new Error(`Device uuid not found ${deviceUuid}`);
}
yield this.deviceDb.updateDeviceRecord(deviceUuid, type, data);
});
this.saveDeviceTokens = (deviceUuid, accessToken, refreshToken, idToken) => __awaiter(this, void 0, void 0, function* () {
const status = "ACTIVE" /* ACTIVE */;
yield this.saveDeviceRecord(deviceUuid, "core" /* core */, {
accessToken,
refreshToken,
idToken,
status,
});
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, {
status,
});
// TODO: use a single hardcoded entityUuid fow now, it will be replaced later
const entityUuid = '1b1404d7-5c2b-4a14-bf9e-8bdc494e7234';
yield this.saveDeviceRecord(deviceUuid, "core" /* core */, { entityUuid });
});
this.saveDevicePhone = (deviceUuid, phone) => __awaiter(this, void 0, void 0, function* () {
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, { phone });
});
this.saveDevicePin = (deviceUuid, pin) => __awaiter(this, void 0, void 0, function* () {
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, { pin });
});
this.saveEntity = (deviceUuid, entityUuid) => __awaiter(this, void 0, void 0, function* () {
yield this.saveDeviceRecord(deviceUuid, "core" /* core */, { entityUuid });
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, {
entityUuid,
});
});
this.saveSite = (deviceUuid, siteUuid) => __awaiter(this, void 0, void 0, function* () {
yield this.saveDeviceRecord(deviceUuid, "core" /* core */, { siteUuid });
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, { siteUuid });
});
this.getEntityUuidByAccessToken = (accessToken) => __awaiter(this, void 0, void 0, function* () {
const output = yield this.deviceDb.findEntityUuidByAccessToken(accessToken);
if (typeof output.Items !== 'undefined' && output.Items.length > 0) {
const { entityUuid } = output.Items[0];
if (entityUuid) {
return entityUuid;
}
}
throw new Error('Invalid access token.');
});
this.getRefreshTokenByUuid = (deviceUuid) => __awaiter(this, void 0, void 0, function* () {
const output = yield this.deviceDb.getDeviceByUuid(deviceUuid);
if (typeof output.Items !== 'undefined' && output.Items.length > 0) {
const { refreshToken } = output.Items[0];
if (refreshToken) {
return refreshToken;
}
}
throw new Error('getRefreshTokenByUuid: Invalid deviceUuid.');
});
this.deactivateDevice = (deviceUuid) => __awaiter(this, void 0, void 0, function* () {
const status = 'INACTIVE';
const accessToken = status;
const refreshToken = status;
const idToken = status;
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, {
status,
});
yield this.saveDeviceRecord(deviceUuid, "core" /* core */, {
status,
accessToken,
refreshToken,
idToken,
});
});
this.getDeviceStatus = (deviceUuid) => __awaiter(this, void 0, void 0, function* () {
const device = yield this.deviceDb.getDeviceByUuid(deviceUuid);
if (device.Items && device.Items.length > 0) {
return device.Items[0].status;
}
throw new Error(`Invalid device uuid ${deviceUuid}`);
});
this.saveDeviceStatus = (deviceUuid, status) => __awaiter(this, void 0, void 0, function* () {
yield this.saveDeviceRecord(deviceUuid, "core" /* core */, { status });
yield this.saveDeviceRecord(deviceUuid, "settings" /* settings */, { status });
});
this.updateDeviceSettings = (deviceSettings) => __awaiter(this, void 0, void 0, function* () {
const deviceUuid = deviceSettings.id;
const settings = Object.assign({}, deviceSettings);
delete settings.id;
try {
yield this.deviceDb.updateDeviceRecord(deviceUuid, "settings" /* settings */, settings);
return true;
}
catch (error) {
console.error(error);
return false;
}
});
this.getDeviceSettings = (deviceUuid) => __awaiter(this, void 0, void 0, function* () {
const device = yield this.deviceDb.getDeviceRecordByType(deviceUuid, "settings" /* settings */);
if (device.Items && device.Items.length > 0) {
return device.Items[0];
}
throw new Error(`Invalid device uuid ${deviceUuid}`);
});
this.onDeviceSettingsStream = (event) => __awaiter(this, void 0, void 0, function* () {
console.info('device settings stream event:', JSON.stringify(event));
yield this.publishUpdateEventToSubscribers(event, deviceUtils_1.convertDbStreamToSettings);
});
this.onDeviceSettingsUpdate = (accessToken) => __awaiter(this, void 0, void 0, function* () {
yield this.deviceVerify.checkAccessToken(accessToken);
});
this.deviceDb = new deviceDb_1.DeviceDb(this.envService.deviceTableName, this.envService.modelSerialGsi, this.dynamodbService.documentClient, this.envService.accessTokenGsi);
}
prepareUpdateEventRequest(item, keys) {
return {
mutation: graphql_tag_1.default `
mutation PublishDeviceSettingsUpdate(
$item: DeviceSettingsInput!
) {
publishDeviceSettingsUpdateEvent(deviceSettings: $item) {
${keys}
}
}
`,
variables: {
item,
},
};
}
};
DeviceService = __decorate([
common_1.Injectable(),
__metadata("design:paramtypes", [common_services_1.DynamodbService,
config_1.EnvironmentService,
deviceMetrics_1.DeviceMetrics,
deviceVerification_1.DeviceVerification,
common_services_1.AppSyncClient])
], DeviceService);
exports.DeviceService = DeviceService;
//# sourceMappingURL=deviceService.js.map