ih-portal
Version:
A project for connecting interaction hub services with catalyst-ui components
134 lines (114 loc) • 4.99 kB
JavaScript
import jsonQuery from 'json-query';
/**
* This needs to be moved somewhere else...maybe into black lion?
* Seems like we should be modeling the data somewhere other than the view.
*/
export default class ProfileViewModel {
constructor() {
this.fullName = '';
this.email = 'N/A';
this.mNumber = '';
this.sixPlusTwo = 'N/A';
this.picture = require('./nophoto.png');
this.cellPhone = 'N/A';
this.homePhone = 'N/A';
this.currentAddress = null;
this.permanentAddress = null;
}
/**
* Convert data models from web services into a view model.
* @param {object} profileData profile data.
* @param {object} pictureData picture/avatar data.
* @return {object} a view model tailored for the view.
*/
static toViewModel(profileData, pictureData) {
const viewModel = new ProfileViewModel();
const validValue = (value) => {
return value ? value : 'N/A';
};
if (!profileData || !profileData.sccGetconstResp || !profileData.sccGetconstResp.constituent) {
return viewModel;
}
const dataModel = this.profileModelMapping(profileData);
viewModel.currentAddress = jsonQuery('addresses[addressType=MAIL]', { data: dataModel }).value;
viewModel.permanentAddress = jsonQuery('addresses[addressType=PERM]', { data: dataModel }).value;
viewModel.cellPhone = validValue(jsonQuery('phones.perphone[phoneType=CELL].phone', { data: dataModel }).value);
viewModel.homePhone = validValue(jsonQuery('phones.perphone[phoneType=HOME].phone', { data: dataModel }).value);
if (pictureData && pictureData.src) {
viewModel.picture = 'data:image/png;base64, ' + pictureData.src;
}
viewModel.fullName = validValue(jsonQuery( 'perNames.perName[0].name', {data: dataModel}).value);
viewModel.email = validValue(jsonQuery( 'emailAddresses.emailAddress[eAddrType=CAMP].emailAddr', {data: dataModel}).value);
viewModel.mNumber = validValue(jsonQuery( 'externalSystemKeys.externalSystemKey[externalSystem=UID].externalSystems.externalSys.externalSystemId', {data: dataModel}).value);
viewModel.sixPlusTwo = validValue(jsonQuery( 'usernameId', {data: dataModel}).value);
return viewModel;
}
/**
* Converting some properties to lists.
* @param {object} profileData profile data from service operation/web service.
* @return {object} new data model.
*/
static profileModelMapping(profileData) {
const model = profileData.sccGetconstResp.constituent;
//Sort the addresses by effective date and filter out addresses with effective dates in the future
if (model.addresses.address) {
if(Array.isArray(model.addresses.address)){
model.addresses = model.addresses.address
.sort((a, b) => {
return new Date(b.effdt) - new Date(a.effdt);
})
.filter((item)=>
Date.parse(item.effdt) <= new Date()
);
} else {
model.addresses = [model.addresses.address];
}
}
if (model.phones.perphone && !Array.isArray(model.phones.perphone)) {
model.phones.perphone = [model.phones.perphone];
}
if (model.perNames.perName && !Array.isArray(model.perNames.perName)) {
model.perNames.perName = [model.perNames.perName];
} else if (model.perNames.perName && Array.isArray(model.perNames.perName)){
model.perNames.perName = model.perNames.perName
.sort((a, b) => {
return new Date(b.effdt) - new Date(a.effdt);
})
.filter((item)=>
Date.parse(item.effdt) <= new Date() && item.nameType === 'PRF'
);
}
if (model.emailAddresses.emailAddress && !Array.isArray(model.emailAddresses.emailAddress)) {
model.emailAddresses.emailAddress = [model.emailAddresses.emailAddress];
}
if (model.externalSystemKeys.externalSystemKey && !Array.isArray(model.externalSystemKeys.externalSystemKey)) {
model.usernameId = [model.externalSystemKeys.externalSystemKey.externalSystemId];
} else if (model.externalSystemKeys.externalSystemKey && Array.isArray(model.externalSystemKeys.externalSystemKey)){
let username = model.externalSystemKeys.externalSystemKey
.filter((item)=>
item.externalSystem === 'U62'
);
if (Array.isArray(username) && username.length === 1){
username = username[0];
if(username.externalSystems.externalSys){
if(Array.isArray(username.externalSystems.externalSys)){
username = username.externalSystems.externalSys
.sort((a, b) => {
return new Date(b.effdt) - new Date(a.effdt) ;
})
.filter((item)=>
Date.parse(item.effdt) <= new Date()
);
if (username.length > 1) {
username = username[0];
}
} else {
username = username.externalSystems.externalSys;
}
}
}
model.usernameId = username.externalSystemId;
}
return model;
}
}