API & Client: Profile update

This commit is contained in:
SamR1 2018-01-01 17:50:12 +01:00
parent 2c4f3c4462
commit 8e21fc4112
6 changed files with 68 additions and 8 deletions

View File

@ -1,5 +1,5 @@
import datetime
from flask import Blueprint, jsonify, request
from flask import Blueprint, current_app, jsonify, request
from sqlalchemy import exc, or_
from mpwo_api import appLog, bcrypt, db
@ -182,6 +182,21 @@ def edit_user(user_id):
bio = post_data.get('bio')
birth_date = post_data.get('birth_date')
location = post_data.get('location')
password = post_data.get('password')
password_conf = post_data.get('password_conf')
if password is not None and password != '':
if password_conf != password:
response_object = {
'status': 'error',
'message': 'Password and password confirmation don\'t match.\n'
}
return jsonify(response_object), 400
else:
password = bcrypt.generate_password_hash(
password, current_app.config.get('BCRYPT_LOG_ROUNDS')
).decode()
try:
user = User.query.filter_by(id=user_id).first()
user.first_name = first_name
@ -193,6 +208,8 @@ def edit_user(user_id):
if birth_date
else None
)
if password is not None and password != '':
user.password = password
db.session.commit()
response_object = {

View File

@ -19,6 +19,14 @@ function ProfileError(message) {
return { type: 'PROFILE_ERROR', message }
}
function PwdError(message) {
return { type: 'PWD_ERROR', message }
}
function initProfileFormData(user) {
return { type: 'INIT_PROFILE_FORM', user }
}
export const handleFormChange = (target, value) => ({
type: 'UPDATE_USER_FORMDATA',
target,
@ -31,10 +39,6 @@ export const updateProfileFormData = (target, value) => ({
value,
})
function initProfileFormData(user) {
return { type: 'INIT_PROFILE_FORM', user }
}
export function getProfile(dispatch) {
return mpwoApi
.getProfile()
@ -147,6 +151,10 @@ export function handleProfileFormSubmit(event) {
event.preventDefault()
return (dispatch, getState) => {
const state = getState()
if (state.formProfile.formProfile.password !==
state.formProfile.formProfile.passwordConf) {
dispatch(PwdError('Password and password confirmation don\'t match.'))
} else {
return mpwoApi
.updateProfile(state.formProfile.formProfile)
.then(ret => {
@ -161,4 +169,6 @@ export function handleProfileFormSubmit(event) {
throw error
})
}
}
}

View File

@ -17,6 +17,7 @@ class ProfileEdit extends React.Component {
const { formProfile,
onHandleFormChange,
onHandleProfileFormSubmit,
message,
user
} = this.props
return (
@ -24,6 +25,9 @@ class ProfileEdit extends React.Component {
<Helmet>
<title>mpwo - {user.username} - Edit Profile</title>
</Helmet>
{ message !== '' && (
<code>{message}</code>
)}
<div className="container">
<h1 className="page-title">Profile Edition</h1>
<div className="row">
@ -62,6 +66,29 @@ class ProfileEdit extends React.Component {
/>
</label>
</div>
<div className="form-group">
<label>
Password:
<input
name="password"
className="form-control input-lg"
type="password"
onChange={onHandleFormChange}
/>
</label>
</div>
<div className="form-group">
<label>
Password Confirmation:
<input
name="passwordConf"
className="form-control input-lg"
type="password"
onChange={onHandleFormChange}
/>
</label>
</div>
<hr />
<div className="form-group">
<label>
First Name:
@ -146,6 +173,7 @@ class ProfileEdit extends React.Component {
export default connect(
state => ({
formProfile: state.formProfile.formProfile,
message: state.message,
user: state.user,
}),
dispatch => ({

View File

@ -58,7 +58,9 @@ export default class MpwoApi {
last_name: form.lastName,
bio: form.bio,
location: form.location,
birth_date: form.birthdate,
birth_date: form.birthDate,
password: form.password,
password_conf: form.passwordConf,
}),
})
return fetch(request)

View File

@ -49,6 +49,7 @@ const message = (state = initial.message, action) => {
switch (action.type) {
case 'AUTH_ERROR':
case 'PROFILE_ERROR':
case 'PWD_ERROR':
return action.message
case 'LOGOUT':
case 'PROFILE_SUCCESS':

View File

@ -28,7 +28,9 @@ export default {
lastName: '',
bio: '',
location: '',
birthDate: ''
birthDate: '',
password: '',
passwordConf: ''
}
},
}