Skip to content

API Reference

User default gear module for activity type gear assignments.

This module provides CRUD operations and data models for managing user default gear settings per activity type (run, ride, swim, etc.).

Exports
  • CRUD: get_user_default_gear_by_user_id, create_user_default_gear, edit_user_default_gear
  • Schemas: UsersDefaultGearBase, UsersDefaultGearUpdate, UsersDefaultGearRead
  • Utils: get_user_default_gear_by_activity_type
  • Constants: ACTIVITY_TYPE_TO_GEAR_ATTR

UsersDefaultGearBase

Bases: BaseModel

Base schema for users default gear assignments.

Attributes:

Name Type Description
run_gear_id StrictInt | None

Default gear for run activities.

trail_run_gear_id StrictInt | None

Default gear for trail run activities.

virtual_run_gear_id StrictInt | None

Default gear for virtual run activities.

ride_gear_id StrictInt | None

Default gear for ride activities.

gravel_ride_gear_id StrictInt | None

Default gear for gravel ride activities.

mtb_ride_gear_id StrictInt | None

Default gear for MTB ride activities.

virtual_ride_gear_id StrictInt | None

Default gear for virtual ride activities.

ows_gear_id StrictInt | None

Default gear for open water swim activities.

walk_gear_id StrictInt | None

Default gear for walk activities.

hike_gear_id StrictInt | None

Default gear for hike activities.

tennis_gear_id StrictInt | None

Default gear for tennis activities.

alpine_ski_gear_id StrictInt | None

Default gear for alpine ski activities.

nordic_ski_gear_id StrictInt | None

Default gear for nordic ski activities.

snowboard_gear_id StrictInt | None

Default gear for snowboard activities.

windsurf_gear_id StrictInt | None

Default gear for windsurf activities.

Source code in backend/app/users/users_default_gear/schema.py
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
class UsersDefaultGearBase(BaseModel):
    """
    Base schema for users default gear assignments.

    Attributes:
        run_gear_id: Default gear for run activities.
        trail_run_gear_id: Default gear for trail run
            activities.
        virtual_run_gear_id: Default gear for virtual run
            activities.
        ride_gear_id: Default gear for ride activities.
        gravel_ride_gear_id: Default gear for gravel ride
            activities.
        mtb_ride_gear_id: Default gear for MTB ride activities.
        virtual_ride_gear_id: Default gear for virtual ride
            activities.
        ows_gear_id: Default gear for open water swim
            activities.
        walk_gear_id: Default gear for walk activities.
        hike_gear_id: Default gear for hike activities.
        tennis_gear_id: Default gear for tennis activities.
        alpine_ski_gear_id: Default gear for alpine ski
            activities.
        nordic_ski_gear_id: Default gear for nordic ski
            activities.
        snowboard_gear_id: Default gear for snowboard
            activities.
        windsurf_gear_id: Default gear for windsurf activities.
    """

    run_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for run activities",
    )
    trail_run_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for trail run activities",
    )
    virtual_run_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for virtual run activities",
    )
    ride_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for ride activities",
    )
    gravel_ride_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for gravel ride activities",
    )
    mtb_ride_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for MTB ride activities",
    )
    virtual_ride_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for virtual ride activities",
    )
    ows_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for OWS activities",
    )
    walk_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for walk activities",
    )
    hike_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for hike activities",
    )
    tennis_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for tennis activities",
    )
    alpine_ski_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for alpine ski activities",
    )
    nordic_ski_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for nordic ski activities",
    )
    snowboard_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for snowboard activities",
    )
    windsurf_gear_id: StrictInt | None = Field(
        default=None,
        ge=1,
        description="Default gear for windsurf activities",
    )

    model_config = ConfigDict(
        from_attributes=True,
        extra="forbid",
        validate_assignment=True,
    )

UsersDefaultGearRead

Bases: UsersDefaultGearBase

Schema for reading user default gear settings.

Extends base with identifier fields.

Attributes:

Name Type Description
id StrictInt

Unique identifier for the record.

user_id StrictInt

User ID reference.

Source code in backend/app/users/users_default_gear/schema.py
124
125
126
127
128
129
130
131
132
133
134
135
136
class UsersDefaultGearRead(UsersDefaultGearBase):
    """
    Schema for reading user default gear settings.

    Extends base with identifier fields.

    Attributes:
        id: Unique identifier for the record.
        user_id: User ID reference.
    """

    id: StrictInt = Field(..., ge=1, description="Unique identifier")
    user_id: StrictInt = Field(..., ge=1, description="User ID")

UsersDefaultGearUpdate

Bases: UsersDefaultGearRead

Schema for updating user default gear settings.

Inherits all gear assignment fields from read schema. All fields are optional for partial updates.

Source code in backend/app/users/users_default_gear/schema.py
139
140
141
142
143
144
145
class UsersDefaultGearUpdate(UsersDefaultGearRead):
    """
    Schema for updating user default gear settings.

    Inherits all gear assignment fields from read schema.
    All fields are optional for partial updates.
    """

create_user_default_gear

create_user_default_gear(user_id, db)

Create default gear settings for a user.

Parameters:

Name Type Description Default
user_id int

The ID of the user to create settings for.

required
db Session

SQLAlchemy database session.

required

Returns:

Type Description
UsersDefaultGearRead

The created UsersDefaultGear schema.

Raises:

Type Description
HTTPException

409 error if settings already exist.

HTTPException

500 error if database operation fails.

Source code in backend/app/users/users_default_gear/crud.py
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
@core_decorators.handle_db_errors
def create_user_default_gear(
    user_id: int,
    db: Session,
) -> users_default_gear_schema.UsersDefaultGearRead:
    """
    Create default gear settings for a user.

    Args:
        user_id: The ID of the user to create settings for.
        db: SQLAlchemy database session.

    Returns:
        The created UsersDefaultGear schema.

    Raises:
        HTTPException: 409 error if settings already exist.
        HTTPException: 500 error if database operation fails.
    """
    try:
        db_users_default_gear = users_default_gear_models.UsersDefaultGear(
            user_id=user_id,
        )

        db.add(db_users_default_gear)
        db.commit()
        db.refresh(db_users_default_gear)

        return _transform_users_default_gear(db_users_default_gear)
    except IntegrityError as integrity_error:
        # Rollback the transaction
        db.rollback()

        raise HTTPException(
            status_code=status.HTTP_409_CONFLICT,
            detail=("Default gear settings already exist for this user"),
        ) from integrity_error

edit_user_default_gear

edit_user_default_gear(user_default_gear, user_id, db)

Update default gear settings for a user.

Parameters:

Name Type Description Default
user_default_gear UsersDefaultGearUpdate

Schema with gear fields to update.

required
user_id int

The ID of the user.

required
db Session

SQLAlchemy database session.

required

Returns:

Type Description
UsersDefaultGearRead

The updated UsersDefaultGear schema.

Raises:

Type Description
HTTPException

404 error if settings not found.

HTTPException

500 error if database operation fails.

Source code in backend/app/users/users_default_gear/crud.py
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
@core_decorators.handle_db_errors
def edit_user_default_gear(
    user_default_gear: users_default_gear_schema.UsersDefaultGearUpdate,
    user_id: int,
    db: Session,
) -> users_default_gear_schema.UsersDefaultGearRead:
    """
    Update default gear settings for a user.

    Args:
        user_default_gear: Schema with gear fields to update.
        user_id: The ID of the user.
        db: SQLAlchemy database session.

    Returns:
        The updated UsersDefaultGear schema.

    Raises:
        HTTPException: 404 error if settings not found.
        HTTPException: 500 error if database operation fails.
    """
    if user_default_gear.user_id != user_id:
        raise HTTPException(
            status_code=status.HTTP_403_FORBIDDEN,
            detail="Cannot edit default gear for another user.",
        )

    db_users_default_gear = _get_user_default_gear_model_by_user_id_or_404(user_id, db)

    user_default_gear_data: dict[str, Any] = user_default_gear.model_dump(exclude_unset=True, exclude={"user_id", "id"})
    for key, value in user_default_gear_data.items():
        setattr(db_users_default_gear, key, value)

    db.commit()
    db.refresh(db_users_default_gear)

    return _transform_users_default_gear(db_users_default_gear)

get_user_default_gear_by_activity_type

get_user_default_gear_by_activity_type(user_id, activity_type, db)

Get default gear ID for a specific activity type.

Parameters:

Name Type Description Default
user_id int

The ID of the user.

required
activity_type int

The activity type code.

required
db Session

SQLAlchemy database session.

required

Returns:

Type Description
int | None

The gear ID for the activity type, or None if not set

int | None

or activity type is unknown.

Raises:

Type Description
HTTPException

If user default gear not found or database error occurs.

Source code in backend/app/users/users_default_gear/utils.py
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
def get_user_default_gear_by_activity_type(
    user_id: int,
    activity_type: int,
    db: Session,
) -> int | None:
    """
    Get default gear ID for a specific activity type.

    Args:
        user_id: The ID of the user.
        activity_type: The activity type code.
        db: SQLAlchemy database session.

    Returns:
        The gear ID for the activity type, or None if not set
        or activity type is unknown.

    Raises:
        HTTPException: If user default gear not found or
            database error occurs.
    """
    try:
        user_default_gear: users_default_gear_schema.UsersDefaultGearRead | None = (
            user_default_gear_crud.get_user_default_gear_by_user_id(user_id, db)
        )

        if not user_default_gear:
            return None

        attr_name = ACTIVITY_TYPE_TO_GEAR_ATTR.get(activity_type)
        if attr_name is None:
            return None

        return getattr(user_default_gear, attr_name, None)
    except HTTPException:
        raise
    except Exception as err:
        core_logger.print_to_log(
            f"Error in get_user_default_gear_by_activity_type: {err}",
            "error",
            exc=err,
        )
        raise

get_user_default_gear_by_user_id

get_user_default_gear_by_user_id(user_id, db)

Retrieve default gear settings for a specific user.

Parameters:

Name Type Description Default
user_id int

The ID of the user to fetch settings for.

required
db Session

SQLAlchemy database session.

required

Returns:

Type Description
UsersDefaultGearRead | None

The UsersDefaultGear model for the user or None if not found.

Raises:

Type Description
HTTPException

404 error if settings not found.

HTTPException

500 error if database query fails.

Source code in backend/app/users/users_default_gear/crud.py
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
@core_decorators.handle_db_errors
def get_user_default_gear_by_user_id(
    user_id: int,
    db: Session,
) -> users_default_gear_schema.UsersDefaultGearRead | None:
    """
    Retrieve default gear settings for a specific user.

    Args:
        user_id: The ID of the user to fetch settings for.
        db: SQLAlchemy database session.

    Returns:
        The UsersDefaultGear model for the user or None if not found.

    Raises:
        HTTPException: 404 error if settings not found.
        HTTPException: 500 error if database query fails.
    """
    stmt = select(users_default_gear_models.UsersDefaultGear).where(
        users_default_gear_models.UsersDefaultGear.user_id == user_id
    )
    db_users_default_gear = db.execute(stmt).scalar_one_or_none()
    return _transform_users_default_gear(db_users_default_gear) if db_users_default_gear else None