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.
- 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 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.
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"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | UserLoginDto | false | User login object |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns access and refresh tokens | None |
401 | Unauthorized | Unauthorized, username or password is incorrect | None |
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"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | UserRegistrationDto | false | User registration object |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success | None |
201 | Created | Returns the newly created user | None |
422 | Unprocessable Entity | User name already taken | None |
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"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | RefreshAccessTokenDto | false | Refresh access token object |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns access and refresh tokens | None |
422 | Unprocessable Entity | Invalid token | None |
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
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 |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns a list of all exercises | None |
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"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | ExerciseCreationDto | false | Exercise creation object |
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 |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
exerciseId | path | string(uuid) | true | Exercise to return id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns an exercise by id | None |
404 | Not Found | Exercise does not exist | None |
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"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
exerciseId | path | string(uuid) | true | Exercise to be updated id |
body | body | ExerciseUpdateDto | false | Exercise update object |
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 |
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
}
]
Name | In | Type | Required | Description |
---|---|---|---|---|
exerciseId | path | string(uuid) | true | Exercise to be updated id |
body | body | Operation | false | Exercise patch object |
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 |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
exerciseId | path | string(uuid) | true | Exercise to be deleted id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success | None |
204 | No Content | No content response | None |
404 | Not Found | Exercise is not found | None |
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
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 |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns a list of all workouts | None |
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
}
Name | In | Type | Required | Description |
---|---|---|---|---|
body | body | WorkoutCreationDto | false | Workout creation object |
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 |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout to return id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns a workout by id | None |
404 | Not Found | Workout does not exist | None |
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"
}
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout to be updated id |
body | body | WorkoutUpdateDto | false | Workout update object |
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 |
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
}
]
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout to be updated id |
body | body | Operation | false | Workout patch object |
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 |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout to be deleted id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success | None |
204 | No Content | No content response | None |
404 | Not Found | Workout is not found | None |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns a list of all exercises for the workout | None |
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
}
]
}
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout id |
body | body | WorkoutExerciseCreationDto | false | Exercise creation object |
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 |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout id |
exerciseId | path | string(uuid) | true | Exercise id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns the exercise for the workout | None |
404 | Not Found | Exercise not found | None |
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
}
]
}
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 |
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 |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout id |
exerciseId | path | string(uuid) | true | Exercise id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success | None |
204 | No Content | No content response | None |
404 | Not Found | Exercise not found | None |
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
}
]
}
]
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout id |
body | body | WorkoutExerciseCreationDto | false | Exercise creation objects |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Success | None |
201 | Created | Returns the created exercises | None |
400 | Bad Request | Exercise creation objects are null | None |
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
Name | In | Type | Required | Description |
---|---|---|---|---|
workoutId | path | string(uuid) | true | Workout id |
exerciseId | path | string(uuid) | true | Exercise id |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns a list of exercise sets | None |
404 | Not Found | Exercise or workout does not exist | None |
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
}
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 |
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 |
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
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 |
Status | Meaning | Description | Schema |
---|---|---|---|
200 | OK | Returns an exercise set | None |
404 | Not Found | Exercise set, exercise, or workout does not exist | None |
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
}
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 |
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 |
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
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 |
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 |
{
"name": "string",
"instructions": "string",
"muscleGroup": "string",
"equipmentType": "string"
}
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 |
{
"name": "string",
"instructions": "string",
"muscleGroup": "string",
"equipmentType": "string"
}
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 |
{
"operationType": 0,
"path": "string",
"op": "string",
"from": "string",
"value": null
}
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 |
{
"refreshToken": "string"
}
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
refreshToken | string¦null | false | none | none |
{
"userName": "string",
"password": "string"
}
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
userName | string¦null | false | none | none |
password | string¦null | false | none | none |
{
"userName": "string",
"email": "string",
"password": "string"
}
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
userName | string¦null | false | none | none |
string¦null | false | none | none | |
password | string¦null | false | none | none |
{
"name": "string",
"note": "string",
"start": "2019-08-24T14:15:22Z",
"end": "2019-08-24T14:15:22Z",
"isTemplate": true
}
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 |
{
"exerciseId": "71ba10b8-c6bd-49fd-9742-f8dbc8ccdb47",
"sets": [
{
"reps": 1,
"weight": 0.01,
"done": true,
"measurementType": 0
}
]
}
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
exerciseId | string(uuid) | false | none | none |
sets | [WorkoutExerciseSetCreationDto]¦null | false | none | none |
{
"reps": 1,
"weight": 0.01,
"done": true,
"measurementType": 0
}
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 |
{
"reps": 1,
"weight": 0.01,
"done": true,
"measurementType": 0
}
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 |
{
"order": 1,
"sets": [
{
"reps": 1,
"weight": 0.01,
"done": true,
"measurementType": 0
}
]
}
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
order | integer(int32) | false | none | none |
sets | [WorkoutExerciseSetUpdateDto]¦null | false | none | none |
{
"name": "string",
"note": "string"
}
Name | Type | Required | Restrictions | Description |
---|---|---|---|---|
name | string¦null | false | none | none |
note | string¦null | false | none | none |