in source/services/api/registration/lib/registration.js [127:256]
async createRegistration(ticket, registration) {
const {deviceId, deviceName, modelNumber} = registration;
let docClient = new AWS.DynamoDB.DocumentClient(this.dynamoConfig);
let errors = [
'DeviceNotFoundFailure',
'DeviceRegisteredFailure',
'RetrieveReferenceFailure',
'RetrieveRegistrationFailure',
'CreateThingFailure',
'DeviceRollBackFailure'
];
try {
// 1. Checks if the device ID and model number is valid.
let reference = await this._getReference(deviceId, modelNumber);
if (_.isEqual(reference, {})) {
return Promise.reject({
code: 400,
error: 'DeviceNotFoundFailure',
message: `Manufacturer info cannot be found for serial number "${deviceId}" and model number "${
modelNumber}". Please add a model number/serial number that is supported by the manufacturer.`
});
}
let {details} = reference.Item;
// 2. Checks if the device is already registered.
let isDeviceRegistered = await this._isDeviceRegistered(deviceId);
if (isDeviceRegistered) {
return Promise.reject({
code: 500,
error: 'DeviceRegisteredFailure',
message: `Device with serial number "${deviceId}" has been already registered.`
});
}
// 3. Puts an item into the DynamoDB table
let _registration = {
deviceId,
deviceName,
modelNumber,
details,
status: 'pending',
userId: ticket.sub,
createdAt: moment()
.utc()
.format(),
updatedAt: moment()
.utc()
.format(),
};
let params = {
TableName: process.env.REGISTRATION_TBL,
Item: _registration,
};
await docClient.put(params).promise();
// 4. Creates a thing
try {
await this._createThing(_registration);
} catch (err) {
// If error occurs while creating a thing, rollback DynamoDB.
let params = {
TableName: process.env.REGISTRATION_TBL,
Key: {
userId: ticket.sub,
deviceId: deviceId,
}
};
try {
await docClient.delete(params).promise();
} catch (err) {
Logger.error(Logger.levels.INFO, err);
Logger.error(
Logger.levels.INFO,
`[DeviceRollBackFailure] Error occurred while rolling back the device ${deviceId} registration.`
);
return Promise.reject({
code: 500,
error: 'DeviceRollBackFailure',
message: `Error occurred while rolling back the device "${deviceId}" registration.`
});
}
return Promise.reject(err);
}
// Sends anonymous metric data
const anonymousData = process.env.anonymousData;
const solutionId = process.env.solutionId;
const solutionUuid = process.env.solutionUuid;
if (anonymousData === 'true') {
let metric = {
Solution: solutionId,
UUID: solutionUuid,
Timestamp: moment().utc().format('YYYY-MM-DD HH:mm:ss.S'),
Registrations: 1,
};
let usageMetrics = new UsageMetrics();
try {
await usageMetrics.sendAnonymousMetric(metric);
} catch (e) {
Logger.error(Logger.levels.INFO, e);
}
}
return Promise.resolve(_registration);
} catch (err) {
// Handling existing errors
if (errors.indexOf(err.error) > -1) {
return Promise.reject(err);
}
Logger.error(Logger.levels.INFO, err);
Logger.error(
Logger.levels.INFO,
`[RegistrationCreateFailure] Error occurred while attempting to create registration for device ${deviceId}.`
);
return Promise.reject({
code: 500,
error: 'RegistrationCreateFailure',
message: `Error occurred while attempting to create registration for device "${deviceId}".`,
});
}
}