BugFix in verification subsystem
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import traceback
|
||||
from account.models import PhoneVerificationService
|
||||
|
||||
# как создавать ошибку
|
||||
# raise Exception(API_ERROR_XXX, <related_obj>)
|
||||
@@ -20,6 +21,22 @@ API_ERROR_INVALID_TOKEN = (503, 'invalid token')
|
||||
# времненное решение, позже нужно будет заменить на конкретные ошибки
|
||||
API_ERROR_USER_REGISTER = (510, 'user registration error')
|
||||
|
||||
API_ERROR_VALIDATION_INVALID_CODE = (520, 'invalid code')
|
||||
API_ERROR_VALIDATION_MAX_ATTEMPTS = (521, 'max attempts')
|
||||
API_ERROR_VALIDATION_CURRENTLY_VERIFIED = (522, 'currently phone is verified')
|
||||
API_ERROR_VALIDATION_FAILED = (523, 'cannot be verified')
|
||||
API_ERROR_VALIDATION_NOT_READY = (524, 'verification service not ready. call this method later')
|
||||
API_ERROR_VALIDATION_NOT_FOUND = (525, 'verification service did not send code. call this method without \'code\'')
|
||||
API_ERROR_VALIDATION_UNKNOWN = (526, 'unknown verification error')
|
||||
|
||||
API_ERROR_VALIDATION = {
|
||||
PhoneVerificationService.CHECK_PHONE_INVALID_CODE: API_ERROR_VALIDATION_INVALID_CODE,
|
||||
PhoneVerificationService.CHECK_PHONE_MAX_ATTEMPTS: API_ERROR_VALIDATION_MAX_ATTEMPTS,
|
||||
PhoneVerificationService.CHECK_PHONE_FAILED: API_ERROR_VALIDATION_FAILED,
|
||||
PhoneVerificationService.CHECK_PHONE_NOT_READY: API_ERROR_VALIDATION_NOT_READY,
|
||||
PhoneVerificationService.CHECK_PHONE_NOT_FOUND: API_ERROR_VALIDATION_NOT_FOUND,
|
||||
}
|
||||
|
||||
|
||||
def make_error_object(ex: Exception):
|
||||
try:
|
||||
|
@@ -1,5 +1,5 @@
|
||||
import traceback
|
||||
import account.models
|
||||
from account.models import *
|
||||
from .api_utils import *
|
||||
from .models import *
|
||||
from django.core.exceptions import *
|
||||
@@ -26,7 +26,7 @@ def account_register(params):
|
||||
email = api_get_param_str(params, "email")
|
||||
password = api_get_param_str(params, "password")
|
||||
|
||||
user = account.models.SiteUser(
|
||||
user = SiteUser(
|
||||
name=name,
|
||||
surname=surname,
|
||||
phone=phone,
|
||||
@@ -47,14 +47,55 @@ def account_register(params):
|
||||
user.delete()
|
||||
raise ex
|
||||
|
||||
except ValidationError as e:
|
||||
except ValidationError as validation_error:
|
||||
traceback.print_exc()
|
||||
raise Exception(API_ERROR_USER_REGISTER, e.message_dict)
|
||||
errors = {}
|
||||
for field_name in validation_error.error_dict:
|
||||
err_list = validation_error.error_dict[field_name]
|
||||
print(err_list)
|
||||
obj = []
|
||||
for err in err_list:
|
||||
obj.append({
|
||||
"code": err.code
|
||||
})
|
||||
errors[field_name] = obj
|
||||
raise Exception(API_ERROR_USER_REGISTER, errors)
|
||||
|
||||
|
||||
def account_verify_phone(params):
|
||||
user = _reqire_access_token(params)
|
||||
|
||||
if user.is_phone_verified:
|
||||
raise Exception(API_ERROR_VALIDATION_CURRENTLY_VERIFIED)
|
||||
|
||||
code = api_get_param_int(params, "code", False, None)
|
||||
|
||||
if code is None:
|
||||
PhoneVerificationService.send_verify(user.phone)
|
||||
return api_make_response({"action": "phone_call"})
|
||||
else:
|
||||
res, err_code = PhoneVerificationService.check_code(user.phone, code)
|
||||
|
||||
if res:
|
||||
user.is_phone_verified = True
|
||||
user.save()
|
||||
return api_make_response({"status": "success"})
|
||||
else:
|
||||
if err_code in API_ERROR_VALIDATION:
|
||||
raise Exception(API_ERROR_VALIDATION[err_code])
|
||||
else:
|
||||
raise Exception(API_ERROR_VALIDATION_UNKNOWN)
|
||||
|
||||
|
||||
def account_get(params):
|
||||
user = _reqire_access_token(params)
|
||||
return api_make_response({"name": user.name, "surname": user.surname, "email": user.email, "phone": user.phone})
|
||||
return api_make_response({
|
||||
"name": user.name,
|
||||
"surname": user.surname,
|
||||
"email": user.email,
|
||||
"phone": user.phone,
|
||||
"phone_verified": user.is_phone_verified
|
||||
})
|
||||
|
||||
|
||||
def __make_argument_doc(name, arg_type, description, required=True):
|
||||
@@ -83,13 +124,25 @@ api_methods = {
|
||||
],
|
||||
"returns": "В случае правильных логина и пароля <code>access_token</code>. В противном случае объект ошибки."
|
||||
},
|
||||
|
||||
"account.register": {
|
||||
"func": account_register,
|
||||
"doc": "Регистрация нового пользователя",
|
||||
"params": [
|
||||
|
||||
],
|
||||
"returns": "Поля пользователя (name, surname, email, phone)."
|
||||
"returns": "Поля пользователя (name, surname, email, phone, phone_verified)."
|
||||
},
|
||||
|
||||
"account.verifyPhone": {
|
||||
"func": account_verify_phone,
|
||||
"doc": "Запросить верификацию номера телефона."
|
||||
"Если телефон уже верифицирован, метод вернет соответствующую ошибку",
|
||||
"params": [
|
||||
__make_argument_access_token(),
|
||||
__make_argument_doc("code", __doc_type_string, "Код верификации. Если не передать, будет выполнен звонок"),
|
||||
],
|
||||
"returns": '{"status": "success"}, если верификация пройдена. Иначе одну из стандартных ошибок'
|
||||
},
|
||||
|
||||
"account.get": {
|
||||
@@ -98,6 +151,6 @@ api_methods = {
|
||||
"params": [
|
||||
__make_argument_access_token()
|
||||
],
|
||||
"returns": "Поля пользователя (name, surname, email, phone)."
|
||||
"returns": "Поля пользователя (name, surname, email, phone, phone_verified)."
|
||||
},
|
||||
}
|
||||
|
@@ -45,10 +45,11 @@ class UserToken(models.Model):
|
||||
|
||||
@staticmethod
|
||||
def get_user_by_token(token: str):
|
||||
t = UserToken.objects.get(access_token=token)
|
||||
if t is None:
|
||||
t = UserToken.objects.filter(access_token=token)
|
||||
|
||||
if len(t) == 0:
|
||||
raise Exception(API_ERROR_INVALID_TOKEN)
|
||||
return t.user
|
||||
return t[0].user
|
||||
|
||||
def __str__(self):
|
||||
return self.user.email + ": " + self.access_token[:10] + "..."
|
||||
|
Reference in New Issue
Block a user