open-nomad/ui/app/serializers/recommendation-summary.js

92 lines
2.6 KiB
JavaScript
Raw Normal View History

import ApplicationSerializer from './application';
import classic from 'ember-classic-decorator';
/*
Theres no grouping of recommendations on the server, so this
processes a list of recommendations and groups them by task
group.
*/
@classic
export default class RecommendationSummarySerializer extends ApplicationSerializer {
normalizeArrayResponse(store, modelClass, payload) {
const recommendationSerializer = store.serializerFor('recommendation');
const RecommendationModel = store.modelFor('recommendation');
const slugToSummaryObject = {};
const allRecommendations = [];
payload.forEach(recommendationHash => {
const slug = `${JSON.stringify([recommendationHash.JobID, recommendationHash.Namespace])}/${
recommendationHash.Group
}`;
if (!slugToSummaryObject[slug]) {
slugToSummaryObject[slug] = {
attributes: {
jobId: recommendationHash.JobID,
jobNamespace: recommendationHash.Namespace,
taskGroupName: recommendationHash.Group,
},
recommendations: [],
};
}
slugToSummaryObject[slug].recommendations.push(recommendationHash);
allRecommendations.push(recommendationHash);
});
return {
data: Object.values(slugToSummaryObject).map(summaryObject => {
const latest = Math.max(...summaryObject.recommendations.mapBy('SubmitTime'));
return {
type: 'recommendation-summary',
id: summaryObject.recommendations
.mapBy('ID')
.sort()
.join('-'),
attributes: {
...summaryObject.attributes,
submitTime: new Date(Math.floor(latest / 1000000)),
},
relationships: {
job: {
data: {
type: 'job',
id: JSON.stringify([
summaryObject.attributes.jobId,
summaryObject.attributes.jobNamespace,
]),
},
},
recommendations: {
data: summaryObject.recommendations.map(r => {
return {
type: 'recommendation',
id: r.ID,
};
}),
},
},
};
}),
included: allRecommendations.map(
recommendationHash =>
recommendationSerializer.normalize(RecommendationModel, recommendationHash).data
),
};
}
normalizeUpdateRecordResponse(store, primaryModelClass, payload, id) {
return {
data: {
id,
attributes: {
isProcessed: true,
},
},
};
}
}