UNPKG

shadowsocks-manager

Version:

A shadowsocks manager tool for multi user and traffic control.

204 lines (203 loc) 6.44 kB
const app = angular.module('app'); const cdn = window.cdn || ''; app.factory('addAccountDialog', [ '$mdDialog', '$http', 'configManager', 'alertDialog', ($mdDialog, $http, configManager, alertDialog) => { const config = configManager.getConfig(); const publicInfo = { isGiftCardUse: config.giftcard, isRefCodeUse: config.refCode, }; publicInfo.isMacAddress = mac => { if(!mac) { return false; } const match = mac.toLowerCase().replace(/-/g, '').replace(/:/g, '').match(/^[0-9a-f]{12}$/); if(!match) { return false; } return match[0]; }; publicInfo.status = 'choose'; publicInfo.accountType = 'port'; const hide = () => { return $mdDialog.hide() .then(success => { dialogPromise = null; return; }).catch(err => { dialogPromise = null; return; }); }; publicInfo.hide = hide; let dialogPromise = null; const isDialogShow = () => { if(dialogPromise && !dialogPromise.$$state.status) { return true; } return false; }; const dialog = { templateUrl: `${ cdn }/public/views/dialog/addAccount.html`, escapeToClose: false, locals: { bind: publicInfo }, bindToController: true, controller: ['$scope', '$mdMedia', '$mdDialog', '$http', '$localStorage', 'bind', function($scope, $mdMedia, $mdDialog, $http, $localStorage, bind) { $scope.publicInfo = bind; $scope.setDialogWidth = () => { if($mdMedia('xs') || $mdMedia('sm')) { return {}; } return { 'min-width': '400px', 'max-width': '640px' }; }; $scope.$watch('publicInfo.mac.account', () => { if(!$scope.publicInfo.mac) { return; } const account = $scope.publicInfo.account.filter(f => { return f.id === $scope.publicInfo.mac.account; })[0]; if(!account || !account.server) { $scope.publicInfo.validServer = $scope.publicInfo.server; } else { $scope.publicInfo.validServer = $scope.publicInfo.server.filter(f => { return JSON.parse(account.server).indexOf(f.id) >= 0; }); } }); } ], clickOutsideToClose: true, }; const getAccountPort = () => { publicInfo.status = 'port'; publicInfo.isLoading = true; $http.get('/api/admin/user/account').then(success => { publicInfo.isLoading = false; publicInfo.account = success.data; }); }; const macAddress = () => { publicInfo.status = 'mac'; publicInfo.mac = { account: publicInfo.account[0] ? publicInfo.account[0].id : null, server: publicInfo.server[0].id, }; }; const getUserAccount = () => { publicInfo.status = 'giftcard'; publicInfo.isLoading = true; $http.get(`/api/admin/user/${ publicInfo.userId }`).then(success => { publicInfo.isLoading = false; publicInfo.userAccount = success.data.account; }); }; const addRefCode = () => { publicInfo.status = 'refCode'; publicInfo.refCodeNumber = 1; publicInfo.refUserNumber = 1; publicInfo.addRefCodeForUser = () => { publicInfo.isLoading = true; $http.post(`/api/admin/ref/code/${ publicInfo.userId }`, { number: publicInfo.refCodeNumber, max: publicInfo.refUserNumber, }).then(success => { hide(); }).catch(err => { alertDialog.show('添加失败', '确定'); }); }; }; const next = () => { if(publicInfo.accountType === 'port') { getAccountPort(); } else if(publicInfo.accountType === 'mac') { macAddress(); } else if(publicInfo.accountType === 'giftcard') { getUserAccount(); } else if(publicInfo.accountType === 'refCode') { addRefCode(); } }; publicInfo.next = next; const setPort = () => { const promises = []; publicInfo.account.forEach(f => { if(f.isChecked) { promises.push($http.put(`/api/admin/user/${ publicInfo.userId }/${ f.id }`)); } }); Promise.all(promises) .then(success => { hide(); }); }; publicInfo.setPort = setPort; const setMac = () => { $http.post(`/api/admin/account/mac/${ publicInfo.isMacAddress(publicInfo.mac.macAddress) }`, { userId: publicInfo.userId, accountId: publicInfo.mac.account, serverId: publicInfo.mac.server }).then(success => { hide(); }); }; publicInfo.setMac = setMac; const editMac = () => { $http.put('/api/admin/account/mac', { id: publicInfo.mac.id, macAddress: publicInfo.isMacAddress(publicInfo.mac.macAddress), accountId: publicInfo.mac.account, serverId: publicInfo.mac.server }).then(success => { hide(); }); }; publicInfo.editMac = editMac; const checkGiftCard = () => { $http.post('/api/admin/giftcard/use', { password: publicInfo.giftcardCode, userId: publicInfo.userId, accountId: publicInfo.giftcardAccountId === '0' ? null : +publicInfo.giftcardAccountId, }).then(result => { if(!result.data.success) { alertDialog.show(result.data.message, '确定'); } else { alertDialog.show('充值成功', '确定'); } }); }; publicInfo.checkGiftCard = checkGiftCard; const edit = (accountInfo, account, server) => { publicInfo.account = account; publicInfo.server = server; publicInfo.mac = { id: accountInfo.id, macAddress: accountInfo.mac, account: accountInfo.accountId, server: accountInfo.serverId, }; publicInfo.isLoading = false; publicInfo.status = 'edit'; if(isDialogShow()) { return dialogPromise; } dialogPromise = $mdDialog.show(dialog); return dialogPromise; }; const show = (userId, account, server, id) => { publicInfo.status = 'choose'; publicInfo.userId = userId; publicInfo.account = account; publicInfo.server = server; publicInfo.id = id; publicInfo.isLoading = false; if(publicInfo.id !== 1) { publicInfo.accountType = 'mac'; next(); } if(isDialogShow()) { return dialogPromise; } dialogPromise = $mdDialog.show(dialog); return dialogPromise; }; return { show, edit, }; }]);