cms/app-client/app/serializers/transcript.js
author Chloe Laisne <chloe.laisne@gmail.com>
Tue, 23 Aug 2016 00:32:11 +0200
changeset 258 12c694392e8e
parent 257 eba9edbd8f46
child 264 e0fc9f698b9b
permissions -rw-r--r--
Add topic to transcript

import JSONAPISerializer from 'ember-data/serializers/json-api';

export default JSONAPISerializer.extend({

    normalizeResponse: function(store, primaryModelClass, payload, id) {
        var speakers = payload['resources'].find(resource => resource['id'] === 'speakers');
        var topics = payload['resources'].find(resource => resource['id'] === 'topics');
        var translationISO = false;

        var buildFragment = function(annotation) {
            var fragment = {
                'original': annotation['content']['data']['content']
            };
            if(annotation['content']['data']['transl']) {
                fragment['translation'] = annotation['content']['data']['transl']['@value'];
            }
            if(annotation['content']['data']['words']) {
                var words = [];
                annotation['content']['data']['words'].forEach(function(word) {
                    words.push({
                        'original': word['content'],
                        'translation': word['transl']['@value']
                    });
                });
                fragment['literal'] = words;
            }
            if(annotation['content']['data']['speaker']) {
                if(typeof annotation['content']['data']['speaker'] === 'object') {
                    var speaker = speakers['content']['data'].find(speaker => speaker['id'] === annotation['content']['data']['speaker']['id-ref']);
                    if(speaker) {
                        fragment['speaker'] = speaker['name'];
                    }
                } else {
                    fragment['speaker'] = annotation['content']['data']['speaker'];
                }
            }
            return fragment;
        };

        var annotations = [];
        payload['annotations'].forEach(function(annotation) {
            var previous = annotations[annotations.length - 1];
            if(previous && annotation['begin'] === previous.begin && annotation['end'] === previous.end) {
                previous.fragments.push(buildFragment(annotation));
            } else {
                var object = {
                    'fragments': [buildFragment(annotation)],
                    'begin': annotation['begin'],
                    'end': annotation['end'],
                };
                annotations.push(object);
            }
            if(!translationISO && annotation['content']['data']['transl']) {
                translationISO = annotation['content']['data']['transl']['@language'];    
            }
        });

        if(payload['annotation-types'].length) {
            var types = [];
            payload['annotation-types'].forEach(function(t) {
                var object = {
                    'title': t['dc:title'],
                    'begin': t['corpus:begin'],
                    'end': t['corpus:end']
                };
                var fragments = annotations.find(function(annotation) { return annotation['begin'] === t['corpus:begin'] && annotation['end'] === t['corpus:end']; });
                if(fragments) {
                    object['fragments'] = fragments['fragments'];
                }
                types.push(object);
            });
            annotations = types;
        }

        if(payload['lists'].length) {
            var sections = [];
            var lists = [];
            payload['lists'].forEach(function(list) {
                var topic = topics['content']['data'].find(topic => topic.id === list['meta']['corpus:topic']['id-ref']);
                sections.push({
                    'title': topic['desc'],
                    'begin': list['meta']['corpus:begin'],
                    'end': list['meta']['corpus:end']
                });
                lists.push(annotations.filter(annotation => annotation['begin'] >= list['meta']['corpus:begin'] && annotation['end'] <= list['meta']['corpus:end']));
            });
            annotations = lists;
            console.log(sections);
        } else {
            annotations = [annotations];
        }

        var response = {
            'data': {
                'id': id,
                'type': 'transcript',
                'attributes': {
                    'title': {},
                    'annotations': annotations
                }
            }
        };

        if(sections) {
            response.data.attributes.sections = sections;
        }

        if(Array.isArray(payload['meta']['dc:title'])) {
            var original = payload['meta']['dc:title'].find(function(title) { return title['@language'] !== translationISO; });
            if(original) {
                response.data.attributes.title.original = original['@value'];
            }
            var translation = payload['meta']['dc:title'].find(function(title) { return title['@language'] === translationISO; });
            if(translation) {
                response.data.attributes.title.translation = translation['@value'];
            }            
        } else {
            response.data.attributes.title.original = payload['meta']['dc:title']['@value'];
        }


        return response;
    }

});