API - limit access to users for now
- only auth user can access his preference - only admin can visualize users
This commit is contained in:
		@@ -386,7 +386,7 @@ def get_authenticated_user_profile(
 | 
			
		||||
        - invalid token, please log in again
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    return {'status': 'success', 'data': auth_user.serialize()}
 | 
			
		||||
    return {'status': 'success', 'data': auth_user.serialize(auth_user)}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@auth_blueprint.route('/auth/profile/edit', methods=['POST'])
 | 
			
		||||
@@ -540,7 +540,7 @@ def edit_user(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
			
		||||
        return {
 | 
			
		||||
            'status': 'success',
 | 
			
		||||
            'message': 'user profile updated',
 | 
			
		||||
            'data': auth_user.serialize(),
 | 
			
		||||
            'data': auth_user.serialize(auth_user),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    # handler errors
 | 
			
		||||
@@ -734,7 +734,7 @@ def update_user_account(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
			
		||||
        return {
 | 
			
		||||
            'status': 'success',
 | 
			
		||||
            'message': 'user account updated',
 | 
			
		||||
            'data': auth_user.serialize(),
 | 
			
		||||
            'data': auth_user.serialize(auth_user),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    except (exc.IntegrityError, exc.OperationalError, ValueError) as e:
 | 
			
		||||
@@ -872,7 +872,7 @@ def edit_user_preferences(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
			
		||||
        return {
 | 
			
		||||
            'status': 'success',
 | 
			
		||||
            'message': 'user preferences updated',
 | 
			
		||||
            'data': auth_user.serialize(),
 | 
			
		||||
            'data': auth_user.serialize(auth_user),
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    # handler errors
 | 
			
		||||
 
 | 
			
		||||
@@ -11,6 +11,8 @@ from sqlalchemy.sql.expression import select
 | 
			
		||||
from fittrackee import bcrypt, db
 | 
			
		||||
from fittrackee.workouts.models import Workout
 | 
			
		||||
 | 
			
		||||
from .exceptions import UserNotFoundException
 | 
			
		||||
from .roles import UserRole
 | 
			
		||||
from .utils.token import decode_user_token, get_user_token
 | 
			
		||||
 | 
			
		||||
BaseModel: DeclarativeMeta = db.Model
 | 
			
		||||
@@ -109,7 +111,18 @@ class User(BaseModel):
 | 
			
		||||
            .label('workouts_count')
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    def serialize(self) -> Dict:
 | 
			
		||||
    def serialize(self, current_user: 'User') -> Dict:
 | 
			
		||||
        role = (
 | 
			
		||||
            UserRole.AUTH_USER
 | 
			
		||||
            if current_user.id == self.id
 | 
			
		||||
            else UserRole.ADMIN
 | 
			
		||||
            if current_user.admin
 | 
			
		||||
            else UserRole.USER
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        if role == UserRole.USER:
 | 
			
		||||
            raise UserNotFoundException()
 | 
			
		||||
 | 
			
		||||
        sports = []
 | 
			
		||||
        total = (0, '0:00:00')
 | 
			
		||||
        if self.workouts_count > 0:  # type: ignore
 | 
			
		||||
@@ -127,30 +140,40 @@ class User(BaseModel):
 | 
			
		||||
                .filter(Workout.user_id == self.id)
 | 
			
		||||
                .first()
 | 
			
		||||
            )
 | 
			
		||||
        return {
 | 
			
		||||
            'username': self.username,
 | 
			
		||||
            'email': self.email,
 | 
			
		||||
            'created_at': self.created_at,
 | 
			
		||||
 | 
			
		||||
        serialized_user = {
 | 
			
		||||
            'admin': self.admin,
 | 
			
		||||
            'bio': self.bio,
 | 
			
		||||
            'birth_date': self.birth_date,
 | 
			
		||||
            'created_at': self.created_at,
 | 
			
		||||
            'email': self.email,
 | 
			
		||||
            'email_to_confirm': self.email_to_confirm,
 | 
			
		||||
            'first_name': self.first_name,
 | 
			
		||||
            'last_name': self.last_name,
 | 
			
		||||
            'bio': self.bio,
 | 
			
		||||
            'location': self.location,
 | 
			
		||||
            'birth_date': self.birth_date,
 | 
			
		||||
            'picture': self.picture is not None,
 | 
			
		||||
            'timezone': self.timezone,
 | 
			
		||||
            'weekm': self.weekm,
 | 
			
		||||
            'language': self.language,
 | 
			
		||||
            'nb_sports': len(sports),
 | 
			
		||||
            'nb_workouts': self.workouts_count,
 | 
			
		||||
            'picture': self.picture is not None,
 | 
			
		||||
            'records': [record.serialize() for record in self.records],
 | 
			
		||||
            'sports_list': [
 | 
			
		||||
                sport for sportslist in sports for sport in sportslist
 | 
			
		||||
            ],
 | 
			
		||||
            'total_distance': float(total[0]),
 | 
			
		||||
            'total_duration': str(total[1]),
 | 
			
		||||
            'imperial_units': self.imperial_units,
 | 
			
		||||
            'username': self.username,
 | 
			
		||||
        }
 | 
			
		||||
        if role == UserRole.AUTH_USER:
 | 
			
		||||
            serialized_user = {
 | 
			
		||||
                **serialized_user,
 | 
			
		||||
                **{
 | 
			
		||||
                    'imperial_units': self.imperial_units,
 | 
			
		||||
                    'language': self.language,
 | 
			
		||||
                    'timezone': self.timezone,
 | 
			
		||||
                    'weekm': self.weekm,
 | 
			
		||||
                },
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
        return serialized_user
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserSportPreference(BaseModel):
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										7
									
								
								fittrackee/users/roles.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								fittrackee/users/roles.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
from enum import Enum
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class UserRole(Enum):
 | 
			
		||||
    ADMIN = 'admin'
 | 
			
		||||
    AUTH_USER = 'auth_user'
 | 
			
		||||
    USER = 'user'
 | 
			
		||||
@@ -50,7 +50,7 @@ def set_admin(username: str) -> None:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@users_blueprint.route('/users', methods=['GET'])
 | 
			
		||||
@authenticate
 | 
			
		||||
@authenticate_as_admin
 | 
			
		||||
def get_users(auth_user: User) -> Dict:
 | 
			
		||||
    """
 | 
			
		||||
    Get all users
 | 
			
		||||
@@ -227,7 +227,7 @@ def get_users(auth_user: User) -> Dict:
 | 
			
		||||
    users = users_pagination.items
 | 
			
		||||
    return {
 | 
			
		||||
        'status': 'success',
 | 
			
		||||
        'data': {'users': [user.serialize() for user in users]},
 | 
			
		||||
        'data': {'users': [user.serialize(auth_user) for user in users]},
 | 
			
		||||
        'pagination': {
 | 
			
		||||
            'has_next': users_pagination.has_next,
 | 
			
		||||
            'has_prev': users_pagination.has_prev,
 | 
			
		||||
@@ -239,7 +239,7 @@ def get_users(auth_user: User) -> Dict:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@users_blueprint.route('/users/<user_name>', methods=['GET'])
 | 
			
		||||
@authenticate
 | 
			
		||||
@authenticate_as_admin
 | 
			
		||||
def get_single_user(
 | 
			
		||||
    auth_user: User, user_name: str
 | 
			
		||||
) -> Union[Dict, HttpResponse]:
 | 
			
		||||
@@ -345,7 +345,7 @@ def get_single_user(
 | 
			
		||||
        if user:
 | 
			
		||||
            return {
 | 
			
		||||
                'status': 'success',
 | 
			
		||||
                'data': {'users': [user.serialize()]},
 | 
			
		||||
                'data': {'users': [user.serialize(auth_user)]},
 | 
			
		||||
            }
 | 
			
		||||
    except ValueError:
 | 
			
		||||
        pass
 | 
			
		||||
@@ -581,7 +581,7 @@ def update_user(auth_user: User, user_name: str) -> Union[Dict, HttpResponse]:
 | 
			
		||||
 | 
			
		||||
        return {
 | 
			
		||||
            'status': 'success',
 | 
			
		||||
            'data': {'users': [user.serialize()]},
 | 
			
		||||
            'data': {'users': [user.serialize(auth_user)]},
 | 
			
		||||
        }
 | 
			
		||||
    except exc.StatementError as e:
 | 
			
		||||
        return handle_error_and_return_response(e, db=db)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user