Skip to content

astijusar/WorkoutTracker

Repository files navigation

Workout tracker app

Table of contents

System description

Purpose of the system

The project aims to allow users to plan their workouts and track their progress in the application.

Once the user has signed up to the system, they can create their workouts by adding exercises to them. When a workout is performed, it is possible to fill in the results, i.e.: how many times the exercise has been performed and with which weight. It is also possible to view past workouts, create templates, and perform the workouts from them.

System roles:

  • Administrator - will be able to add and edit exercises.
  • Regular user - can create, perform, delete, view templates and workouts.
  • Premium user - can do everything a regular user can, but can create more than 3 templates.

Functional requirements

  • Sign in to the app
  • Log in to the app
  • Log out of the app
  • View exercises and their information
  • Create a workout
  • Add exercises to the workout
  • Start the workout
  • Finish the workout
  • View workout history
  • Perform workout again from history
  • Create a workout template
  • Perform a workout from the template
  • Delete workout from history
  • Delete template
  • Edit template
  • Add a new exercise
  • Edit an exercise

System architecture

System components:

  • Client side (front-end) - using React.js.
  • Server side (back-end) - using ASP .NET Core and PostgreSQL database

The image below shows the deployment diagram of the system. Heroku is used to host both the API and the database. Vercel is used to host the front-end application. The web application and the API are accessed via the HTTPS protocol. The API stores data in the PostgreSQL database and performs data exchange using the ORM interface.

image

User interface

Profile:

Profile

History:

History

Start workout:

Workout

Exercises:

Exercises

Exercise info modal:

Exercise info

Workout creation:

Workout start

Add exercise to workout:

Add exercise

Exercise creation:

Exercise creation

Exercise editing:

exercise editing

API specification

Auth

post__api_Auth_login

Code samples

const inputBody = '{
  "userName": "string",
  "password": "string"
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Auth/login',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/Auth/login

User login

Body parameter

{
    "userName": "string",
    "password": "string"
}

Parameters

Name In Type Required Description
body body UserLoginDto false User login object

Responses

Status Meaning Description Schema
200 OK Returns access and refresh tokens None
401 Unauthorized Unauthorized, username or password is incorrect None
This operation does not require authentication

post__api_Auth_register

Code samples

const inputBody = '{
  "userName": "string",
  "email": "string",
  "password": "string"
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Auth/register',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/Auth/register

User registration

Body parameter

{
    "userName": "string",
    "email": "string",
    "password": "string"
}

Parameters

Name In Type Required Description
body body UserRegistrationDto false User registration object

Responses

Status Meaning Description Schema
200 OK Success None
201 Created Returns the newly created user None
422 Unprocessable Entity User name already taken None
This operation does not require authentication

post__api_Auth_refresh

Code samples

const inputBody = '{
  "refreshToken": "string"
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Auth/refresh',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/Auth/refresh

Get access token

Body parameter

{
    "refreshToken": "string"
}

Parameters

Name In Type Required Description
body body RefreshAccessTokenDto false Refresh access token object

Responses

Status Meaning Description Schema
200 OK Returns access and refresh tokens None
422 Unprocessable Entity Invalid token None
This operation does not require authentication

Exercise

get__api_Exercise

Code samples

fetch("/api/Exercise", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/Exercise

Get all of the exercises

Parameters

Name In Type Required Description
SearchTerm query string false none
MuscleGroup query MuscleGroup false none
EquipmentType query Equipment false none
PageNumber query integer(int32) false none
PageSize query integer(int32) false none
SortDescending query boolean false none

Responses

Status Meaning Description Schema
200 OK Returns a list of all exercises None
This operation does not require authentication

post__api_Exercise

Code samples

const inputBody = '{
  "name": "string",
  "instructions": "string",
  "muscleGroup": "string",
  "equipmentType": "string"
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Exercise',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/Exercise

Create a new exercise

Body parameter

{
    "name": "string",
    "instructions": "string",
    "muscleGroup": "string",
    "equipmentType": "string"
}

Parameters

Name In Type Required Description
body body ExerciseCreationDto false Exercise creation object

Responses

Status Meaning Description Schema
200 OK Success None
201 Created Returns a newly created exercise None
400 Bad Request Exercise creation object sent from client is null None
422 Unprocessable Entity Invalid model state for the exercise creation object None
This operation does not require authentication

GetExercise

Code samples

fetch("/api/Exercise/{exerciseId}", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/Exercise/{exerciseId}

Get an exercise by id

Parameters

Name In Type Required Description
exerciseId path string(uuid) true Exercise to return id

Responses

Status Meaning Description Schema
200 OK Returns an exercise by id None
404 Not Found Exercise does not exist None
This operation does not require authentication

put_api_Exercise{exerciseId}

Code samples

const inputBody = '{
  "name": "string",
  "instructions": "string",
  "muscleGroup": "string",
  "equipmentType": "string"
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Exercise/{exerciseId}',
{
  method: 'PUT',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

PUT /api/Exercise/{exerciseId}

Update exercise by id

Body parameter

{
    "name": "string",
    "instructions": "string",
    "muscleGroup": "string",
    "equipmentType": "string"
}

Parameters

Name In Type Required Description
exerciseId path string(uuid) true Exercise to be updated id
body body ExerciseUpdateDto false Exercise update object

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
400 Bad Request Exercise update object is null None
404 Not Found Exercise is not found None
422 Unprocessable Entity Invalid model state for the exercise update object None
This operation does not require authentication

patch_api_Exercise{exerciseId}

Code samples

const inputBody = '[
  {
    "operationType": 0,
    "path": "string",
    "op": "string",
    "from": "string",
    "value": null
  }
]';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Exercise/{exerciseId}',
{
  method: 'PATCH',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

PATCH /api/Exercise/{exerciseId}

Partially update exercise by id

Body parameter

[
    {
        "operationType": 0,
        "path": "string",
        "op": "string",
        "from": "string",
        "value": null
    }
]

Parameters

Name In Type Required Description
exerciseId path string(uuid) true Exercise to be updated id
body body Operation false Exercise patch object

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
400 Bad Request Exercise patch object is null None
404 Not Found Exercise is not found None
422 Unprocessable Entity Invalid model state for the exercise patch object None
This operation does not require authentication

delete_api_Exercise{exerciseId}

Code samples

fetch("/api/Exercise/{exerciseId}", {
    method: "DELETE",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

DELETE /api/Exercise/{exerciseId}

Delete exercise by id

Parameters

Name In Type Required Description
exerciseId path string(uuid) true Exercise to be deleted id

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
404 Not Found Exercise is not found None
This operation does not require authentication

Workout

get__api_Workout

Code samples

fetch("/api/Workout", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/Workout

Get all of the workouts

Parameters

Name In Type Required Description
Template query boolean false none
StartFrom query string(date-time) false none
EndTo query string(date-time) false none
SearchTerm query string false none
PageNumber query integer(int32) false none
PageSize query integer(int32) false none
SortDescending query boolean false none

Responses

Status Meaning Description Schema
200 OK Returns a list of all workouts None
This operation does not require authentication

post__api_Workout

Code samples

const inputBody = '{
  "name": "string",
  "note": "string",
  "start": "2019-08-24T14:15:22Z",
  "end": "2019-08-24T14:15:22Z",
  "isTemplate": true
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Workout',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/Workout

Create a new workout

Body parameter

{
    "name": "string",
    "note": "string",
    "start": "2019-08-24T14:15:22Z",
    "end": "2019-08-24T14:15:22Z",
    "isTemplate": true
}

Parameters

Name In Type Required Description
body body WorkoutCreationDto false Workout creation object

Responses

Status Meaning Description Schema
200 OK Success None
201 Created Returns a newly created workout None
400 Bad Request Workout creation object sent from client is null None
422 Unprocessable Entity Invalid model state for the workout creation object None
This operation does not require authentication

GetWorkout

Code samples

fetch("/api/Workout/{workoutId}", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/Workout/{workoutId}

Get a workout by id

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout to return id

Responses

Status Meaning Description Schema
200 OK Returns a workout by id None
404 Not Found Workout does not exist None
This operation does not require authentication

put_api_Workout{workoutId}

Code samples

const inputBody = '{
  "name": "string",
  "note": "string"
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Workout/{workoutId}',
{
  method: 'PUT',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

PUT /api/Workout/{workoutId}

Update workout by id

Body parameter

{
    "name": "string",
    "note": "string"
}

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout to be updated id
body body WorkoutUpdateDto false Workout update object

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
400 Bad Request Workout update object is null None
404 Not Found Workout is not found None
422 Unprocessable Entity Invalid model state for the workout update object None
This operation does not require authentication

patch_api_Workout{workoutId}

Code samples

const inputBody = '[
  {
    "operationType": 0,
    "path": "string",
    "op": "string",
    "from": "string",
    "value": null
  }
]';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/Workout/{workoutId}',
{
  method: 'PATCH',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

PATCH /api/Workout/{workoutId}

Partially update workout by id

Body parameter

[
    {
        "operationType": 0,
        "path": "string",
        "op": "string",
        "from": "string",
        "value": null
    }
]

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout to be updated id
body body Operation false Workout patch object

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
400 Bad Request Workout patch object is null None
404 Not Found Workout is not found None
422 Unprocessable Entity Invalid model state for the workout patch object None
This operation does not require authentication

delete_api_Workout{workoutId}

Code samples

fetch("/api/Workout/{workoutId}", {
    method: "DELETE",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

DELETE /api/Workout/{workoutId}

Delete workout by id

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout to be deleted id

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
404 Not Found Workout is not found None
This operation does not require authentication

WorkoutExercise

get_api_workout{workoutId}_exercise

Code samples

fetch("/api/workout/{workoutId}/exercise", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/workout/{workoutId}/exercise

Get all exercises for a specific workout

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id

Responses

Status Meaning Description Schema
200 OK Returns a list of all exercises for the workout None
This operation does not require authentication

post_api_workout{workoutId}_exercise

Code samples

const inputBody = '{
  "exerciseId": "71ba10b8-c6bd-49fd-9742-f8dbc8ccdb47",
  "sets": [
    {
      "reps": 1,
      "weight": 0.01,
      "done": true,
      "measurementType": 0
    }
  ]
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/workout/{workoutId}/exercise',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/workout/{workoutId}/exercise

Create a new exercise for a workout

Body parameter

{
    "exerciseId": "71ba10b8-c6bd-49fd-9742-f8dbc8ccdb47",
    "sets": [
        {
            "reps": 1,
            "weight": 0.01,
            "done": true,
            "measurementType": 0
        }
    ]
}

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
body body WorkoutExerciseCreationDto false Exercise creation object

Responses

Status Meaning Description Schema
200 OK Success None
201 Created Returns the newly created exercise None
400 Bad Request Exercise creation object is null None
This operation does not require authentication

GetWorkoutExercise

Code samples

fetch("/api/workout/{workoutId}/exercise/{exerciseId}", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/workout/{workoutId}/exercise/{exerciseId}

Get a specific exercise for a workout by id

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id

Responses

Status Meaning Description Schema
200 OK Returns the exercise for the workout None
404 Not Found Exercise not found None
This operation does not require authentication

put_api_workout{workoutId}exercise{exerciseId}

Code samples

const inputBody = '{
  "order": 1,
  "sets": [
    {
      "reps": 1,
      "weight": 0.01,
      "done": true,
      "measurementType": 0
    }
  ]
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/workout/{workoutId}/exercise/{exerciseId}',
{
  method: 'PUT',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

PUT /api/workout/{workoutId}/exercise/{exerciseId}

Update an exercise for a workout by id

Body parameter

{
    "order": 1,
    "sets": [
        {
            "reps": 1,
            "weight": 0.01,
            "done": true,
            "measurementType": 0
        }
    ]
}

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id
body body WorkoutExerciseUpdateDto false Exercise update object

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
400 Bad Request Exercise update object is null None
404 Not Found Exercise not found None
This operation does not require authentication

delete_api_workout{workoutId}exercise{exerciseId}

Code samples

fetch("/api/workout/{workoutId}/exercise/{exerciseId}", {
    method: "DELETE",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

DELETE /api/workout/{workoutId}/exercise/{exerciseId}

Delete an exercise for a workout by id

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
404 Not Found Exercise not found None
This operation does not require authentication

post_api_workout{workoutId}_exercise_collection

Code samples

const inputBody = '[
  {
    "exerciseId": "71ba10b8-c6bd-49fd-9742-f8dbc8ccdb47",
    "sets": [
      {
        "reps": 1,
        "weight": 0.01,
        "done": true,
        "measurementType": 0
      }
    ]
  }
]';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/workout/{workoutId}/exercise/collection',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/workout/{workoutId}/exercise/collection

Create a collection of exercises for a workout

Body parameter

[
    {
        "exerciseId": "71ba10b8-c6bd-49fd-9742-f8dbc8ccdb47",
        "sets": [
            {
                "reps": 1,
                "weight": 0.01,
                "done": true,
                "measurementType": 0
            }
        ]
    }
]

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
body body WorkoutExerciseCreationDto false Exercise creation objects

Responses

Status Meaning Description Schema
200 OK Success None
201 Created Returns the created exercises None
400 Bad Request Exercise creation objects are null None
This operation does not require authentication

WorkoutExerciseSet

get_api_workout{workoutId}exercise{exerciseId}_set

Code samples

fetch("/api/workout/{workoutId}/exercise/{exerciseId}/set", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/workout/{workoutId}/exercise/{exerciseId}/set

Get all exercise sets for a specific exercise

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id

Responses

Status Meaning Description Schema
200 OK Returns a list of exercise sets None
404 Not Found Exercise or workout does not exist None
This operation does not require authentication

post_api_workout{workoutId}exercise{exerciseId}_set

Code samples

const inputBody = '{
  "reps": 1,
  "weight": 0.01,
  "done": true,
  "measurementType": 0
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/workout/{workoutId}/exercise/{exerciseId}/set',
{
  method: 'POST',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

POST /api/workout/{workoutId}/exercise/{exerciseId}/set

Create a new exercise set

Body parameter

{
    "reps": 1,
    "weight": 0.01,
    "done": true,
    "measurementType": 0
}

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id
body body WorkoutExerciseSetCreationDto false Exercise set creation object

Responses

Status Meaning Description Schema
200 OK Success None
201 Created Returns a newly created exercise set None
400 Bad Request Exercise set creation object sent from client is null None
422 Unprocessable Entity Invalid model state for the exercise set creation object None
This operation does not require authentication

GetExerciseSet

Code samples

fetch("/api/workout/{workoutId}/exercise/{exerciseId}/set/{setId}", {
    method: "GET",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

GET /api/workout/{workoutId}/exercise/{exerciseId}/set/{setId}

Get a specific exercise set

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id
setId path string(uuid) true Exercise set id

Responses

Status Meaning Description Schema
200 OK Returns an exercise set None
404 Not Found Exercise set, exercise, or workout does not exist None
This operation does not require authentication

put_api_workout{workoutId}exercise{exerciseId}set{setId}

Code samples

const inputBody = '{
  "reps": 1,
  "weight": 0.01,
  "done": true,
  "measurementType": 0
}';
const headers = {
  'Content-Type':'application/json-patch+json'
};

fetch('/api/workout/{workoutId}/exercise/{exerciseId}/set/{setId}',
{
  method: 'PUT',
  body: inputBody,
  headers: headers
})
.then(function(res) {
    return res.json();
}).then(function(body) {
    console.log(body);
});

PUT /api/workout/{workoutId}/exercise/{exerciseId}/set/{setId}

Update an exercise set

Body parameter

{
    "reps": 1,
    "weight": 0.01,
    "done": true,
    "measurementType": 0
}

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id
setId path string(uuid) true Exercise set id
body body WorkoutExerciseSetUpdateDto false Exercise set update object

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
400 Bad Request Exercise set update object is null None
404 Not Found Exercise set, exercise, or workout is not found None
422 Unprocessable Entity Invalid model state for the exercise set update object None
This operation does not require authentication

delete_api_workout{workoutId}exercise{exerciseId}set{setId}

Code samples

fetch("/api/workout/{workoutId}/exercise/{exerciseId}/set/{setId}", {
    method: "DELETE",
})
    .then(function (res) {
        return res.json();
    })
    .then(function (body) {
        console.log(body);
    });

DELETE /api/workout/{workoutId}/exercise/{exerciseId}/set/{setId}

Delete an exercise set

Parameters

Name In Type Required Description
workoutId path string(uuid) true Workout id
exerciseId path string(uuid) true Exercise id
setId path string(uuid) true Exercise set id

Responses

Status Meaning Description Schema
200 OK Success None
204 No Content No content response None
404 Not Found Exercise set, exercise, or workout is not found None
This operation does not require authentication

Schemas

ExerciseCreationDto

{
    "name": "string",
    "instructions": "string",
    "muscleGroup": "string",
    "equipmentType": "string"
}

Properties

Name Type Required Restrictions Description
name string¦null false none none
instructions string¦null false none none
muscleGroup string¦null false none none
equipmentType string¦null false none none

ExerciseUpdateDto

{
    "name": "string",
    "instructions": "string",
    "muscleGroup": "string",
    "equipmentType": "string"
}

Properties

Name Type Required Restrictions Description
name string¦null false none none
instructions string¦null false none none
muscleGroup string¦null false none none
equipmentType string¦null false none none

Operation

{
    "operationType": 0,
    "path": "string",
    "op": "string",
    "from": "string",
    "value": null
}

Properties

Name Type Required Restrictions Description
operationType OperationType false none none
path string¦null false none none
op string¦null false none none
from string¦null false none none
value any false none none

RefreshAccessTokenDto

{
    "refreshToken": "string"
}

Properties

Name Type Required Restrictions Description
refreshToken string¦null false none none

UserLoginDto

{
    "userName": "string",
    "password": "string"
}

Properties

Name Type Required Restrictions Description
userName string¦null false none none
password string¦null false none none

UserRegistrationDto

{
    "userName": "string",
    "email": "string",
    "password": "string"
}

Properties

Name Type Required Restrictions Description
userName string¦null false none none
email string¦null false none none
password string¦null false none none

WorkoutCreationDto

{
    "name": "string",
    "note": "string",
    "start": "2019-08-24T14:15:22Z",
    "end": "2019-08-24T14:15:22Z",
    "isTemplate": true
}

Properties

Name Type Required Restrictions Description
name string¦null false none none
note string¦null false none none
start string(date-time)¦null false none none
end string(date-time)¦null false none none
isTemplate boolean false none none

WorkoutExerciseCreationDto

{
    "exerciseId": "71ba10b8-c6bd-49fd-9742-f8dbc8ccdb47",
    "sets": [
        {
            "reps": 1,
            "weight": 0.01,
            "done": true,
            "measurementType": 0
        }
    ]
}

Properties

Name Type Required Restrictions Description
exerciseId string(uuid) false none none
sets [WorkoutExerciseSetCreationDto]¦null false none none

WorkoutExerciseSetCreationDto

{
    "reps": 1,
    "weight": 0.01,
    "done": true,
    "measurementType": 0
}

Properties

Name Type Required Restrictions Description
reps integer(int32) false none none
weight number(double) false none none
done boolean true none none
measurementType MeasurementType false none none

WorkoutExerciseSetUpdateDto

{
    "reps": 1,
    "weight": 0.01,
    "done": true,
    "measurementType": 0
}

Properties

Name Type Required Restrictions Description
reps integer(int32) false none none
weight number(double) false none none
done boolean true none none
measurementType MeasurementType false none none

WorkoutExerciseUpdateDto

{
    "order": 1,
    "sets": [
        {
            "reps": 1,
            "weight": 0.01,
            "done": true,
            "measurementType": 0
        }
    ]
}

Properties

Name Type Required Restrictions Description
order integer(int32) false none none
sets [WorkoutExerciseSetUpdateDto]¦null false none none

WorkoutUpdateDto

{
    "name": "string",
    "note": "string"
}

Properties

Name Type Required Restrictions Description
name string¦null false none none
note string¦null false none none