-
Notifications
You must be signed in to change notification settings - Fork 0
/
customerservice.js
198 lines (165 loc) · 7.27 KB
/
customerservice.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
var _ = require('underscore');
var customerFactory = require("mozu-node-sdk/clients/commerce/customer/customerAccount");
var authTicketFactory = require("mozu-node-sdk/clients/commerce/customer/customerAuthTicket");
function CustomerService(context, callback) {
this._context = context;
this._callback = callback;
}
/**
* Get a customer id by Id
*/
CustomerService.prototype.getCustomer = async function(custId) {
console.log('Get Customer: ' + custId);
try {
return await customerClient.getAccount({
accountId: custId
});
} catch (err) {
console.error(JSON.stringify(err));
this._callback(err);
}
};
/**
* Get a list of customer accounts with the given email.
*/
CustomerService.prototype.getCustomersByEmail = async function(email) {
console.log("getCustomerByEmail...email: ", email);
var filterExp = "EmailAddress eq " + email;
var customerClientWithoutUserClaims = customerFactory();
customerClientWithoutUserClaims.context['user-claims'] = null;
try {
const customerList = await customerClientWithoutUserClaims.getAccounts({
filter: filterExp
});
return customerList;
} catch (err) {
console.error(JSON.stringify(err));
this._callback(err);
}
};
/**
* Check to see if the update to the customer account does not have
* duplicate email in another account. If a previous customer account
* exists with the same email address throw a conflict exception
* Otherwise, pass the call through to the service
*/
CustomerService.prototype.updateCustomerCheck = async function(customerAccount) {
console.log("Trace in updateCustomerCheck()");
try {
var customerList = await this.getCustomersByEmail(customerAccount.emailAddress);
console.log("Got a customerList");
if (customerList.items.length === 0) {
console.log("No records found ...continue updating.");
return this._callback();
}
var registeredAccount = _.findWhere(customerList.items, {isAnonymous: false });
var anonymousAccount = _.findWhere(customerList.items, {isAnonymous: true });
console.log("Found existing customer with same email during update.");
if ((registeredAccount && registeredAccount.id != customerAccount.id) || (anonymousAccount && anonymousAccount.id != customerAccount.id)) {
var msg = "Unable to update account. Another customer account exists with the same email.";
console.error(msg);
return this._callback(new Error(msg));
}
console.log("The update is to the same record. Pass it through to get updated.");
this._callback();
} catch (err) {
this._callback(err);
}
};
/**
* We are trying to add a new customer with a login account.
*
* 1. Locate a previous customer account with the same email address
* a. The customer account is anonymous(IsAnonymous = true)
* i. Call AddLoginToExistingCustomer and return the result
* b. The customer account was previously authenticated(IsAnonymous = false)
* i. Throw a conflict exception
* 2. If no previous customer account with the same email address pass the call through to the service
*/
CustomerService.prototype.addLoginOrGetCustomer = async function(customerAuth) {
var customer = customerAuth.account;
console.log("Trace...in addLoginOrGetCustomer");
try {
var customerList = await this.getCustomersByEmail(customer.emailAddress);
console.log("Got a customerList: ");
if (customerList.items.length === 0) {
console.log("No customers exist with the same email...pass through to the api.");
return this._callback();
}
var registeredAccount = _.findWhere(customerList.items, {isAnonymous: false });
if (registeredAccount) {
var msg = "Error: An account with the given email already exists. Please try with a different email or log-in.";
console.error(msg);
return this._callback(new Error(msg));
}
var anonymousAccount = _.findWhere(customerList.items, {isAnonymous: true });
console.log("Found an existing anonymous customer. Upgrading to shopper account");
var newAcctInfo = {
emailAddress: customer.emailAddress,
username: customer.emailAddress,
password: customerAuth.password,
isImport: false
};
var customerClientWithoutUserClaims = customerFactory();
delete customerClientWithoutUserClaims.context['user-claims'];
var authTicketClient = authTicketFactory();
try {
var newAcct = await customerClientWithoutUserClaims.addLoginToExistingCustomer({
accountId: anonymousAccount.id
}, {
body: newAcctInfo
});
console.log("Updated anonymous account to shoppers account");
//get new shopper auth ticket after the account is converted to registered account to be able
//tp associate anon orders to the refistered account.
var authRequest = {
username: customer.emailAddress,
password: customerAuth.password,
}
var authTicket = await authTicketClient.createUserAuthTicket({
},{
body:authRequest
});
this._context.exec.setAuthorized(true);
this._context.response.body = authTicket;
this._context.response.end();
} catch (err) {
console.error(JSON.stringify(err));
this._callback(JSON.stringify(err));
}
} catch (err) {
this._callback(err);
}
};
/**
* This method checks to see if a customer exists with the given email. If it does, do the following:
* 1. If a previous customer account exists with the same email address, throw a conflict exception.
* 2. If the previous customer account is an anonymous user, switch the customer account to the old anonymous user.
* 3. Otherwise, pass the call through to the service.
*/
CustomerService.prototype.addAnonymousOrGetCustomer = async function(customer) {
console.log("Trace...in addAnonymousOrGetCustomer: ", customer);
try {
var customerList = await this.getCustomersByEmail(customer.emailAddress);
if (customerList.items.length === 0) {
console.log("No customers exist with the same email...continue adding record.");
return this._callback();
}
var existingCustomer = _.findWhere(customerList.items, {isAnonymous: true });
var enableAnonymousAndRegistered = this._context.configuration.enableAnonymousAndRegistered;
console.log(enableAnonymousAndRegistered);
if (!existingCustomer && enableAnonymousAndRegistered) {
console.log("Add new anonymous customer");
return this._callback();
}
console.log("Returning the existing anonymous shopper.");
this._context.exec.setAuthorized(true);
this._context.response.body = existingCustomer;
this._context.response.end();
this._callback();
} catch (error) {
console.error("An error occurred", error);
this._callback();
}
};
module.exports = CustomerService;