PageRenderTime 49ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/api/rest/site.php

https://gitlab.com/x33n/respond
PHP | 1103 lines | 582 code | 287 blank | 234 comment | 110 complexity | b6a9a1457f35d2cb8d1c2e5632fb1ad2 MD5 | raw file
  1. <?php
  2. /**
  3. * This class defines an example resource that is wired into the URI /example
  4. * @uri /site/test
  5. */
  6. class SiteTestResource extends Tonic\Resource {
  7. /**
  8. * @method GET
  9. */
  10. function get() {
  11. $response = new Tonic\Response(Tonic\Response::OK);
  12. $response->contentType = 'text/HTML';
  13. $response->body = 'API works!';
  14. return $response;
  15. }
  16. }
  17. /**
  18. * This class defines an example resource that is wired into the URI /example
  19. * @uri /site/validate/id
  20. */
  21. class SiteValidateIdResource extends Tonic\Resource {
  22. /**
  23. * @method POST
  24. */
  25. function post() {
  26. // parse request
  27. parse_str($this->request->data, $request);
  28. $friendlyId = $request['friendlyId'];
  29. $isFriendlyIdUnique = Site::IsFriendlyIdUnique($friendlyId);
  30. // check for reserved names
  31. if($friendlyId == 'app' || $friendlyId == 'sites' || $friendlyId == 'api'){
  32. $isFriendlyIdUnique = false;
  33. }
  34. if($isFriendlyIdUnique==false){
  35. return new Tonic\Response(Tonic\Response::CONFLICT);
  36. }
  37. else{
  38. return new Tonic\Response(Tonic\Response::OK);
  39. }
  40. }
  41. }
  42. /**
  43. * This class defines an example resource that is wired into the URI /example
  44. * @uri /site/validate/email
  45. */
  46. class SiteValidateEmailResource extends Tonic\Resource {
  47. /**
  48. * @method POST
  49. */
  50. function post() {
  51. // parse request
  52. parse_str($this->request->data, $request);
  53. $email = $request['email'];
  54. $isUserUnique = User::IsLoginUnique($email);
  55. if($isUserUnique==false){
  56. return new Tonic\Response(Tonic\Response::CONFLICT);
  57. }
  58. else{
  59. return new Tonic\Response(Tonic\Response::OK);
  60. }
  61. }
  62. }
  63. /**
  64. * A protected API call to retrieve the current site
  65. * @uri /site/create
  66. */
  67. class SiteCreateResource extends Tonic\Resource {
  68. /**
  69. * @method POST
  70. */
  71. function post() {
  72. parse_str($this->request->data, $request); // parse request
  73. $friendlyId = trim($request['friendlyId']);
  74. $name = trim($request['name']);
  75. $s_passcode = $request['passcode'];
  76. $timeZone = $request['timeZone'];
  77. $email = '';
  78. $password = '';
  79. $language = DEFAULT_LANGUAGE; // language for the app
  80. $direction = DEFAULT_DIRECTION;
  81. $userId = -1;
  82. // get first name and lastname
  83. $firstName = $request['firstName'];
  84. $lastName = $request['lastName'];
  85. // validate name and friendlyId
  86. if($friendlyId == '' || $name == ''){
  87. return new Tonic\Response(Tonic\Response::BADREQUEST);
  88. }
  89. $theme = DEFAULT_THEME;
  90. // set theme
  91. if(isset($request['theme'])){
  92. $theme = $request['theme'];
  93. }
  94. // set language if set
  95. if(isset($request['language'])){
  96. $language = $request['language'];
  97. }
  98. // set direction if set
  99. if(isset($request['direction'])){
  100. $direction = $request['direction'];
  101. }
  102. // check for email and password
  103. if(isset($request['email'])){
  104. $userLanguage = 'en-us';
  105. if(isset($request['userLanguage'])){
  106. $userLanguage = $request['userLanguage'];
  107. }
  108. $email = $request['email'];
  109. $password = $request['password'];
  110. // valide email and password
  111. if($email == '' || $password == ''){
  112. return new Tonic\Response(Tonic\Response::BADREQUEST);
  113. }
  114. }
  115. else{
  116. // get an authuser
  117. $authUser = new AuthUser();
  118. if($authUser->UserId && $authUser->IsSuperAdmin==true){ // check if authorized
  119. $userId = $authUser->UserId;
  120. }
  121. else{
  122. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  123. }
  124. }
  125. // defaults
  126. $domain = SITE_URL;
  127. $domain = str_replace('{{friendlyId}}', $friendlyId, $domain);
  128. $logoUrl = 'sample-logo.png';
  129. $altLogoUrl = '';
  130. if($s_passcode == PASSCODE){
  131. $isFriendlyIdUnique = Site::IsFriendlyIdUnique($friendlyId);
  132. // check for reserved names
  133. if($friendlyId == 'app' || $friendlyId == 'sites' || $friendlyId == 'api' || $friendlyId == 'triangulate' || $friendlyId == 'developer'){
  134. $isFriendlyIdUnique = false;
  135. }
  136. if($isFriendlyIdUnique==false){
  137. return new Tonic\Response(Tonic\Response::CONFLICT);
  138. }
  139. // default is blank
  140. $welcomeEmail = '';
  141. $receiptEmail = '';
  142. // files for emails
  143. $welcome_file = APP_LOCATION.'/site/emails/welcome.html';
  144. $receipt_file = APP_LOCATION.'/site/emails/receipt.html';
  145. // make sure the welcome email exists
  146. if(file_exists($welcome_file)){
  147. // get default email file
  148. $welcomeEmail = file_get_contents($welcome_file);
  149. }
  150. // make sure the receipt email exists
  151. if(file_exists($receipt_file)){
  152. // get default email file
  153. $receiptEmail = file_get_contents($receipt_file);
  154. }
  155. // create the bucket name
  156. $bucket = str_replace('{{site}}', $friendlyId, BUCKET_NAME);
  157. // set default URL mode
  158. $urlMode = 'static';
  159. // add the site
  160. $site = Site::Add($domain, $bucket, $name, $friendlyId, $urlMode, $logoUrl, $altLogoUrl, $theme, $email, $timeZone, $language, $direction, $welcomeEmail, $receiptEmail);
  161. // add the admin
  162. if($email != ''){
  163. $isActive = 1; // admins by default are active
  164. $user = User::Add($email, $password, $firstName, $lastName, 'Admin', $userLanguage, $isActive, $site['SiteId']);
  165. $userId = $user['UserId'];
  166. }
  167. // set $siteId
  168. $siteId = $site['SiteId'];
  169. // publishes a theme for a site
  170. Publish::PublishTheme($site, $theme);
  171. // publish default content for the theme
  172. Publish::PublishDefaultContent($site, $theme, $user['UserId']);
  173. // publish the site
  174. Publish::PublishSite($site['SiteId']);
  175. // create a locale directory
  176. $locales_dir = SITES_LOCATION.'/'.$site['FriendlyId'].'/locales';
  177. // create locales directory if it does not exist
  178. if(!file_exists($locales_dir)){
  179. mkdir($locales_dir, 0755, true);
  180. }
  181. // set directory for locale
  182. $locale_dir = $locales_dir.'/'.$site['Language'].'/';
  183. // make the locale dir if it does not exist
  184. if(!file_exists($locale_dir)){
  185. mkdir($locale_dir, 0755, true);
  186. }
  187. // set filename
  188. $filename = 'translation.json';
  189. if(!file_exists($locale_dir.$filename)){
  190. // create a blank translation file
  191. Utilities::SaveContent($locale_dir, $filename, '{}');
  192. }
  193. // send welcome email
  194. if(SEND_WELCOME_EMAIL == true && $email != ''){
  195. $to = $email;
  196. $from = REPLY_TO;
  197. $fromName = REPLY_TO_NAME;
  198. $subject = WELCOME_EMAIL_SUBJECT;
  199. $file = WELCOME_EMAIL_FILE;
  200. // create strings to replace
  201. $loginUrl = APP_URL.'/login/'.$site['FriendlyId'];
  202. $newSiteUrl = $domain;
  203. $replace = array(
  204. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  205. '{{brand}}' => BRAND,
  206. '{{reply-to}}' => REPLY_TO,
  207. '{{new-site-url}}' => $newSiteUrl,
  208. '{{login-url}}' => $loginUrl
  209. );
  210. // send email from file
  211. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  212. }
  213. // send new site hook
  214. Webhooks::NewSite($site);
  215. // send new user hook
  216. Webhooks::NewUser($user);
  217. return new Tonic\Response(Tonic\Response::OK);
  218. }
  219. else{
  220. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  221. }
  222. }
  223. }
  224. /**
  225. * A protected API call to retrieve the current site
  226. * @uri /site/retrieve
  227. */
  228. class SiteRetrieveResource extends Tonic\Resource {
  229. /**
  230. * @method POST
  231. */
  232. function post() {
  233. // get token
  234. $token = Utilities::ValidateJWTToken(apache_request_headers());
  235. // check if token is not null
  236. if($token != NULL){
  237. $site = Site::GetBySiteId($token->SiteId);
  238. // set images URL
  239. if(FILES_ON_S3 == true){
  240. $bucket = $site['Bucket'];
  241. $imagesURL = str_replace('{{bucket}}', $bucket, S3_URL);
  242. $imagesURL = str_replace('{{site}}', $site['FriendlyId'], $imagesURL);
  243. }
  244. else{
  245. $imagesURL = $site['Domain'];
  246. }
  247. // set the ImagesURL
  248. $site['ImagesUrl'] = $imagesURL.'/';
  249. // determine offset for timezone
  250. $zone = new DateTimeZone($site['TimeZone']);
  251. $now = new DateTime("now", $zone);
  252. $offset = $zone->getOffset($now);
  253. $offset_hours = round(($offset)/3600);
  254. // set offset for site
  255. $site['Offset'] = $offset_hours;
  256. // return a json response
  257. $response = new Tonic\Response(Tonic\Response::OK);
  258. $response->contentType = 'application/json';
  259. $response->body = json_encode($site);
  260. return $response;
  261. }
  262. else{
  263. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  264. }
  265. }
  266. }
  267. /**
  268. * A protected API call to publish the site
  269. * @uri /site/publish
  270. */
  271. class SitePublishResource extends Tonic\Resource {
  272. /**
  273. * @method GET
  274. */
  275. function get() {
  276. // get token
  277. $token = Utilities::ValidateJWTToken(apache_request_headers());
  278. // check if token is not null
  279. if($token != NULL){
  280. Publish::PublishSite($token->SiteId);
  281. $response = new Tonic\Response(Tonic\Response::OK);
  282. return $response;
  283. }
  284. else{
  285. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  286. }
  287. }
  288. }
  289. /**
  290. * A protected API call to publish the site
  291. * @uri /site/deploy
  292. */
  293. class SiteDeployResource extends Tonic\Resource {
  294. /**
  295. * @method GET
  296. */
  297. function get() {
  298. // get token
  299. $token = Utilities::ValidateJWTToken(apache_request_headers());
  300. // check if token is not null
  301. if($token != NULL){
  302. S3::DeploySite($token->SiteId);
  303. $response = new Tonic\Response(Tonic\Response::OK);
  304. return $response;
  305. }
  306. else{
  307. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  308. }
  309. }
  310. }
  311. /**
  312. * A protected API call to view, edit, and delete a site
  313. * @uri /site/remove
  314. */
  315. class SiteRemoveResource extends Tonic\Resource {
  316. /**
  317. * @method POST
  318. */
  319. function remove() {
  320. // get an authuser
  321. $token = Utilities::ValidateJWTToken(apache_request_headers());
  322. if($token != NULL){ // check if authorized
  323. // validate that the user can remove the site
  324. $user = User::GetByUserId($token->UserId);
  325. if($user['SiteAdmin'] == 1){
  326. parse_str($this->request->data, $request); // parse request
  327. $siteId = $request['siteId'];
  328. $site = Site::GetBySiteId($siteId);
  329. $directory = SITES_LOCATION.'/'.$site['FriendlyId'];
  330. // Get the directory name
  331. $oldname = SITES_LOCATION.'/'.$site['FriendlyId'];
  332. // Set the directory to be removed
  333. $newname = SITES_LOCATION.'/removed-'.$site['FriendlyId'];
  334. if(file_exists($oldname)){
  335. // Renames the directory
  336. rename($oldname, $newname);
  337. }
  338. // remove site from Amazon S3
  339. if(FILES_ON_S3 == true){
  340. // get site
  341. $site = Site::GetBySiteId($siteId);
  342. // remove site
  343. S3::RemoveSite($site);
  344. }
  345. // remove site from DB
  346. Site::Remove($siteId);
  347. return new Tonic\Response(Tonic\Response::OK);
  348. }
  349. else{ // unauthorized access
  350. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  351. }
  352. }
  353. else{ // unauthorized access
  354. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  355. }
  356. return new Tonic\Response(Tonic\Response::NOTIMPLEMENTED);
  357. }
  358. }
  359. /**
  360. * A protected API call to view, edit, and delete a site
  361. * @uri /site/save
  362. */
  363. class SiteSaveResource extends Tonic\Resource {
  364. /**
  365. * @method POST
  366. */
  367. function post() {
  368. // get token
  369. $token = Utilities::ValidateJWTToken(apache_request_headers());
  370. // check if token is not null
  371. if($token != NULL){
  372. parse_str($this->request->data, $request); // parse request
  373. $name = $request['name'];
  374. $domain = $request['domain'];
  375. $primaryEmail = $request['primaryEmail'];
  376. $timeZone = $request['timeZone'];
  377. $language = $request['language'];
  378. $direction = $request['direction'];
  379. $currency = $request['currency'];
  380. $showCart = $request['showCart'];
  381. $showSettings = $request['showSettings'];
  382. $showLanguages = $request['showLanguages'];
  383. $showLogin = $request['showLogin'];
  384. $showSearch = $request['showSearch'];
  385. $urlMode = $request['urlMode'];
  386. $weightUnit = $request['weightUnit'];
  387. $shippingCalculation = $request['shippingCalculation'];
  388. $shippingRate = $request['shippingRate'];
  389. $shippingTiers = $request['shippingTiers'];
  390. $taxRate = $request['taxRate'];
  391. $payPalId = $request['payPalId'];
  392. $payPalUseSandbox = $request['payPalUseSandbox'];
  393. $welcomeEmail = $request['welcomeEmail'];
  394. $receiptEmail = $request['receiptEmail'];
  395. $isSMTP = $request['isSMTP'];
  396. $SMTPHost = $request['SMTPHost'];
  397. $SMTPAuth = $request['SMTPAuth'];
  398. $SMTPUsername = $request['SMTPUsername'];
  399. $SMTPPassword = $request['SMTPPassword'];
  400. $SMTPSecure = $request['SMTPSecure'];
  401. $formPublicId = $request['formPublicId'];
  402. $formPrivateId = $request['formPrivateId'];
  403. $SMTPPasswordIV = '';
  404. // encyrpt password, #ref: http://stackoverflow.com/questions/10916284/how-to-encrypt-decrypt-data-in-php
  405. if($SMTPPassword != '' && $SMTPPassword != 'temppassword'){
  406. // encrypt password
  407. $key_size = mcrypt_get_key_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CFB);
  408. $encryption_key = SMTPENC_KEY;
  409. // create iv
  410. $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CFB);
  411. $iv = mcrypt_create_iv($iv_size, MCRYPT_DEV_URANDOM); // 16 bytes output
  412. // encrypt password
  413. $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $encryption_key, $SMTPPassword, MCRYPT_MODE_CFB, $iv);
  414. // set password to encrypted password
  415. $SMTPPasswordIV = base64_encode($iv);
  416. $SMTPPassword = base64_encode($encrypted);
  417. // edit SMTP password
  418. Site::EditSMTPPassword($token->SiteId, $SMTPPassword, $SMTPPasswordIV);
  419. }
  420. // edit site
  421. Site::Edit($token->SiteId, $name, $domain, $primaryEmail, $timeZone, $language, $direction,
  422. $showCart, $showSettings, $showLanguages, $showLogin, $showSearch, $urlMode,
  423. $currency, $weightUnit, $shippingCalculation, $shippingRate, $shippingTiers,
  424. $taxRate, $payPalId, $payPalUseSandbox,
  425. $welcomeEmail, $receiptEmail,
  426. $isSMTP, $SMTPHost, $SMTPAuth, $SMTPUsername, $SMTPSecure,
  427. $formPublicId, $formPrivateId);
  428. Publish::PublishContent($token->SiteId);
  429. return new Tonic\Response(Tonic\Response::OK);
  430. } else{ // unauthorized access
  431. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  432. }
  433. return new Tonic\Response(Tonic\Response::NOTIMPLEMENTED);
  434. }
  435. }
  436. /**
  437. * A protected API call to view, edit, and delete a site
  438. * @uri /site/edit/admin
  439. */
  440. class SiteEditAdminResource extends Tonic\Resource {
  441. /**
  442. * @method POST
  443. */
  444. function post() {
  445. // get token
  446. $token = Utilities::ValidateJWTToken(apache_request_headers());
  447. // check if token is not null
  448. if($token != NULL){
  449. $user = User::GetByUserId($token->UserId);
  450. if($user['SiteAdmin'] == 1){
  451. parse_str($this->request->data, $request); // parse request
  452. $siteId = $request['siteId'];
  453. $domain = $request['domain'];
  454. $bucket = $request['bucket'];
  455. $status = $request['status'];
  456. $fileLimit = $request['fileLimit'];
  457. $userLimit = $request['userLimit'];
  458. // edit site
  459. Site::EditAdmin($siteId, $domain, $bucket, $status, $fileLimit, $userLimit);
  460. return new Tonic\Response(Tonic\Response::OK);
  461. } else{ // unauthorized access
  462. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  463. }
  464. } else{ // unauthorized access
  465. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  466. }
  467. return new Tonic\Response(Tonic\Response::NOTIMPLEMENTED);
  468. }
  469. }
  470. /**
  471. * A protected API call to view, edit, and delete a site
  472. * @uri /site/branding/image
  473. */
  474. class SiteBrandingResource extends Tonic\Resource {
  475. /**
  476. * @method POST
  477. */
  478. function update() {
  479. // get token
  480. $token = Utilities::ValidateJWTToken(apache_request_headers());
  481. // check if token is not null
  482. if($token != NULL){
  483. parse_str($this->request->data, $request); // parse request
  484. $url = $request['url'];
  485. $type = $request['type'];
  486. $site = Site::GetBySiteId($token->SiteId);
  487. if($type == 'logo'){
  488. Site::EditLogo($token->SiteId, $url);
  489. }
  490. else if($type == 'alt'){
  491. Site::EditAltLogo($token->SiteId, $url);
  492. }
  493. else if($type == 'paypal'){
  494. Site::EditPayPalLogo($token->SiteId, $url);
  495. }
  496. else if($type == 'icon'){
  497. Site::EditIcon($token->SiteId, $url);
  498. if(FILES_ON_S3 == true){
  499. $bucket = $site['Bucket'];
  500. $imagesURL = str_replace('{{bucket}}', $bucket, S3_URL);
  501. $imagesURL = str_replace('{{site}}', $site['FriendlyId'], $imagesURL);
  502. $source = $imagesURL.'/files/'.$url;
  503. }
  504. else{
  505. $source = SITES_LOCATION.'/'.$site['FriendlyId'].'/files/'.$url;
  506. }
  507. // create the icon
  508. $destination = SITES_LOCATION.'/'.$site['FriendlyId'].'/favicon.ico';
  509. $ico_lib = new PHP_ICO($source, array( array( 32, 32 ), array( 64, 64 ) ) );
  510. $ico_lib->save_ico( $destination );
  511. }
  512. // publish site content
  513. Publish::PublishContent($token->SiteId);
  514. return new Tonic\Response(Tonic\Response::OK);
  515. } else{ // unauthorized access
  516. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  517. }
  518. return new Tonic\Response(Tonic\Response::NOTIMPLEMENTED);
  519. }
  520. }
  521. /**
  522. * A protected API call to view, edit, and delete a site
  523. * @uri /site/branding/icon/background
  524. */
  525. class SiteBrandingIconBackgroundResource extends Tonic\Resource {
  526. /**
  527. * @method POST
  528. */
  529. function update() {
  530. // get token
  531. $token = Utilities::ValidateJWTToken(apache_request_headers());
  532. // check if token is not null
  533. if($token != NULL){
  534. parse_str($this->request->data, $request); // parse request
  535. $color = $request['color'];
  536. Site::EditIconBg($token->SiteId, $color);
  537. // republish site
  538. Publish::PublishContent($token->SiteId);
  539. return new Tonic\Response(Tonic\Response::OK);
  540. } else{ // unauthorized access
  541. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  542. }
  543. return new Tonic\Response(Tonic\Response::NOTIMPLEMENTED);
  544. }
  545. }
  546. /**
  547. * List all sites
  548. * @uri /site/list/all
  549. */
  550. class SiteListAllResource extends Tonic\Resource {
  551. /**
  552. * @method GET
  553. */
  554. function get() {
  555. // get token
  556. $token = Utilities::ValidateJWTToken(apache_request_headers());
  557. // check if token is not null
  558. if($token != NULL){
  559. $user = User::GetByUserId($token->UserId);
  560. if($user['SiteAdmin'] == 1){
  561. // get sites
  562. $list = Site::GetSites();
  563. // return a json response
  564. $response = new Tonic\Response(Tonic\Response::OK);
  565. $response->contentType = 'application/json';
  566. $response->body = json_encode($list);
  567. return $response;
  568. }
  569. else{ // unauthorized access
  570. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  571. }
  572. }
  573. else{ // unauthorized access
  574. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  575. }
  576. }
  577. }
  578. /**
  579. * API call to pay for a subscription
  580. * @uri /site/subscribe/stripe
  581. */
  582. class SiteSubscribeStripeResource extends Tonic\Resource {
  583. /**
  584. * @method POST
  585. */
  586. function post() {
  587. // get token
  588. $token = Utilities::ValidateJWTToken(apache_request_headers());
  589. // check if token is not null
  590. if($token != NULL){
  591. // parse request
  592. parse_str($this->request->data, $request);
  593. $site = Site::GetBySiteId($token->SiteId);
  594. $siteId = $site['SiteId'];
  595. $email = $site['PrimaryEmail'];
  596. $status = 'Active';
  597. $stripe_token = $request['token'];
  598. $plan = $request['plan'];
  599. $domain = $request['domain'];
  600. $provider = 'Stripe';
  601. // set API key
  602. Stripe::setApiKey(STRIPE_SECRET_KEY);
  603. // create a new customer and subscribe them to the plan
  604. $customer = Stripe_Customer::create(
  605. array(
  606. "card" => $stripe_token,
  607. "plan" => $plan,
  608. "email" => $email)
  609. );
  610. // get back the id and the end period for the plan
  611. $customerId = $customer->id;
  612. // get subscription information
  613. $subscription = $customer->subscriptions->data[0];
  614. $subscriptionId = $subscription->id;
  615. $stripe_status = $subscription->status;
  616. $stripe_plan = $subscription->plan->id;
  617. $stripe_planname = $subscription->plan->name;
  618. // subscribe to a plan
  619. Site::Subscribe($siteId, $status, $plan, $provider, $subscriptionId, $customerId);
  620. // send email to user
  621. if(NEW_SUBSCRIPTION_EMAIL == true){
  622. // send success email to user
  623. $to = $site['PrimaryEmail'];
  624. $from = REPLY_TO;
  625. $fromName = REPLY_TO_NAME;
  626. $subject = NEW_SUBSCRIPTION_EMAIL_SUBJECT;
  627. $file = NEW_SUBSCRIPTION_EMAIL_FILE;
  628. $replace = array(
  629. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  630. '{{brand}}' => BRAND,
  631. '{{reply-to}}' => REPLY_TO
  632. );
  633. // send
  634. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  635. }
  636. // send email to admin
  637. if(NEW_SUBSCRIBER_EMAIL == true){
  638. // send details email to admin
  639. $to = REPLY_TO;
  640. $from = REPLY_TO;
  641. $fromName = REPLY_TO_NAME;
  642. $subject = NEW_SUBSCRIBER_EMAIL_SUBJECT;
  643. $file = NEW_SUBSCRIBER_EMAIL_FILE;
  644. $replace = array(
  645. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  646. '{{brand}}' => BRAND,
  647. '{{reply-to}}' => REPLY_TO,
  648. '{{domain}}' => $domain,
  649. '{{siteid}}' => $site['SiteId'],
  650. '{{friendlyid}}' => $site['FriendlyId'],
  651. '{{provider}}' => $provider,
  652. '{{customerid}}' => $customerId
  653. );
  654. // send email from file
  655. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  656. }
  657. // send email from file
  658. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  659. // return a json response
  660. return new Tonic\Response(Tonic\Response::OK);
  661. }
  662. else{
  663. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  664. }
  665. }
  666. }
  667. /**
  668. * API call to pay for a subscription
  669. * @uri /site/unsubscribe/stripe
  670. */
  671. class SiteUnsubscribeStripeResource extends Tonic\Resource {
  672. /**
  673. * @method POST
  674. */
  675. function post() {
  676. // get token
  677. $token = Utilities::ValidateJWTToken(apache_request_headers());
  678. // check if token is not null
  679. if($token != NULL){
  680. // parse request
  681. parse_str($this->request->data, $request);
  682. $site = Site::GetBySiteId($token->SiteId);
  683. $siteId = $site['SiteId'];
  684. $email = $site['PrimaryEmail'];
  685. $status = 'Unsubscribed';
  686. $plan = '';
  687. $provider = '';
  688. $subscriptionId = '';
  689. $customerId = $site['CustomerId'];
  690. // set API key
  691. Stripe::setApiKey(STRIPE_SECRET_KEY);
  692. // retrieve customer
  693. $customer = Stripe_Customer::retrieve($site['CustomerId']);
  694. // unsubscribe
  695. $cu->subscriptions->retrieve($site['SubscriptionId'])->cancel();
  696. // unsubscribe to a plan
  697. Site::Subscribe($siteId, $status, $plan, $provider, $subscriptionId, $customerId);
  698. // send success email to user
  699. $to = $site['PrimaryEmail'];
  700. $from = REPLY_TO;
  701. $fromName = REPLY_TO_NAME;
  702. $subject = BRAND.': You have successfully unsubscribed to '.BRAND;
  703. $file = APP_LOCATION.'/emails/unsubscribe-success.html';
  704. $replace = array(
  705. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  706. '{{brand}}' => BRAND,
  707. '{{reply-to}}' => REPLY_TO
  708. );
  709. // send
  710. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  711. // send details email to admin
  712. $to = REPLY_TO;
  713. $from = REPLY_TO;
  714. $fromName = REPLY_TO_NAME;
  715. $subject = BRAND.': Unsubscribed';
  716. $file = APP_LOCATION.'/emails/unsubscribe-details.html';
  717. $replace = array(
  718. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  719. '{{brand}}' => BRAND,
  720. '{{reply-to}}' => REPLY_TO,
  721. '{{domain}}' => $domain,
  722. '{{siteid}}' => $site['SiteId'],
  723. '{{friendlyid}}' => $site['FriendlyId'],
  724. '{{provider}}' => $site['Provider'],
  725. '{{customerid}}' => $site['CustomerId']
  726. );
  727. // send email from file
  728. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  729. // return a json response
  730. return new Tonic\Response(Tonic\Response::OK);
  731. }
  732. else{
  733. return new Tonic\Response(Tonic\Response::UNAUTHORIZED);
  734. }
  735. }
  736. }
  737. /**
  738. * This class defines an example resource that is wired into the URI /example
  739. * @uri /site/subscribe/paypal
  740. */
  741. class SiteSubscribePaypalResource extends Tonic\Resource {
  742. /**
  743. * @method POST
  744. */
  745. function post() {
  746. parse_str($this->request->data, $request);
  747. $txn_type = $request['txn_type'];
  748. $status = $request['payer_status'];
  749. $email = $request['payer_email'];
  750. $payerId = $request['payer_id'];
  751. $item_name = $request['item_name'];
  752. // explode custom (siteId-plan)
  753. $custom = explode('//', $request['custom']);
  754. // get site and plan
  755. $siteId = $custom[0];
  756. $plan = $custom[1];
  757. // parse domain
  758. preg_match('#\((.*?)\)#', $item_name, $match);
  759. $domain = $match[1];
  760. // get reference to site
  761. $site = Site::GetBySiteId($siteId);
  762. // response was "VERIFIED"
  763. if($status == 'verified' && $txn_type == 'subscr_signup'){
  764. $provider = 'PayPal';
  765. $status = 'Active';
  766. $subscriptionId = $payerId;
  767. $customerId = $email;
  768. // subscribe to a plan
  769. Site::Subscribe($siteId, $status, $plan, $provider, $subscriptionId, $customerId);
  770. // send email to user
  771. if(NEW_SUBSCRIPTION_EMAIL == true){
  772. // send success email to user
  773. $to = $site['PrimaryEmail'];
  774. $from = REPLY_TO;
  775. $fromName = REPLY_TO_NAME;
  776. $subject = NEW_SUBSCRIPTION_EMAIL_SUBJECT;
  777. $file = NEW_SUBSCRIPTION_EMAIL_FILE;
  778. $replace = array(
  779. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  780. '{{brand}}' => BRAND,
  781. '{{reply-to}}' => REPLY_TO
  782. );
  783. // send
  784. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  785. }
  786. // send email to admin
  787. if(NEW_SUBSCRIBER_EMAIL == true){
  788. // send details email to admin
  789. $to = REPLY_TO;
  790. $from = REPLY_TO;
  791. $fromName = REPLY_TO_NAME;
  792. $subject = NEW_SUBSCRIBER_EMAIL_SUBJECT;
  793. $file = NEW_SUBSCRIBER_EMAIL_FILE;
  794. $replace = array(
  795. '{{brand-logo}}' => '<img src="'.BRAND_LOGO.'" style="max-height:50px">',
  796. '{{brand}}' => BRAND,
  797. '{{reply-to}}' => REPLY_TO,
  798. '{{domain}}' => $domain,
  799. '{{siteid}}' => $site['SiteId'],
  800. '{{friendlyid}}' => $site['FriendlyId'],
  801. '{{provider}}' => $provider,
  802. '{{customerid}}' => $customerId
  803. );
  804. // send email from file
  805. Utilities::SendEmailFromFile($to, $from, $fromName, $subject, $replace, $file);
  806. }
  807. } else {
  808. // IPN response was "INVALID"\
  809. }
  810. $response = new Tonic\Response(Tonic\Response::OK);
  811. $response->contentType = 'text/HTML';
  812. $response->body = 'Yah!!!';
  813. return $response;
  814. }
  815. }
  816. ?>