app/controller/user_controller.py
"""File for the user controller."""
from flask import jsonify
from flask import request
import datetime
import jwt
from ..utility.validation import Valid
from ..utility.auth import my_secret_key
from ..models.model_users import (
Base, User, Credential)
from ..db.ireporter_db import DatabaseConnection
db = DatabaseConnection()
class UserController:
""" Class for user controller."""
validator = Valid()
def __init__(self):
""" Class constructor for the User Controller.
"""
pass
def register_user(self):
""" Controller logic for signup class method.
"""
data = request.get_json()
first_name = data.get("first_name")
last_name = data.get("last_name")
other_name = data.get("other_name")
phone_number = data.get("phone_number")
email = data.get("email")
user_name = data.get("user_name")
password = data.get("password")
is_admin = data.get("is_admin")
user_attributes = [
"first_name",
"last_name",
"other_name",
"phone_number",
"email",
"user_name",
"password",
"is_admin"]
user_attribute_error = self.validator.valdate_attributes(
data,
user_attributes)
if user_attribute_error is not None:
return jsonify({
"error": "You have not entered this/these user attributes.",
"missing attributes": user_attribute_error,
"status": 400,
}), 400
# check if user data is valid if not return an error.
error = self.validator.check_if_either_function_has_invalid(
self.validator.check_user_base(
first_name, last_name, other_name, user_name), self.validator.check_credential(
phone_number, email, password, is_admin))
# if the username or email are already registered return error.
username_exist = db.check_username(user_name)
email_exist = db.check_email(email)
db.add_user(first_name, last_name, other_name, phone_number, email, user_name, password, is_admin)
# after successfully adding the user
# fetch user bse i need to use the database assigned ID
# to add it to the token from which i will get it to use it for 'created-BY'
user = db.check_username(user_name)
print(user)
fetched = user.get('user_id')
print(fetched)
token = jwt.encode(
{ 'user_id': fetched, "user_name": user_name, "is_admin": is_admin, 'exp': datetime.datetime.utcnow(
) + datetime.timedelta(minutes=15)}, my_secret_key).decode('UTF-8')
payload = jwt.decode(token, my_secret_key)
print(payload)
if error:
return jsonify({
'error': error,
"status": 400
}), 400
if username_exist is not None or email_exist is not None:
return jsonify({
"status": 401,
"error": "Either username or email are already in registered."
}), 401
return jsonify({
"status": 201,
'success':[{
'token': token,
"payload": payload.get('user_name')
# 'message': f'{user_name} successfully registered'
}]
}), 201
def fetch_users(self):
""" Administrator method to retrieve all users.
"""
all_users = db.get_users()
if len(all_users) < 1:
return jsonify({
"data":[{'message':'sorry! No App users yet.'}],
"status": 400
}), 400
return jsonify({
'status': 200,
'users': [user for user in all_users]
}), 200
def sign_in(self):
""" Class method to get single user by ID.
"""
login = request.get_json()
user_name = login.get("user_name")
password = login.get("password")
error = self.validator.validate_login(user_name, password)
if error:
return jsonify({
'message': error,
"status": 401
}), 401
user = db.login(password, user_name)
if user is None:
return jsonify({
'error': "The log in credentials you entered are wrong.",
'status': 401
}), 401
# token = "Derek"
print(user)
token = jwt.encode(
{"user_id": user.get('user_id'), "user_name": user.get('user_name'), \
"is_admin": user.get('is_admin'), 'exp': datetime.datetime.utcnow(
) + datetime.timedelta(minutes=15)}, my_secret_key).decode('UTF-8')
# payload = jwt.decode(token, my_secret_key)
return jsonify({
'status': 200,
'user logged in': [{
'token': token,
'success': f'{user_name} successfully logged in.'
}]
}), 200
def app_user(self, user_id):
""" Retrieve single app user.
"""
user = db.get_user(user_id)
if user is None:
return jsonify({
'status': 400,
'error': "No incidents for user yet."
}), 400
return jsonify({
'status': 200,
'single user': [user]
}), 200