CRM-15578 - Rename crmMailingAB2 crmMailingAB
[civicrm-core.git] / js / angular-crmMailingAB / services.js
1 (function (angular, $, _) {
2
3 angular.module('crmMailingAB2').factory('crmMailingABCriteria', function () {
4 // TODO Get data from server
5 var values = {
6 '1': {value: '1', name: 'Subject lines', label: ts('Test different "Subject" lines')},
7 '2': {value: '2', name: 'From names', label: ts('Test different "From" lines')},
8 '3': {value: '3', name: 'Two different emails', label: ts('Test entirely different emails')}
9 };
10 return {
11 get: function get(value) {
12 var r = _.where(values, {value: '' + value});
13 return r.length > 0 ? r[0] : null;
14 },
15 getAll: function getAll() {
16 return values;
17 }
18 };
19 });
20
21 // CrmMailingAB is a data-model which combines an AB test (APIv3 "MailingAB"), three mailings (APIv3 "Mailing"),
22 // and three sets of attachments (APIv3 "Attachment").
23 //
24 // example:
25 // var abtest = new CrmMailingAB(123);
26 // abtest.load().then(function(){
27 // alert("Mailing A is named "+abtest.mailings.a.name);
28 // });
29 angular.module('crmMailingAB2').factory('CrmMailingAB', function (crmApi, crmMailingMgr, $q, CrmAttachments) {
30 function CrmMailingAB(id) {
31 this.id = id;
32 this.mailings = {};
33 this.attachments = {};
34 }
35
36 angular.extend(CrmMailingAB.prototype, {
37 // @return Promise CrmMailingAB
38 load: function load() {
39 var crmMailingAB = this;
40 if (!crmMailingAB.id) {
41 crmMailingAB.ab = {
42 name: 'Example', // FIXME
43 mailing_id_a: null,
44 mailing_id_b: null,
45 mailing_id_c: null,
46 domain_id: null,
47 testing_criteria_id: 1, // FIXME
48 winner_criteria_id: null,
49 specific_url: '',
50 declare_winning_time: null,
51 group_percentage: 10
52 };
53 crmMailingAB.mailings.a = crmMailingMgr.create();
54 crmMailingAB.mailings.b = crmMailingMgr.create();
55 crmMailingAB.mailings.c = crmMailingMgr.create();
56 crmMailingAB.attachments.a = new CrmAttachments(function () {
57 return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_a']};
58 });
59 crmMailingAB.attachments.b = new CrmAttachments(function () {
60 return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_b']};
61 });
62 crmMailingAB.attachments.c = new CrmAttachments(function () {
63 return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_c']};
64 });
65
66 var dfr = $q.defer();
67 dfr.resolve(crmMailingAB);
68 return dfr.promise;
69 }
70 else {
71 return crmApi('MailingAB', 'get', {id: crmMailingAB.id})
72 .then(function (abResult) {
73 crmMailingAB.ab = abResult.values[abResult.id];
74 return crmMailingAB._loadMailings();
75 });
76 }
77 },
78 // @return Promise CrmMailingAB
79 save: function save() {
80 var crmMailingAB = this;
81
82 return crmMailingAB._saveMailings()
83 .then(function () {
84 return crmApi('MailingAB', 'create', crmMailingAB.ab)
85 .then(function (abResult) {
86 crmMailingAB.ab.id = abResult.id;
87 });
88 })
89 .then(function () {
90 return crmMailingAB;
91 });
92 },
93 // Load mailings A, B, and C (if available)
94 // @return Promise CrmMailingAB
95 _loadMailings: function _loadMailings() {
96 var crmMailingAB = this;
97 var todos = {};
98 _.each(['a', 'b', 'c'], function (mkey) {
99 if (crmMailingAB.ab['mailing_id_' + mkey]) {
100 todos[mkey] = crmMailingMgr.get(crmMailingAB.ab['mailing_id_' + mkey])
101 .then(function (mailing) {
102 crmMailingAB.mailings[mkey] = mailing;
103 crmMailingAB.attachments[mkey] = new CrmAttachments(function () {
104 return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_' + mkey]};
105 });
106 return crmMailingAB.attachments[mkey].load();
107 });
108 }
109 else {
110 crmMailingAB.mailings[mkey] = crmMailingMgr.create();
111 crmMailingAB.attachments[mkey] = new CrmAttachments(function () {
112 return {entity_table: 'civicrm_mailing', entity_id: crmMailingAB.ab['mailing_id_' + mkey]};
113 });
114 }
115 });
116 return $q.all(todos).then(function () {
117 return crmMailingAB;
118 });
119 },
120 // Save mailings A, B, and C (if available)
121 // @return Promise CrmMailingAB
122 _saveMailings: function _saveMailings() {
123 var crmMailingAB = this;
124 var todos = {};
125 _.each(['a', 'b', 'c'], function (mkey) {
126 if (!crmMailingAB.mailings[mkey]) {
127 return;
128 }
129 if (crmMailingAB.ab['mailing_id_' + mkey]) {
130 // paranoia: in case caller forgot to manage id on mailing
131 crmMailingAB.mailings[mkey].id = crmMailingAB.ab['mailing_id_' + mkey];
132 }
133 todos[mkey] = crmMailingMgr.save(crmMailingAB.mailings[mkey])
134 .then(function () {
135 crmMailingAB.ab['mailing_id_' + mkey] = crmMailingAB.mailings[mkey].id;
136 return crmMailingAB.attachments[mkey].save();
137 });
138 });
139 return $q.all(todos).then(function () {
140 return crmMailingAB;
141 });
142 }
143
144 });
145 return CrmMailingAB;
146 });
147
148 })(angular, CRM.$, CRM._);