newscoop/JS-Scoopwriter

View on GitHub
app/scripts/services/SnippetTemplate.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict';

/**
* A factory which creates a snippet template model.
*
* @class SnippetTemplate
*/
angular.module('authoringEnvironmentApp').factory('SnippetTemplate', [
    '$http',
    '$q',
    function ($http, $q) {
        var self = this,
            SnippetTemplate = function () {};  // snippet template constructor

        /**
        * Creates a new SnippetTemplate instance from a plain data object.
        *
        * @method createFromApiData
        * @param data {Object} plain object containing snippet template data
        *   (as returned by API)
        * @return {Object} new SnippetTemplate instance
        */
        self.createFromApiData = function (data) {
            var template = new SnippetTemplate();

            ['id', 'name', 'enabled', 'favourite'].forEach(function (attr) {
                template[attr] = data[attr];
            });

            template.fields = [];

            _.forEach(data.fields, function (field, name) {
                if (field.scope !== 'frontend') {
                    return;  // skip internal Newscoop fields
                } else {
                    // hard code default values, just until these can
                    // be moved to the plugin editor dialog
                    field.default = '';
                    switch(template.name) {
                        case 'Embed.ly':
                            if (field.name === 'maxwidth') {
                                field.default = '560';
                            }
                            break;
                        case 'Youtube':
                            if (field.name === 'width') {
                                field.default = '560';
                            }
                            if (field.name === 'height') {
                                field.default = '315';
                            }
                            break;
                    }
                    template.fields.push(angular.copy(field));
                }
            });

            return template;
        };

        /**
        * Retrieves a list of all snippet templates.
        * Returned array has a special $promise property which is resolved or
        * rejected depending on the server response.
        *
        * @method getAll
        * @return {Object} "future" array of SnippetTemplate objects -
        *   initially an empty array is returned, which is later populated with
        *   the actual data (once the http promise has been successfully
        *   resolved)
        */
        SnippetTemplate.getAll = function () {
            var deferredGet = $q.defer(),
                templates = [];

            templates.$promise = deferredGet.promise;

            $http.get(
                Routing.generate(
                    'newscoop_gimme_snippettemplates_getsnippettemplates',
                    {},
                    true
                ),
                {params: {items_per_page: 99999}}  // de facto "all"
            ).success(function (response) {
                response.items.forEach(function (item) {
                    item = self.createFromApiData(item);
                    templates.push(item);
                });
                deferredGet.resolve();
            }).error(function (responseBody) {
                deferredGet.reject(responseBody);
            });

            return templates;
        };

        // expose as "class" method
        SnippetTemplate.createFromApiData = self.createFromApiData;

        return SnippetTemplate;
    }
]);