1// AEM refresh note: branch JS/CSS sync for issue-366-429. 2import { 3 API_ACCOUNT, 4 WYVERN_PROXY_PATH, 5 WYVERN_PROXY_PRODUCTION_URL, 6 WYVERN_USE_SAME_ORIGIN_PROXY, 7} from './constants.js'; 8import { buildApiUrl } from './wyvern-crypto.js'; 9 10let token = localStorage.getItem('apiToken'); 11 12function paramsToObject(urlSearchParams) { 13 return Object.fromEntries(urlSearchParams.entries()); 14} 15 16/** Worker route exists on www.crn.com only; dev/preview hosts call the production proxy. */ 17function getWyvernProxyUrl() { 18 if (typeof window === 'undefined' || !window.location) { 19 return WYVERN_PROXY_PRODUCTION_URL; 20 } 21 const hostname = window.location.hostname.toLowerCase(); 22 if (hostname === 'www.crn.com' || hostname === 'crn.com') { 23 return WYVERN_PROXY_PATH; 24 } 25 if ( 26 hostname === 'localhost' 27 || hostname === '127.0.0.1' 28 || hostname.endsWith('.aem.page') 29 || hostname.endsWith('.aem.live') 30 ) { 31 return WYVERN_PROXY_PRODUCTION_URL; 32 } 33 return WYVERN_PROXY_PATH; 34} 35 36async function fetchWyvern(urlSearchParams) { 37 if (WYVERN_USE_SAME_ORIGIN_PROXY) { 38 const response = await fetch(getWyvernProxyUrl(), { 39 method: 'POST', 40 headers: { 'Content-Type': 'application/json' }, 41 body: JSON.stringify({ params: paramsToObject(urlSearchParams) }), 42 }); 43 if (!response.ok) { 44 let message = `Wyvern proxy error (${response.status})`; 45 try { 46 const err = await response.json(); 47 if (err?.error) message = err.error; 48 } catch { 49 // ignore non-JSON error bodies 50 } 51 throw new Error(message); 52 } 53 return response.json(); 54 } 55 56 const apiUrl = await buildApiUrl(urlSearchParams); 57 const request = await fetch(apiUrl); 58 return request.json(); 59} 60 61export async function performApiLoginRequest(urlSearchParams) { 62 try { 63 const response = await fetchWyvern(urlSearchParams); 64 65 if (Object.prototype.hasOwnProperty.call(response, 'ErrorMessage') && response.ErrorMessage !== '') { 66 return Promise.reject(response.ErrorMessage); 67 } 68 69 if (Object.prototype.hasOwnProperty.call(response, 'JsonData') && response.JsonData !== '') { 70 return Promise.resolve(JSON.parse(response?.JsonData)); 71 } 72 73 return Promise.resolve(response.Message); 74 } catch (e) { 75 return Promise.reject(e.message); 76 } 77} 78 79export async function performApiRequest(urlSearchParams) { 80 try { 81 const response = await fetchWyvern(urlSearchParams); 82 83 const hasErr = Object.prototype.hasOwnProperty.call(response, 'ErrorMessage'); 84 if (response.Status !== 1 || (hasErr && response.ErrorMessage !== '')) { 85 return Promise.reject(response.ErrorMessage || response.Message || 'Unknown error'); 86 } 87 88 let result; 89 if (Object.prototype.hasOwnProperty.call(response, 'JsonData') && response.JsonData !== '') { 90 result = JSON.parse(response.JsonData); 91 } else { 92 result = response.Message; 93 } 94 95 if (response.Token) { 96 token = response.Token; 97 localStorage.setItem('apiToken', token); 98 } 99 return Promise.resolve({ result, token }); 100 } catch (e) { 101 return Promise.reject(e.message); 102 } 103} 104 105export async function login(username, password) { 106 const urlSearchParams = new URLSearchParams(); 107 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 108 urlSearchParams.append('ReturnDataType', '1'); 109 urlSearchParams.append('WyvernApiActionType', 'Membership'); 110 urlSearchParams.append('WyvernApiAction', 'UserLogin'); 111 urlSearchParams.append('WyvernApiGetAction', 'False'); 112 urlSearchParams.append('User_LoginName', username); 113 urlSearchParams.append('User_Password', password); 114 115 return performApiLoginRequest(urlSearchParams); 116} 117 118export async function register(username, password) { 119 const urlSearchParams = new URLSearchParams(); 120 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 121 urlSearchParams.append('ReturnDataType', '1'); 122 urlSearchParams.append('WyvernApiActionType', 'Membership'); 123 urlSearchParams.append('WyvernApiAction', 'ContactCreateDemo'); 124 urlSearchParams.append('WyvernApiGetAction', 'False'); 125 urlSearchParams.append('ContactAPI_Email', username); 126 urlSearchParams.append('User_Password', password); 127 urlSearchParams.append('ContactAPI_Forename', 'Foo'); 128 urlSearchParams.append('ContactAPI_Surname', 'Bar'); 129 urlSearchParams.append('UserAPIValidate_ValidationSet', 'False'); 130 urlSearchParams.append('ContactAPIValidate_ValidationSet', 'False'); 131 132 return performApiLoginRequest(urlSearchParams); 133} 134 135export async function getUser(userId) { 136 const urlSearchParams = new URLSearchParams(); 137 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 138 urlSearchParams.append('ReturnDataType', '1'); 139 urlSearchParams.append('WyvernApiAction', 'ContactGet'); 140 urlSearchParams.append('ContactAPI_ContactID', userId); 141 urlSearchParams.append('WyvernApiActionType', 'Membership'); 142 urlSearchParams.append('ContactTypeID', '0'); 143 return performApiLoginRequest(urlSearchParams); 144} 145 146export async function getUserSubscriptions(userId) { 147 const urlSearchParams = new URLSearchParams(); 148 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 149 urlSearchParams.append('ReturnDataType', '1'); 150 urlSearchParams.append('WyvernApiAction', 'ContactSubscriptionGet'); 151 urlSearchParams.append('Subscription_ContactID', userId); 152 urlSearchParams.append('WyvernApiActionType', 'Membership'); 153 urlSearchParams.append('ContactTypeID', '0'); 154 return performApiLoginRequest(urlSearchParams); 155} 156 157export async function cancelUserSubscription(subscriptionLinkId) { 158 const urlSearchParams = new URLSearchParams(); 159 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 160 urlSearchParams.append('ReturnDataType', '1'); 161 urlSearchParams.append('WyvernApiAction', 'ContactSubscriptionLinkCancel'); 162 urlSearchParams.append('subscription_contactsubscriptionlinkid', subscriptionLinkId); 163 urlSearchParams.append('WyvernApiActionType', 'Membership'); 164 urlSearchParams.append('ContactTypeID', '0'); 165 return performApiRequest(urlSearchParams); 166} 167 168export async function getUserFormAutoPopulate(userId, siteSubscriptionId) { 169 const urlSearchParams = new URLSearchParams(); 170 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 171 urlSearchParams.append('ReturnDataType', '1'); 172 urlSearchParams.append('WyvernApiAction', 'SubscriptionFormAutoPopDataGet'); 173 urlSearchParams.append('ContactAPI_ContactEmail', userId); 174 urlSearchParams.append('WyvernApiActionType', 'Membership'); 175 urlSearchParams.append('ContactTypeID', '0'); 176 urlSearchParams.append('billing_productid', `${siteSubscriptionId}`); 177 return performApiLoginRequest(urlSearchParams); 178} 179 180export async function getUserWebsiteActivityStartData(userId, site, page, title, tags) { 181 const urlSearchParams = new URLSearchParams(); 182 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 183 urlSearchParams.append('contactapi_contactid', userId); 184 urlSearchParams.append('ReturnDataType', '1'); 185 urlSearchParams.append('WyvernApiAction', 'WebsiteActivityStartData'); 186 urlSearchParams.append('WyvernApiActionType', 'Membership'); 187 urlSearchParams.append('siteactivity_site', site); 188 urlSearchParams.append('siteactivity_page', page); 189 urlSearchParams.append('siteactivity_title', title); 190 urlSearchParams.append('siteactivity_tags', tags); 191 192 if (token) { 193 urlSearchParams.append('ContactAPI_SessionID', token); 194 } 195 196 try { 197 const response = await performApiRequest(urlSearchParams); 198 return response.result; 199 } catch (error) { 200 return Promise.reject(error); 201 } 202} 203 204export async function getUserWebsiteActivityEndData(userId, site, page, title, tags) { 205 const urlSearchParams = new URLSearchParams(); 206 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 207 urlSearchParams.append('contactapi_contactid', userId); 208 urlSearchParams.append('ReturnDataType', '1'); 209 urlSearchParams.append('WyvernApiAction', 'WebsiteActivityEndData'); 210 urlSearchParams.append('WyvernApiActionType', 'Membership'); 211 urlSearchParams.append('siteactivity_site', site); 212 urlSearchParams.append('siteactivity_page', page); 213 urlSearchParams.append('siteactivity_title', title); 214 urlSearchParams.append('siteactivity_tags', tags); 215 216 if (token) { 217 urlSearchParams.append('ContactAPI_SessionID', token); 218 } 219 220 try { 221 return performApiRequest(urlSearchParams); 222 } catch (error) { 223 return Promise.reject(error); 224 } 225} 226 227export async function logout(userId) { 228 const urlSearchParams = new URLSearchParams(); 229 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 230 urlSearchParams.append('ReturnDataType', '1'); 231 urlSearchParams.append('WyvernApiAction', 'UserLogout'); 232 urlSearchParams.append('User_ContactID', userId); 233 urlSearchParams.append('WyvernApiActionType', 'Membership'); 234 urlSearchParams.append('ContactTypeID', '0'); 235 236 token = null; 237 localStorage.removeItem('apiToken'); 238 239 return performApiLoginRequest(urlSearchParams); 240} 241 242export async function passwordResetEmailSend(email, siteSubscriptionId) { 243 const urlSearchParams = new URLSearchParams(); 244 urlSearchParams.append('WyvernAPIAccount', `${API_ACCOUNT}`); 245 urlSearchParams.append('ReturnDataType', '1'); 246 urlSearchParams.append('WyvernApiAction', 'PasswordResetEmailSend'); 247 urlSearchParams.append('ContactAPI_ContactEmail', email); 248 urlSearchParams.append('WyvernApiActionType', 'Membership'); 249 urlSearchParams.append('ContactTypeID', '0'); 250 urlSearchParams.append('billing_productid', `${siteSubscriptionId}`); 251 252 return performApiLoginRequest(urlSearchParams); 253}
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.