From 06ad75b68835516ec93d6d7eb84a25f37f4201cc Mon Sep 17 00:00:00 2001 From: ivan Date: Fri, 9 Sep 2016 02:24:12 -0300 Subject: [PATCH] Ivan - Backend - Fixes to make frontend work with API [skip ci] --- client/gulp/tasks/server.js | 2 +- client/src/actions/session-actions.js | 19 +++++--- client/src/app/main/captcha.js | 6 +-- .../create-ticket-form.js | 5 ++- .../dashboard-ticket/ticket-action.js | 2 +- .../dashboard-ticket/ticket-viewer.js | 45 ++++++++++++++++++- client/src/app/main/main-layout-header.js | 22 +++++++-- .../main-recover-password-page.js | 4 +- .../app/main/main-signup/main-signup-page.js | 1 + client/src/data/i18n-data.js | 2 +- client/src/lib-app/api-call.js | 5 ++- server/controllers/user.php | 2 + server/controllers/user/signup.php | 21 +++++---- server/data/ERRORS.php | 1 + 14 files changed, 106 insertions(+), 31 deletions(-) diff --git a/client/gulp/tasks/server.js b/client/gulp/tasks/server.js index eef6a3bb..4242f39d 100644 --- a/client/gulp/tasks/server.js +++ b/client/gulp/tasks/server.js @@ -17,7 +17,7 @@ gulp.task('server', function() { server.use(express.static(config.buildDir)); // Proxy php server api - server.use('/api', proxy('http://localhost:8080/', { + server.use('/api', proxy('http://localhost:8080', { forwardPath: function(req, res) { return require('url').parse(req.url).path; } diff --git a/client/src/actions/session-actions.js b/client/src/actions/session-actions.js index 3509d6a0..90aa07ae 100644 --- a/client/src/actions/session-actions.js +++ b/client/src/actions/session-actions.js @@ -12,7 +12,7 @@ export default { path: '/user/login', data: loginData }).then((result) => { - store.dispatch(this.getUserData(result.data.userId)); + store.dispatch(this.getUserData(result.data.userId, result.data.token)); return result; }) @@ -32,7 +32,7 @@ export default { isAutomatic: true } }).then((result) => { - store.dispatch(this.getUserData(result.data.userId)); + store.dispatch(this.getUserData(result.data.userId, result.data.token)); return result; }) @@ -49,14 +49,21 @@ export default { }; }, - getUserData(userId) { + getUserData(userId, token) { + let data = {}; + + if (userId && token) { + data = { + csrf_userid: userId, + csrf_token: token + }; + } + return { type: 'USER_DATA', payload: API.call({ path: '/user/get', - data: { - userId: userId - } + data: data }) } }, diff --git a/client/src/app/main/captcha.js b/client/src/app/main/captcha.js index 41a4b3c3..566e322b 100644 --- a/client/src/app/main/captcha.js +++ b/client/src/app/main/captcha.js @@ -14,13 +14,13 @@ class Captcha extends React.Component { } render() { - return ( + return (this.props.sitekey) ? ( {this.setState({value})}} tabIndex="0" /> - ); + ) :
; } getValue() { - return this.state.value; + return (this.props.sitekey) ? this.state.value : 'valid'; } focus() { diff --git a/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js b/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js index ae981c6a..17dd484b 100644 --- a/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js +++ b/client/src/app/main/dashboard/dashboard-create-ticket/create-ticket-form.js @@ -1,4 +1,5 @@ import React from 'react'; +import _ from 'lodash'; import ReCAPTCHA from 'react-google-recaptcha'; import { browserHistory } from 'react-router'; @@ -90,7 +91,9 @@ class CreateTicketForm extends React.Component { API.call({ path: '/ticket/create', - data: formState + data: _.extend({}, formState, { + departmentId: formState.departmentId + 1 + }) }).then(this.onTicketSuccess.bind(this)).catch(this.onTicketFail.bind(this)); } diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js index 345a3840..8a9925d5 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-action.js @@ -50,7 +50,7 @@ class TicketAction extends React.Component { ({i18n((config.author.staff) ? 'STAFF' : 'CUSTOMER')})
{config.date}
-
{config.content}
+
{this.renderFileRow(config.file)} ); diff --git a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js index 857cecd4..f594aa89 100644 --- a/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js +++ b/client/src/app/main/dashboard/dashboard-ticket/ticket-viewer.js @@ -1,6 +1,11 @@ import React from 'react'; +import _ from 'lodash'; + +import i18n from 'lib-app/i18n'; +import API from 'lib-app/api-call'; +import store from 'app/store'; +import SessionActions from 'actions/session-actions'; -import i18n from 'lib-app/i18n'; import TicketAction from 'app/main/dashboard/dashboard-ticket/ticket-action'; import Form from 'core-components/form'; import FormField from 'core-components/form-field'; @@ -19,6 +24,15 @@ class TicketViewer extends React.Component { } }; + constructor(props) { + super(props); + + this.state = { + loading: false + }; + } + + render() { return (
@@ -45,7 +59,7 @@ class TicketViewer extends React.Component {
{i18n('RESPOND')}
-
+ {i18n('RESPOND_TICKET')} @@ -60,6 +74,33 @@ class TicketViewer extends React.Component { ); } + + onSubmit(formState) { + this.setState({ + loading: true + }); + + API.call({ + path: '/ticket/comment', + data: _.extend({ + ticketNumber: this.props.ticket.ticketNumber + }, formState) + }).then(this.onCommentSuccess.bind(this), this.onCommentFail.bind(this)); + } + + onCommentSuccess() { + this.setState({ + loading: false + }); + + store.dispatch(SessionActions.getUserData()); + } + + onCommentFail() { + this.setState({ + loading: false + }); + } } export default TicketViewer; \ No newline at end of file diff --git a/client/src/app/main/main-layout-header.js b/client/src/app/main/main-layout-header.js index e636d73c..dc0d4ac3 100644 --- a/client/src/app/main/main-layout-header.js +++ b/client/src/app/main/main-layout-header.js @@ -55,7 +55,7 @@ class MainLayoutHeader extends React.Component { return { className: 'main-layout-header__languages', items: this.getLanguageList(), - selectedIndex: Object.keys(codeLanguages).map((key) => codeLanguages[key]).indexOf(this.props.config.language), + selectedIndex: Object.keys(codeLanguages).map((key) => codeLanguages[key]).indexOf(this.getPropLanguage()), onChange: this.changeLanguage.bind(this) }; } @@ -69,10 +69,24 @@ class MainLayoutHeader extends React.Component { }); } - changeLanguage(event) { - let language = Object.keys(codeLanguages)[event.index]; + getPropLanguage() { + let language = this.props.config.language; - this.props.dispatch(ConfigActions.changeLanguage(codeLanguages[language])); + if (language === 'en') { + language = 'us'; + } + + return language; + } + + changeLanguage(event) { + let language = codeLanguages[Object.keys(codeLanguages)[event.index]]; + + if (language === 'us') { + language = 'en'; + } + + this.props.dispatch(ConfigActions.changeLanguage(language)); } } diff --git a/client/src/app/main/main-recover-password/main-recover-password-page.js b/client/src/app/main/main-recover-password/main-recover-password-page.js index ce146a13..3c791bc2 100644 --- a/client/src/app/main/main-recover-password/main-recover-password-page.js +++ b/client/src/app/main/main-recover-password/main-recover-password-page.js @@ -32,8 +32,8 @@ class MainRecoverPasswordPage extends React.Component {
- - + +
{i18n('SUBMIT')} diff --git a/client/src/app/main/main-signup/main-signup-page.js b/client/src/app/main/main-signup/main-signup-page.js index b45afbba..fa14d8f9 100644 --- a/client/src/app/main/main-signup/main-signup-page.js +++ b/client/src/app/main/main-signup/main-signup-page.js @@ -4,6 +4,7 @@ import _ from 'lodash'; import i18n from 'lib-app/i18n'; import API from 'lib-app/api-call'; +import SessionStore from 'lib-app/session-store'; import Captcha from 'app/main/captcha'; import SubmitButton from 'core-components/submit-button'; diff --git a/client/src/data/i18n-data.js b/client/src/data/i18n-data.js index aa15af21..720a0378 100644 --- a/client/src/data/i18n-data.js +++ b/client/src/data/i18n-data.js @@ -7,7 +7,7 @@ import turkishLanguage from 'data/languages/en'; import indianLanguage from 'data/languages/en'; const languages = { - 'us': englishLanguage, + 'en': englishLanguage, 'es': spanishLanguage, 'de': germanLanguage, 'fr': frenchLanguage, diff --git a/client/src/lib-app/api-call.js b/client/src/lib-app/api-call.js index d3488819..10d8593b 100644 --- a/client/src/lib-app/api-call.js +++ b/client/src/lib-app/api-call.js @@ -5,7 +5,10 @@ const SessionStore = require('lib-app/session-store'); const root = 'http://localhost:3000/api'; function processData (data) { - return _.extend(SessionStore.getSessionData(), data); + return _.extend({ + csrf_token: SessionStore.getSessionData().token, + csrf_userid: SessionStore.getSessionData().userId + }, data); } module.exports = { diff --git a/server/controllers/user.php b/server/controllers/user.php index 94e1b60b..445d3000 100644 --- a/server/controllers/user.php +++ b/server/controllers/user.php @@ -2,6 +2,7 @@ include 'user/login.php'; include 'user/signup.php'; include 'user/logout.php'; +include 'user/check-session.php'; include 'user/recover-password.php'; include 'user/send-recover-password.php'; include 'user/edit-password.php'; @@ -14,6 +15,7 @@ $userControllers->setGroupPath('/user'); $userControllers->addController(new LoginController); $userControllers->addController(new SignUpController); $userControllers->addController(new LogoutController); +$userControllers->addController(new CheckSessionController); $userControllers->addController(new SendRecoverPasswordController); $userControllers->addController(new RecoverPasswordController); $userControllers->addController(new EditPassword); diff --git a/server/controllers/user/signup.php b/server/controllers/user/signup.php index 4a188419..c112b906 100644 --- a/server/controllers/user/signup.php +++ b/server/controllers/user/signup.php @@ -37,18 +37,21 @@ class SignUpController extends Controller { public function handler() { $this->storeRequestData(); - try { - $userId = $this->createNewUserAndRetrieveId(); - $this->sendRegistrationMail(); + $existentUser = User::getUser($this->userEmail, 'email'); - Response::respondSuccess([ - 'userId' => $userId, - 'userEmail' => $this->userEmail - ]); - } catch (Exception $e) { - Response::respondError($e->getMessage()); + if (!$existentUser->isNull()) { + Response::respondError(ERRORS::USER_EXISTS); + return; } + $userId = $this->createNewUserAndRetrieveId(); + $this->sendRegistrationMail(); + + Response::respondSuccess([ + 'userId' => $userId, + 'userEmail' => $this->userEmail + ]); + } public function storeRequestData() { diff --git a/server/data/ERRORS.php b/server/data/ERRORS.php index 82c6eba4..2e627cb9 100644 --- a/server/data/ERRORS.php +++ b/server/data/ERRORS.php @@ -2,6 +2,7 @@ class ERRORS { const INVALID_CREDENTIALS = 'User or password is not defined'; const SESSION_EXISTS = 'User is already logged in'; + const USER_EXISTS = 'Email already exists'; const NO_PERMISSION = 'You have no permission to access'; const INVALID_TITLE = 'Invalid title'; const INVALID_CONTENT = 'Invalid content';