def confirm(self, args): """ Confirm user account with valid verification code. :param args: Input data :return: Confirmation status """ email = args['email'] code = args['code'] user = User.get_user_by_email(email) # Check if already confirmed if user.confirmed_at: return json_response(message='Account has been already verified.') # Verify and confirm account if user.verify_secret_code(code): user.confirm_email() user.save() db.session.commit() return json_response(message='Verification has been completed.') # Output error for incorrect verification code return json_response_with_error( code=422, errors={'code': ['Incorrect verification code.']}, message='Incorrect verification code or has expired.')
def reset_password(self, args): """ Reset user password. :param args: Input data :return: Request status """ email = args['email'] password = args['password'] code = args['code'] user = User.get_user_by_email(email) # Verify and reset password if user.verify_secret_code(code): user.password = password user.secret_code = None user.save() db.session.commit() return json_response( message='Password has been successfully changed.') # Output error for incorrect verification code return json_response_with_error( code=422, errors={'code': ['Incorrect verification code.']}, message='Incorrect verification code or has expired.')
def request_code(self, args): """ Send new secret code. :param args: Input data :return: Request Status """ email = args['email'] user = User.get_user_by_email(email) # Return new code or false code = user.generate_secret_code() if code: # Send email with new verification code from app.tasks.user_tasks import send_verification_code_email send_verification_code_email.delay(email, code) # Save new code user.save() db.session.commit() return json_response(message='Verification code has been sent.') return json_response_with_error( code=403, errors={ 'limit': [ 'You must wait 5 minutes before you can request another code.' ] }, message='You can only request new code after each 5 minutes.')
def change_card_id(self, args, todo_id): """ Change todo card ID. :param args: Validated input :param todo_id: Todo ID :return: Action status with new info """ # Fetch todo todo = Todo.query.get(todo_id) # Update card ID if not args['card_id'] == todo.card_id: todo.card_id = args['card_id'] todo.save() db.session.commit() # Define schema todo_schema = TodoSchema() # Return output return json_response( code=200, message='Todo information has been successfully updated.', data=todo_schema.dump(todo).data)
def create(self, args): """ Perform user signup. :param args: New user validated information :return: New user account information """ # Create new user user = User(**args) user.secret_code = generate_secret_key(6, False) user.save() db.session.commit() # Send welcome email from app.tasks.user_tasks import send_welcome_email send_welcome_email.delay(user.email) # Send verification code from app.tasks.user_tasks import send_verification_code_email send_verification_code_email.delay(user.email, user.secret_code) # Respond with user data user_schema = UserSchema() return json_response(code=201, message='Successfully created an user account.', data=[user_schema.dump(user).data])
def authenticate(self, args): """ Authenticate and return user access token. :param args: Input data :return: Access token or errors """ email = args['email'] password = args['password'] user = User.get_user_by_email(email) # Verify user password if user.verify_password(password): # Create token token = user.generate_token() return json_response(message='Successfully authenticated.', data={'access_token': token.decode()}) return json_response_with_error( status='unauthorized', code=401, errors={'password': ['Password mismatch.']}, message='Unable to authenticate user account.')
def change_parent(self, args, card_id): """ Change card parent ID. :param args: Validated input :param card_id: Card ID :return: Status with new info """ # Fetch card card = Card.query.get(card_id) if card.change_parent(args['parent_card_id']): # Save updated info card.save() db.session.commit() # Define schema card_schema = CardSchema() # Return output return json_response( code=200, message='Card information has been successfully updated.', data=card_schema.dump(card).data) # Return error output return json_response_with_error( code=422, errors={'parent_card_id': ['Invalid parent card id.']}, message='You can not use child card as a parent card.')
def read(self): """ Read user account information. :return: User account information. """ user_schema = UserSchema() return json_response( message='User account information enquiry was successful.', data=[user_schema.dump(current_user).data])
def cards_feed(self): """ Fetch cards with child cards and todo list. :return: JSON response """ # Fetch cards cards = Card.query.filter_by(parent_card=None, owner_id=current_user.id) # Define schema cards_feed_schema = CardFeedsSchema(many=True) # Return output return json_response(code=200, message='Cards feed enquiry was successful.', data=cards_feed_schema.dump(cards).data)
def delete(self, card_id): """ Delete card and associate child cards with todo list. :param card_id: Card ID :return: Action status """ # Delete card card = Card.query.get(card_id) db.session.delete(card) db.session.commit() # Return output return json_response( code=200, message='Card has been deleted successfully.', )
def card_feeds(self, card_id): """ Read single card feeds. :param card_id: Card ID :return: JSON Response """ # Fetch card card = Card.query.get(card_id) # Define schema card_feeds_schema = CardFeedsSchema() # Return output return json_response(code=200, message='Card feeds enquiry was successful.', data=card_feeds_schema.dump(card).data)
def read(self, todo_id): """ Read single todo. :param todo_id: Todo ID :return: JSON response """ # Fetch todo todo = Todo.query.get(todo_id) # Define schema todo_schema = TodoSchema() # Return output return json_response(code=200, message='Todo enquiry was successful.', data=todo_schema.dump(todo).data)
def delete(self, todo_id): """ Delete todo. :param todo_id: Todo ID :return Action status """ # Delete todo todo = Todo.query.get(todo_id) db.session.delete(todo) db.session.commit() # Return output return json_response( code=200, message='Card has been deleted successfully.', )
def read_all(self): """ Read all todo list. :return: Todo list data """ # Get arg state = request.args.get(key='state', default='all', type=str) # Fetch todo list todos = get_todo_list(state) # Define schema todos_schema = TodoSchema(many=True) # Return output return json_response(code=200, message='Todo list enquiry was successful.', data=todos_schema.dump(todos).data)
def create(self, args): """ Create new todo. :param args: New todo validated information :return: New todo data """ # Create new todo args['owner_id'] = current_user.id todo = Todo(**args) todo.save() db.session.commit() # Respond with new todo data todo_schema = TodoSchema() return json_response(code=201, message='Successfully created a new todo.', data=[todo_schema.dump(todo).data])
def update(self, args): """ Update user information. :param args: Input data :return: Updated information. """ # Update new info user = current_user user.first_name = args['first_name'] user.last_name = args['last_name'] user.save() db.session.commit() user_schema = UserSchema() return json_response( message='Account information has been successfully updated.', data=[user_schema.dump(user).data])
def create(self, args): """ Create new card. :param args: New card validated information :return: New card data """ # Create new card args['owner_id'] = current_user.id card = Card(**args) card.save() db.session.commit() # Respond with new card data card_schema = CardSchema() return json_response(code=201, message='Successfully created a new card.', data=[card_schema.dump(card).data])
def update(self, args, todo_id): """ Update todo info. :param args: Validated input :param todo_id: Todo ID :return: Updated information """ # Get args title = args['title'] note = args['note'] due_date = args['due_date'] # Update todo changed = False todo = Todo.query.get(todo_id) if title and not title == todo.title: todo.title = title changed = False if note and not note == todo.note: todo.note = note changed = False if due_date and not due_date == todo.due_date: todo.due_date = due_date changed = False # Save new record if changed: todo.save() db.session.commit() # Define schema todo_schema = TodoSchema() # Return output return json_response( code=200, message='Todo information has been successfully updated.', data=todo_schema.dump(todo).data)
def todos(self, card_id): """ Read specific card todos. :param card_id: Card ID :return: Card todo list """ # Get args state = request.args.get(key='state', default='all', type=str) # Fetch todo list todos = get_todo_list(card_id, state) # Define schema todos_schema = TodoSchema(many=True) # Return output return json_response(code=200, message='Card todos enquiry was successful.', data=todos_schema.dump(todos).data)
def mark_complete(self, todo_id): """ Mark todo as completed. :param todo_id: Todo ID :return: Action status """ # Fetch todo todo = Todo.query.get(todo_id) # Mark complete todo.completed_at = datetime.now() todo.completed = True todo.save() db.session.commit() # Return output return json_response( code=200, message='Todo has been marked completed.', )
def update(self, args, card_id): """ Update card info. :param args: Validated input :param card_id: Card ID :return: Status with updated info """ # Extract args title = args['title'] note = args['note'] # Update card changed = False card = Card.query.get(card_id) if not title == card.title: card.title = title changed = True if note and not note == card.note: card.note = note changed = True # Save new record if changed: card.save() db.session.commit() # Define schema card_schema = CardSchema() # Return output return json_response( code=200, message='Card information has been successfully updated.', data=card_schema.dump(card).data)