Merge pull request #824 from rasika/monetize-cloud

Fixing https://github.com/wso2/product-iots/issues/1119: monetization
4.x.x
Rasika Perera 8 years ago committed by GitHub
commit 5e87ce2d66

@ -1,112 +1,137 @@
{
"Logo": {
"name": "Cloud",
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt",
"target": "_parent"
},
"Main": {
"Domain": {
"url": "#",
"icon": "fw fw-organization",
"isAdminOnly": false,
"target": "_parent",
"dropDown": {
"Organization": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/organization.jag",
"icon": "fw fw-organization",
"dropDown": "false",
"target": "_self"
"Logo": {
"name": "Cloud",
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt",
"target": "_parent"
},
"Main": {
"Domain": {
"url": "#",
"icon": "fw fw-organization",
"isAdminOnly": false,
"target": "_parent",
"dropDown": {
"Organization": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/organization.jag",
"icon": "fw fw-organization",
"dropDown": "false",
"target": "_self"
},
"Members": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user.jag",
"icon": "fa fa-users",
"dropDown": "false",
"target": "_self"
}
}
},
"Account": {
"url": "#",
"icon": "fw fw-resource",
"isAdminOnly": false,
"billingEnabled": true,
"billingApi": {
"username": "admin",
"password": "admin"
},
"cloudMgtIndexPage": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/index.jag",
"dropDown": {
"Upgrade Now": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/payment-plans.jag?cloud-type=device_cloud",
"icon": "fw fw-export",
"dropDown": "true",
"target": "_self"
},
"Request Extension": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/contact-us.jag?cloud-type=device_cloud&request-extension=true",
"icon": "fa fa-mail",
"dropDown": "true",
"target": "_self"
}
}
},
"Support": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/contact-us.jag?cloud-type=device_cloud",
"icon": "fw fw-mail",
"isAdminOnly": false,
"target": "_self",
"dropDown": "false"
},
"Members": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user.jag",
"icon": "fa fa-users",
"dropDown": "false",
"target": "_self"
"Documentation": {
"url": "#",
"icon": "fw fw-document",
"isAdminOnly": false,
"dropDown": {
"Device Cloud": {
"id": "device_cloud",
"url": "https://docs.wso2.com/display/DeviceCloud/WSO2+Device+Cloud+Documentation",
"icon": "fw fw-mobile",
"target": "_blank"
}
}
}
}
},
"Support": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/contact-us.jag",
"icon": "fw fw-mail",
"isAdminOnly": false,
"target": "_self",
"dropDown": "false"
},
"Documentation": {
"url": "#",
"icon": "fw fw-document",
"isAdminOnly": false,
"dropDown": {
"Device Cloud": {
"id": "device_cloud",
"url": "https://docs.wso2.com/display/DeviceCloud/WSO2+Device+Cloud+Documentation",
"icon": "fw fw-mobile",
"target": "_blank"
}
}
}
},
"User": {
"url": "#",
"icon": "fw fw-user",
"dropDown": {
"Profile": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user-profile.jag",
"User": {
"url": "#",
"icon": "fw fw-user",
"dropDown": "true",
"target": "_self"
},
"Change Password": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/change-password.jag",
"icon": "fw fw-lock",
"dropDown": "true",
"target": "_self"
},
"Logout": {
"url": "https://api.cloud.wso2.com/publisher/site/pages/logout.jag",
"icon": "fw fw-sign-out",
"dropDown": "true",
"target": "_self"
}
}
},
"Expand": {
"Clouds": {
"API Cloud": {
"id": "api_cloud",
"url": "https://api.cloud.wso2.com/publisher",
"icon": "fw fw-api fw-3x",
"dropDown": "true",
"target": "_self"
},
"Integration Cloud": {
"id": "integration_cloud",
"url": "https://integration.cloud.wso2.com/appmgt",
"icon": "fw fw-service fw-3x",
"dropDown": "true",
"target": "_self"
},
"Identity Cloud": {
"id": "integration_cloud",
"url": "https://identity.cloud.wso2.com/admin",
"icon": "fw fw-security fw-3x",
"dropDown": "true",
"target": "_self"
}
"dropDown": {
"Profile": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user-profile.jag",
"icon": "fw fw-user",
"dropDown": "true",
"target": "_self"
},
"Change Password": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/change-password.jag",
"icon": "fw fw-lock",
"dropDown": "true",
"target": "_self"
},
"Logout": {
"url": "https://device.cloud.wso2.com/devicemgt/logout",
"icon": "fw fw-sign-out",
"dropDown": "true",
"target": "_self"
}
}
},
"Actions": {
"Organization": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/organization.jag",
"icon": "fw fw-organization fw-3x",
"dropDown": "true",
"target": "_self"
},
"Members": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user.jag",
"icon": "fa fa-users fa-3x",
"dropDown": "true",
"target": "_self"
}
"Expand": {
"Clouds": {
"API Cloud": {
"id": "api_cloud",
"url": "https://api.cloud.wso2.com/publisher",
"icon": "fw fw-api fw-3x",
"dropDown": "true",
"target": "_self"
},
"Integration Cloud": {
"id": "integration_cloud",
"url": "https://integration.cloud.wso2.com/appmgt",
"icon": "fw fw-service fw-3x",
"dropDown": "true",
"target": "_self"
},
"Identity Cloud": {
"id": "integration_cloud",
"url": "https://identity.cloud.wso2.com/admin",
"icon": "fw fw-security fw-3x",
"dropDown": "true",
"target": "_self"
}
},
"Actions": {
"Organization": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/organization.jag",
"icon": "fw fw-organization fw-3x",
"dropDown": "true",
"target": "_self"
},
"Members": {
"url": "https://cloudmgt.cloud.wso2.com/cloudmgt/site/pages/user.jag",
"icon": "fa fa-users fa-3x",
"dropDown": "true",
"target": "_self"
}
}
}
}
}
}

@ -0,0 +1,24 @@
/*
* Copyright (c) 2017, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you under the Apache License,
* Version 2.0 (the "License"); you may not use this file except
* in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
$(document).ready(function(){
var expireModal = $('#expire-modal-content');
modalDialog.content(expireModal.find('.modal-body'));
modalDialog.header(expireModal.find('.modal-header .modal-title'));
modalDialog.footer(expireModal.find('.modal-footer'));
modalDialog.show();
});

@ -15,6 +15,7 @@
specific language governing permissions and limitations
under the License.
}}
{{unit "cdmf.unit.ui.modal"}}
<ul class="nav navbar-right float-remove-xs text-center-xs">
{{#each Main}}
<li class="visible-inline-block">
@ -26,23 +27,35 @@
{{#if this.isDomain }}
{{@user.domain}}
{{else}}
{{@key}}
{{#if this.label}}
{{this.label}}
{{else}}
{{@key}}
{{/if}}
{{/if}}
">
<span class="icon fw-stack fw-lg" {{#if this.isSupport}} style="color: #ff8c27;" {{/if}}>
<span class="icon fw-stack fw-lg" {{#if this.isSupport}} style="color: #ff8c27;" {{/if}} {{#if this.color}} style="color: {{this.color}};" {{/if}}>
<i class="{{this.icon}} fw-stack-1x" title="
{{#if this.isDomain }}
{{@user.domain}}
{{else}}
{{@key}}
{{#if this.label}}
{{this.label}}
{{else}}
{{@key}}
{{/if}}
{{/if}}
"></i>
</span>
<span class="hidden-xs {{#if this.isDomain }} username {{/if}}">
<span class="hidden-xs {{#if this.isDomain }} username {{/if}}" {{#if this.color}} style="color: {{this.color}};" {{/if}}>
{{#if this.isDomain }}
{{@user.domain}}
{{else}}
{{@key}}
{{#if this.label}}
{{this.label}}
{{else}}
{{@key}}
{{/if}}
{{/if}}
</span>
{{#if this.dropDownVisible}}
@ -136,6 +149,42 @@
</div>
</div>
{{#if Main.Account.isExpired}}
<div id="expire-modal-content" class="hide">
<div class="modal-header">
<h3 class="pull-left modal-title">
<span>
<span class="fw-stack">
<i class="fw fw-circle-outline fw-stack-2x"></i>
<i class="fw fw-alert fw-stack-1x"></i>
</span> Trial Expired
</span>
</h3>
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><i
class="fw fw-cancel"></i></button>
</div>
<div class="modal-body add-margin-top-2x add-margin-bottom-2x">
<div id="notification-error-msg" class="alert alert-danger hidden" role="alert">
<i class="icon fw fw-error"></i><span></span>
</div>
<div id="user-groups">Was it a successful trial? Your trial unfortunately expired, however it is really easy to upgrade to a paid plan and keep using WSO2 Device Cloud</div>
</div>
<div class="modal-footer">
<div class="buttons">
<a href="{{Main.Account.dropDown.[Upgrade Now].url}}" id="expire-upgrade-now-link" class="btn-operations">
Upgrade Now
</a>
<a href="{{Main.Account.dropDown.[Request Extension].url}}" id="expire-req-ext-link" class="btn-operations">
Request Exception
</a>
</div>
</div>
</div>
{{/if}}
{{#zone "bottomJs"}}
{{#if Main.Account.isExpired}}
{{js "/js/monetize.js"}}
{{/if}}
{{js "/js/user-menu.js"}}
{{/zone}}

@ -20,6 +20,10 @@ function onRequest(context) {
var constants = require("/app/modules/constants.js");
var mdmProps = require("/app/modules/conf-reader/main.js")["conf"];
var cloudProps = require("/app/modules/conf-reader/cloud.js")["conf"];
var log = new Log("user-menu.js");
var sqlDateFormatter = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
var user = context.user;
var isSuperTenant = false;
if (user.tenantId == -1234) {
@ -32,6 +36,79 @@ function onRequest(context) {
viewModal.Main.Domain.isDomain = true;
viewModal.Main.Support.isSupport = true;
//get billing info
var type = {PAID: "PAID", TRIAL: "TRIAL", FREE: "FREE"};
var status = {
ACTIVE: "ACTIVE",
INACTIVE: "INACTIVE",
EXTENDED: "EXTENDED",
PENDING_DISABLED: "PENDING_DISABLED",
DISABLED: "DISABLED"
};
var BILLING_INFO_KEY = 'BILLING_INFO_' + context.user.domain;
var BILLING_INFO_RETRY_COUNT_KEY = 'BILLING_INFO_RETRY_COUNT_' + context.user.domain;
if (viewModal.Main.Account.billingEnabled) {
if (!session.get(BILLING_INFO_KEY) || daysAfterLastCheck(session.get(BILLING_INFO_KEY).lastChecked) > 1) {
session.put(BILLING_INFO_RETRY_COUNT_KEY, 0);
getBillingData(getLoginCookie());
}
var billingInfo = session.get(BILLING_INFO_KEY);
var isExpired = false;
var isTrial = false;
var trialPeriod = 14;
var cloudMgtIndexPage = viewModal.Main.Account.cloudMgtIndexPage;
if (!billingInfo) {
log.info("Access denied for tenant: " + context.user.domain
+ " with a NULL subscription. Redirected to CloudMgt");
response.sendRedirect(cloudMgtIndexPage);
exit(0);
} else if (billingInfo.isPaidAccount && (billingInfo.billingPlanStatus === status.ACTIVE
|| billingInfo.billingPlanStatus === status.PENDING_DISABLED)) {
isExpired = false;
//change menu item name
delete viewModal.Main.Account.color;
delete viewModal.Main.Account["Request Extension"];
} else if (!billingInfo.isPaidAccount) {
var accountContent = "Account";
if (billingInfo.billingPlanStatus === status.ACTIVE || billingInfo.billingPlanStatus === status.EXTENDED) {
var currDate = new java.util.Date();
var endDate = sqlDateFormatter.parse(billingInfo.endDate);
var diff = endDate.getTime() - currDate.getTime();
isTrial = true;
if (diff > 0) {
noOfDays = java.util.concurrent.TimeUnit.MILLISECONDS.toDays(diff);
accountContent = "Trial - " + (noOfDays + 1) + " days to upgrade";
} else {
isExpired = true;
accountContent = "Trial Expired";
}
} else if (billingInfo.billingPlanStatus === status.INACTIVE) {
isExpired = false;
isTrial = true;
accountContent = "Trial " + (trialPeriod) + " days tade";
}
//change menu item name
viewModal.Main.Account.label = accountContent;
viewModal.Main.Account.isDomain = false;
viewModal.Main.Account.color = "red";
viewModal.Main.Account.isExpired = isExpired;
} else if (billingInfo.billingPlanStatus === status.DISABLED) {
log.info(
"Access denied for tenant: " + context.user.domain
+ " with a DISABLED subscription. Redirected to CloudMgt");
response.sendRedirect(cloudMgtIndexPage);
exit(0);
}
} else {
// delete viewModal.Main.Account;
viewModal.Main.Account = {"billingEnabled": false}
}
for (var key in viewModal.Main) {
var tempDropDownCheck = false;
@ -80,4 +157,63 @@ function onRequest(context) {
viewModal.USER_SESSION_KEY = session.get(constants["USER_SESSION_KEY"]);
viewModal.isCloud = mdmProps.isCloud;
return viewModal;
}
function getBillingData(cookie, attempt) {
serviceUrl = "https://cloudmgt.cloudstaging.wso2.com/cloudmgt/site/blocks/admin/admin.jag";
result = post(serviceUrl,
'action=getBillingStatusOfTenant&tenantDomain=' + context.user.domain + '&cloudType=device_cloud',
{"Cookie": cookie});
if (result.data) {
var billing = JSON.parse(result.data).data;
if (!billing.isPaidAccount && billing.billingPlanStatus === status.INACTIVE) {
var rv = post(serviceUrl,
'action=informFirstLogin&tenantDomain=' + context.user.domain + '&cloudType=device_cloud',
{"Cookie": cookie});
if (!attempt) attempt = 1;
var failStr = "First login capturing failed";
var successStr = "First login captured successfully";
if (rv.data.substring(0, failStr.length) === failStr && attempt < 3) {
getBillingData(cookie, ++attempt); //retry
} else if(rv.data.substring(0, successStr.length) === successStr) {
getBillingData(cookie); //get expiry details
}
} else {
session.put(BILLING_INFO_KEY, JSON.parse(result.data).data);
session.put(BILLING_INFO_RETRY_COUNT_KEY, 0);
}
}
}
function getLoginCookie(){
var retryCount = session.get(BILLING_INFO_RETRY_COUNT_KEY) || 0;
if (retryCount <= 3) {
retryCount++;
session.put(BILLING_INFO_RETRY_COUNT_KEY, retryCount);
var username = viewModal.Main.Account.billingApi.username;
var password = viewModal.Main.Account.billingApi.password;
var serviceUrl = "https://cloudmgt.cloudstaging.wso2.com/cloudmgt/site/blocks/user/authenticate/ajax/login.jag";
var result = post(serviceUrl, 'action=login&userName=' + username + '&password=' + password,
{"Content-Type": "application/x-www-form-urlencoded"});
if (result.data && result.data.trim() === "true") {
var cookieHeader = result.xhr.getResponseHeader("Set-Cookie");
if (cookieHeader) {
var cookie = cookieHeader.split(";")[0];
return cookie;
}
}
} else {
log.error("Billing info api failed after " + session.get(BILLING_INFO_RETRY_COUNT_KEY) + " attempts!");
}
}
function daysAfterLastCheck(checkedDate){
if(!checkedDate) return 0;
var currDate = new java.util.Date();
var endDate = sqlDateFormatter.parse(checkedDate);
var diff = endDate.getTime() - currDate.getTime();
if (diff > 0) {
return java.util.concurrent.TimeUnit.MILLISECONDS.toDays(diff);
}
return 0;
}
}
Loading…
Cancel
Save