func userPost(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)
	user := &UserDao.UserDTO{}

	decoder := json.NewDecoder(r.Body)
	err := decoder.Decode(user)
	if err != nil {
		ctx.Errorf(err.Error())
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	if err := UserDao.CreateUser(ctx, user); err != nil {
		if err == UserDao.EmailAlreadyExistsError {
			http.Error(w, err.Error(), http.StatusConflict)
			ctx.Infof(err.Error())
			return
		}
		ctx.Errorf(err.Error())
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	if _, err := AppEngineHelper.WriteJSON(w, user); err != nil {
		ctx.Errorf(err.Error())
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
}
func getUserTransactionsHandler(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)

	user, err := getUserFromSession(ctx, r)
	if err != nil {
		// User is not authorised sending back an empty response
		return
	}

	transactions, err := TransactionDao.GetTransactionsByUser(ctx, user.GetDataStoreKey(ctx))
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	txnClientDtoList := make([]*TransactionMsgClientDTO, len(transactions))

	for i, txn := range transactions {
		txnClientDtoList[i] = newTransactionMsgClientDTO(txn)
	}

	if _, err := AppEngineHelper.WriteJSON(w, txnClientDtoList); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
}
func getUserFromSessionHandler(w http.ResponseWriter, r *http.Request) {
	ctx := appengine.NewContext(r)

	user, err := getUserFromSession(ctx, r)
	if err != nil {
		http.Error(w, err.Error(), http.StatusUnauthorized)
		return
	}

	if _, err := AppEngineHelper.WriteJSON(w, user); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}
}
func doLogin(w http.ResponseWriter, r *http.Request) {

	var (
		user *UserDao.UserDTO
		uuid string
		err  error
	)

	ctx := appengine.NewContext(r)

	loginRequestUser := new(UserLogin)

	decoder := json.NewDecoder(r.Body)
	if err = decoder.Decode(loginRequestUser); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	if !loginRequestUser.hasValues() {
		http.Error(w, invalidLoginError.Error(), http.StatusBadRequest)
		return
	}

	user, err = UserDao.GetUserByEmail(ctx, loginRequestUser.Email)
	if user == nil || err == UserDao.UserNotFoundError {
		ctx.Errorf("Failed to login, %s does not exist in DB", loginRequestUser.Email)
		http.Error(w, "Invalid credentials", http.StatusUnauthorized)
		return
	}
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	if err := user.VerifyPassword(loginRequestUser.Password); err != nil {
		ctx.Errorf("Failed to login, %s Invalid password", loginRequestUser.Email)
		ctx.Errorf(err.Error())
		http.Error(w, "Invalid credentials", http.StatusUnauthorized)
		return
	}

	uuid, err = generateUUID()
	if err != nil {
		http.Error(w, "Error Generating UUID", http.StatusInternalServerError)
		return
	}

	err = setSessionCookie(w, uuid)
	if err != nil {
		http.Error(w, err.Error(), http.StatusUnauthorized)
		return
	}

	err = UserDao.SetSessionUUID(ctx, user, uuid)
	if err != nil {
		http.Error(w, err.Error(), http.StatusUnauthorized)
		return
	}

	if _, err := AppEngineHelper.WriteJSON(w, user); err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

}