92 lines
2.6 KiB
JavaScript
92 lines
2.6 KiB
JavaScript
|
import ApplicationSerializer from './application';
|
|||
|
import classic from 'ember-classic-decorator';
|
|||
|
|
|||
|
/*
|
|||
|
There’s 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,
|
|||
|
},
|
|||
|
},
|
|||
|
};
|
|||
|
}
|
|||
|
}
|