Merge branch 'release-v0.7.0'
@@ -10,18 +10,23 @@ export APP_SECRET_KEY='just for test'
 | 
			
		||||
export APP_LOG=fittrackee.log
 | 
			
		||||
export UPLOAD_FOLDER=/usr/src/app/uploads
 | 
			
		||||
 | 
			
		||||
# Database
 | 
			
		||||
# PostgreSQL
 | 
			
		||||
export DATABASE_URL=postgresql://fittrackee:fittrackee@fittrackee-db:5432/fittrackee
 | 
			
		||||
export DATABASE_TEST_URL=postgresql://fittrackee:fittrackee@fittrackee-db:5432/fittrackee_test
 | 
			
		||||
# export DATABASE_DISABLE_POOLING=
 | 
			
		||||
 | 
			
		||||
# Redis (required for API rate limits and email sending)
 | 
			
		||||
export REDIS_URL=redis://redis:6379
 | 
			
		||||
 | 
			
		||||
# API rate limits
 | 
			
		||||
# export API_RATE_LIMITS=300 per 5 minutes
 | 
			
		||||
 | 
			
		||||
# Emails
 | 
			
		||||
export UI_URL=http://0.0.0.0:5000
 | 
			
		||||
# For development:
 | 
			
		||||
# export UI_URL=http://0.0.0.0:3000
 | 
			
		||||
export EMAIL_URL=smtp://mail:1025
 | 
			
		||||
export SENDER_EMAIL=fittrackee@example.com
 | 
			
		||||
export REDIS_URL=redis://redis:6379
 | 
			
		||||
export WORKERS_PROCESSES=2
 | 
			
		||||
 | 
			
		||||
# Workouts
 | 
			
		||||
 
 | 
			
		||||
@@ -12,15 +12,20 @@ export APP_SECRET_KEY='please change me'
 | 
			
		||||
export APP_LOG=fittrackee.log
 | 
			
		||||
export UPLOAD_FOLDER=
 | 
			
		||||
 | 
			
		||||
# Database
 | 
			
		||||
# PostgreSQL
 | 
			
		||||
# export DATABASE_URL=postgresql://fittrackee:fittrackee@${HOST}:5432/fittrackee
 | 
			
		||||
# export DATABASE_DISABLE_POOLING=
 | 
			
		||||
 | 
			
		||||
# Redis (required for API rate limits and email sending)
 | 
			
		||||
# export REDIS_URL=
 | 
			
		||||
 | 
			
		||||
# API rate limits
 | 
			
		||||
# export API_RATE_LIMITS=300 per 5 minutes
 | 
			
		||||
 | 
			
		||||
# Emails
 | 
			
		||||
export UI_URL=
 | 
			
		||||
export EMAIL_URL=
 | 
			
		||||
export SENDER_EMAIL=
 | 
			
		||||
# export REDIS_URL=
 | 
			
		||||
# export WORKERS_PROCESSES=
 | 
			
		||||
 | 
			
		||||
# Workouts
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								CHANGELOG.md
									
									
									
									
									
								
							
							
						
						@@ -1,5 +1,25 @@
 | 
			
		||||
# Change log
 | 
			
		||||
 | 
			
		||||
## Version 0.7.0 (2022/09/19)
 | 
			
		||||
 | 
			
		||||
### Features and enhancements
 | 
			
		||||
 | 
			
		||||
* [#88](https://github.com/SamR1/FitTrackee/issues/88) - OAuth 2.0 access token for api access
 | 
			
		||||
* [#231](https://github.com/SamR1/FitTrackee/issues/231) - Invalidate token on logout
 | 
			
		||||
* [PR#236](https://github.com/SamR1/FitTrackee/issues/236) - Add API rate limits
 | 
			
		||||
 | 
			
		||||
### Bugs Fixed
 | 
			
		||||
 | 
			
		||||
* [#232](https://github.com/SamR1/FitTrackee/issues/232) - Speed chart can not be hidden
 | 
			
		||||
* [#237](https://github.com/SamR1/FitTrackee/issues/237) - Can not edit a workout when notes value is null
 | 
			
		||||
 | 
			
		||||
### Translations
 | 
			
		||||
 | 
			
		||||
* [PR#212](https://github.com/SamR1/FitTrackee/issues/212) - Translations update from Hosted Weblate (thanks to J. Lavoie)
 | 
			
		||||
 | 
			
		||||
**Note:** This release contains database migration (see upgrade instructions in [documentation](https://samr1.github.io/FitTrackee/installation.html#upgrade))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Version 0.6.12 (2022/09/14)
 | 
			
		||||
 | 
			
		||||
### Issues Closed
 | 
			
		||||
 
 | 
			
		||||
@@ -1,4 +1,4 @@
 | 
			
		||||
# Sphinx build info version 1
 | 
			
		||||
# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done.
 | 
			
		||||
config: 46c4d8b5fa7946f979002cf919b92752
 | 
			
		||||
config: 0fd6e5b14109ac1347607ea7ecf55a9e
 | 
			
		||||
tags: 645f666f9bcd5a90fca523b33c5a78b7
 | 
			
		||||
 
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 550 KiB After Width: | Height: | Size: 550 KiB  | 
| 
		 Before Width: | Height: | Size: 371 KiB After Width: | Height: | Size: 371 KiB  | 
| 
		 Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 206 KiB  | 
| 
		 Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB  | 
| 
		 Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB  | 
| 
		 Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docs/_images/fittrackee_screenshot-07.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 109 KiB  | 
@@ -17,4 +17,5 @@ Authentication
 | 
			
		||||
    auth.request_password_reset,
 | 
			
		||||
    auth.update_user_account,
 | 
			
		||||
    auth.update_password,
 | 
			
		||||
    auth.update_email
 | 
			
		||||
    auth.update_email,
 | 
			
		||||
    auth.logout_user
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ API documentation
 | 
			
		||||
 | 
			
		||||
   auth
 | 
			
		||||
   configuration
 | 
			
		||||
   oauth2
 | 
			
		||||
   records
 | 
			
		||||
   sports
 | 
			
		||||
   stats
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								docs/_sources/api/oauth2.rst.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
			
		||||
OAuth2
 | 
			
		||||
######
 | 
			
		||||
 | 
			
		||||
.. autoflask:: fittrackee:create_app()
 | 
			
		||||
   :endpoints:
 | 
			
		||||
    oauth2.get_clients,
 | 
			
		||||
    oauth2.create_client,
 | 
			
		||||
    oauth2.get_client_by_client_id,
 | 
			
		||||
    oauth2.get_client_by_id,
 | 
			
		||||
    oauth2.delete_client,
 | 
			
		||||
    oauth2.revoke_client_tokens,
 | 
			
		||||
    oauth2.authorize,
 | 
			
		||||
    oauth2.issue_token,
 | 
			
		||||
    oauth2.revoke_token
 | 
			
		||||
							
								
								
									
										53
									
								
								docs/_sources/apps.rst.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,53 @@
 | 
			
		||||
Third-party applications
 | 
			
		||||
########################
 | 
			
		||||
(*new in 0.7.0*)
 | 
			
		||||
 | 
			
		||||
FitTrackee provides a REST API (see `documentation <api/index.html>`__) whose
 | 
			
		||||
most endpoints require authorization/authentication.
 | 
			
		||||
 | 
			
		||||
To allow a third-party application to interact with API endpoints, an
 | 
			
		||||
`OAuth2 <https://datatracker.ietf.org/doc/html/rfc6749>`_ client can be created
 | 
			
		||||
in user settings ('apps' tab).
 | 
			
		||||
 | 
			
		||||
.. warning::
 | 
			
		||||
  OAuth2 endpoints requiring authentication are not accessible by third-party
 | 
			
		||||
  applications (`documentation <api/oauth2.html>`__), only by FitTrackee
 | 
			
		||||
  client (first-party application).
 | 
			
		||||
 | 
			
		||||
FitTrackee supports only `Authorization Code <https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.1>`_
 | 
			
		||||
flow (with PKCE support).
 | 
			
		||||
It allows to exchange an authorization code for an access token.
 | 
			
		||||
The client ID and secret must be sent in the POST body.
 | 
			
		||||
It is recommended to use `PKCE <https://datatracker.ietf.org/doc/html/rfc7636>`_
 | 
			
		||||
to provide a better security.
 | 
			
		||||
 | 
			
		||||
The following scopes are available:
 | 
			
		||||
 | 
			
		||||
- ``application:write``: grants write access to application configuration (only for users with administration rights),
 | 
			
		||||
- ``profile:read``: grants read access to auth endpoints,
 | 
			
		||||
- ``profile:write``: grants write access to auth endpoints,
 | 
			
		||||
- ``users:read``: grants read access to users endpoints,
 | 
			
		||||
- ``users:write``: grants write access to users endpoints,
 | 
			
		||||
- ``workouts:read``: grants read access to workouts-related endpoints,
 | 
			
		||||
- ``workouts:write``: grants write access to workouts-related endpoints.
 | 
			
		||||
 | 
			
		||||
.. figure:: _images/fittrackee_screenshot-07.png
 | 
			
		||||
   :alt: OAuth2 client creation on FitTrackee
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
  OAuth2 support is implemented with `Authlib <https://docs.authlib.org/en/latest/>`_ library.
 | 
			
		||||
 | 
			
		||||
.. warning::
 | 
			
		||||
  | If FitTrackee is running behind a proxy, the ``X-Forwarded-Proto`` header must be set.
 | 
			
		||||
  | For instance for `nginx`:
 | 
			
		||||
 | 
			
		||||
  .. code-block::
 | 
			
		||||
 | 
			
		||||
     proxy_set_header  X-Forwarded-Proto $scheme;
 | 
			
		||||
 | 
			
		||||
Some resources about OAuth 2.0:
 | 
			
		||||
 | 
			
		||||
- `OAuth 2.0 Simplified <https://www.oauth.com>`_ by `Aaron Parecki <https://aaronparecki.com>`_
 | 
			
		||||
- `Web App Example of OAuth 2 web application flow <https://requests-oauthlib.readthedocs.io/en/latest/examples/real_world_example.html>`_ with Requests-OAuthlib (python)
 | 
			
		||||
- `OAuth 2 Session <https://docs.authlib.org/en/latest/client/oauth2.html#oauth-2-session>`_ with Authlib (python)
 | 
			
		||||
- `Minimal example of an application interacting with FitTrackee <https://codeberg.org/SamR1/ft-oauth-client>`_ (python)
 | 
			
		||||
@@ -1,5 +1,25 @@
 | 
			
		||||
# Change log
 | 
			
		||||
 | 
			
		||||
## Version 0.7.0 (2022/09/19)
 | 
			
		||||
 | 
			
		||||
### Features and enhancements
 | 
			
		||||
 | 
			
		||||
* [#88](https://github.com/SamR1/FitTrackee/issues/88) - OAuth 2.0 access token for api access
 | 
			
		||||
* [#231](https://github.com/SamR1/FitTrackee/issues/231) - Invalidate token on logout
 | 
			
		||||
* [PR#236](https://github.com/SamR1/FitTrackee/issues/236) - Add API rate limits
 | 
			
		||||
 | 
			
		||||
### Bugs Fixed
 | 
			
		||||
 | 
			
		||||
* [#232](https://github.com/SamR1/FitTrackee/issues/232) - Speed chart can not be hidden
 | 
			
		||||
* [#237](https://github.com/SamR1/FitTrackee/issues/237) - Can not edit a workout when notes value is null
 | 
			
		||||
 | 
			
		||||
### Translations
 | 
			
		||||
 | 
			
		||||
* [PR#212](https://github.com/SamR1/FitTrackee/issues/212) - Translations update from Hosted Weblate (thanks to J. Lavoie)
 | 
			
		||||
 | 
			
		||||
**Note:** This release contains database migration (see upgrade instructions in [documentation](https://samr1.github.io/FitTrackee/installation.html#upgrade))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## Version 0.6.12 (2022/09/14)
 | 
			
		||||
 | 
			
		||||
### Issues Closed
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
Command line interface
 | 
			
		||||
######################
 | 
			
		||||
 | 
			
		||||
A command line interface (CLI) is available to manage database and users.
 | 
			
		||||
A command line interface (CLI) is available to manage database, OAuth2 tokens and users.
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
@@ -14,8 +14,9 @@ A command line interface (CLI) is available to manage database and users.
 | 
			
		||||
      --help  Show this message and exit.
 | 
			
		||||
 | 
			
		||||
    Commands:
 | 
			
		||||
      db     Manage database.
 | 
			
		||||
      users  Manage users.
 | 
			
		||||
      db      Manage database.
 | 
			
		||||
      oauth2  Manage OAuth2 tokens.
 | 
			
		||||
      users   Manage users.
 | 
			
		||||
 | 
			
		||||
.. warning::
 | 
			
		||||
    | The following commands are now deprecated and will be removed in a next version:
 | 
			
		||||
@@ -40,10 +41,47 @@ Apply migrations.
 | 
			
		||||
Empty database and delete uploaded files, only on development environments.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OAuth2
 | 
			
		||||
~~~~~~
 | 
			
		||||
 | 
			
		||||
``ftcli oauth2 clean``
 | 
			
		||||
""""""""""""""""""""""
 | 
			
		||||
.. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
Remove tokens expired for more than provided number of days
 | 
			
		||||
 | 
			
		||||
.. cssclass:: table-bordered
 | 
			
		||||
.. list-table::
 | 
			
		||||
   :widths: 25 50
 | 
			
		||||
   :header-rows: 1
 | 
			
		||||
 | 
			
		||||
   * - Options
 | 
			
		||||
     - Description
 | 
			
		||||
   * - ``--days``
 | 
			
		||||
     - Number of days.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Users
 | 
			
		||||
~~~~~
 | 
			
		||||
 | 
			
		||||
``ftcli users clean_tokens``
 | 
			
		||||
""""""""""""""""""""""""""""
 | 
			
		||||
.. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
Remove blacklisted tokens expired for more than provided number of days.
 | 
			
		||||
 | 
			
		||||
.. cssclass:: table-bordered
 | 
			
		||||
.. list-table::
 | 
			
		||||
   :widths: 25 50
 | 
			
		||||
   :header-rows: 1
 | 
			
		||||
 | 
			
		||||
   * - Options
 | 
			
		||||
     - Description
 | 
			
		||||
   * - ``--days``
 | 
			
		||||
     - Number of days.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
``ftcli users update``
 | 
			
		||||
""""""""""""""""""""""
 | 
			
		||||
.. versionadded:: 0.6.5
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,14 @@
 | 
			
		||||
Features
 | 
			
		||||
########
 | 
			
		||||
 | 
			
		||||
| **FitTrackee** allows you to store and display gpx files and some statistics from your outdoor activities.
 | 
			
		||||
| For now, this app is kind of a single-user application. Even if several users can register, a user can only view his own workouts.
 | 
			
		||||
 | 
			
		||||
Gpx files are stored in an upload directory (without encryption).
 | 
			
		||||
 | 
			
		||||
With the default configuration, `Open Street Map <https://www.openstreetmap.org>`__ is used as tile server in Workout detail and for static map generation.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Workouts
 | 
			
		||||
^^^^^^^^
 | 
			
		||||
- 11 sports are supported:
 | 
			
		||||
@@ -83,6 +91,8 @@ Account & preferences
 | 
			
		||||
  | A disabled sport (by admin or user) will not appear in dropdown when **adding a workout**.
 | 
			
		||||
  | A workout with a disabled sport will still be displayed in the application.
 | 
			
		||||
 | 
			
		||||
- A user can create `clients <apps.html>`__ for third-party applications (*new in 0.7.0*).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Administration
 | 
			
		||||
^^^^^^^^^^^^^^
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ Table of contents
 | 
			
		||||
   :maxdepth: 1
 | 
			
		||||
 | 
			
		||||
   features
 | 
			
		||||
   apps
 | 
			
		||||
   installation
 | 
			
		||||
   cli
 | 
			
		||||
   api/index
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@ This application is written in Python (API) and Typescript (client):
 | 
			
		||||
    - `staticmap <https://github.com/komoot/staticmap>`_ to generate a static map image from gpx coordinates
 | 
			
		||||
    - `python-forecast.io <https://github.com/ZeevG/python-forecast.io>`_ to fetch weather data from `Dark Sky <https://darksky.net>`__ (former forecast.io)
 | 
			
		||||
    - `dramatiq <https://flask-dramatiq.readthedocs.io/en/latest/>`_ for task queue
 | 
			
		||||
    - `Authlib <https://docs.authlib.org/en/latest/>`_ for OAuth 2.0 Authorization support
 | 
			
		||||
    - `Flask-Limiter <https://flask-limiter.readthedocs.io/en/stable>`_ for API rate limits
 | 
			
		||||
- Client:
 | 
			
		||||
    - Vue3/Vuex
 | 
			
		||||
    - `Leaflet <https://leafletjs.com/>`__ to display map
 | 
			
		||||
@@ -20,13 +22,16 @@ This application is written in Python (API) and Typescript (client):
 | 
			
		||||
Prerequisites
 | 
			
		||||
~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
-  Python 3.7+
 | 
			
		||||
-  PostgreSQL database (10+)
 | 
			
		||||
-  SMTP provider and Redis for task queue (if email sending is enabled)
 | 
			
		||||
-  API key from `Dark Sky <https://darksky.net/dev>`__ (not mandatory)
 | 
			
		||||
-  `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
			
		||||
-  `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
			
		||||
-  Docker and Docker Compose (for development or evaluation purposes)
 | 
			
		||||
- mandatory
 | 
			
		||||
    - Python 3.7+
 | 
			
		||||
    - PostgreSQL 10+
 | 
			
		||||
- optional
 | 
			
		||||
    - Redis for task queue (if email sending is enabled) and API rate limits
 | 
			
		||||
    - SMTP provider (if email sending is enabled)
 | 
			
		||||
    - API key from `Dark Sky <https://darksky.net/dev>`__
 | 
			
		||||
    - `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
			
		||||
    - `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
			
		||||
    -  Docker and Docker Compose (for development or evaluation purposes)
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
    | The following steps describe an installation on Linux systems (tested
 | 
			
		||||
@@ -55,7 +60,7 @@ deployment method.
 | 
			
		||||
 | 
			
		||||
    **FitTrackee** host.
 | 
			
		||||
 | 
			
		||||
    :default: 0.0.0.0
 | 
			
		||||
    :default: 127.0.0.1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: PORT
 | 
			
		||||
@@ -76,6 +81,8 @@ deployment method.
 | 
			
		||||
 | 
			
		||||
    **FitTrackee** secret key, must be initialized in production environment.
 | 
			
		||||
 | 
			
		||||
    .. warning::
 | 
			
		||||
        Use a strong secret key. This key is used in JWT generation.
 | 
			
		||||
 | 
			
		||||
.. envvar:: APP_WORKERS
 | 
			
		||||
 | 
			
		||||
@@ -153,7 +160,7 @@ deployment method.
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.3.0
 | 
			
		||||
 | 
			
		||||
    Redis instance used by **Dramatiq**.
 | 
			
		||||
    Redis instance used by **Dramatiq** and **Flask-Limiter**.
 | 
			
		||||
 | 
			
		||||
    :default: local Redis instance (``redis://``)
 | 
			
		||||
 | 
			
		||||
@@ -165,6 +172,15 @@ deployment method.
 | 
			
		||||
    Number of processes used by **Dramatiq**.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: API_RATE_LIMITS 🆕
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
    API rate limits, see `API rate limits <installation.html#api-rate-limits>`__.
 | 
			
		||||
 | 
			
		||||
    :default: `300 per 5 minutes`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: TILE_SERVER_URL
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.4.0
 | 
			
		||||
@@ -175,7 +191,7 @@ deployment method.
 | 
			
		||||
    :default: `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: STATICMAP_SUBDOMAINS 🆕
 | 
			
		||||
.. envvar:: STATICMAP_SUBDOMAINS
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.6.10
 | 
			
		||||
 | 
			
		||||
@@ -286,6 +302,42 @@ For instance, to set OSM France tile server, the expected values are:
 | 
			
		||||
The subdomain will be chosen randomly.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
API rate limits 🆕
 | 
			
		||||
^^^^^^^^^^^^^^^^^^
 | 
			
		||||
.. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
| API rate limits are managed by `Flask-Limiter <https://flask-limiter.readthedocs.io/en/stable>`_, based on IP with fixed window strategy.
 | 
			
		||||
| To enable rate limits, **Redis** must be available.
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
    | If no Redis instance is available for rate limits, FitTrackee can still start.
 | 
			
		||||
 | 
			
		||||
| All endpoints are subject to rate limits, except endpoints serving assets.
 | 
			
		||||
| Limits can be modified by setting the environment variable ``API_RATE_LIMITS`` (see `Flask-Limiter documentation for notation <https://flask-limiter.readthedocs.io/en/stable/configuration.html#rate-limit-string-notation>`_).
 | 
			
		||||
| Rate limits must be separated by a comma, for instance:
 | 
			
		||||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
    export API_RATE_LIMITS="200 per day, 50 per hour"
 | 
			
		||||
 | 
			
		||||
**Flask-Limiter** provides a `Command Line Interface <https://flask-limiter.readthedocs.io/en/stable/cli.html>`_ for maintenance and diagnostic purposes.
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
    $ flask limiter
 | 
			
		||||
    Usage: flask limiter [OPTIONS] COMMAND [ARGS]...
 | 
			
		||||
 | 
			
		||||
      Flask-Limiter maintenance & utility commmands
 | 
			
		||||
 | 
			
		||||
    Options:
 | 
			
		||||
      --help  Show this message and exit.
 | 
			
		||||
 | 
			
		||||
    Commands:
 | 
			
		||||
      clear   Clear limits for a specific key
 | 
			
		||||
      config  View the extension configuration
 | 
			
		||||
      limits  Enumerate details about all routes with rate limits
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Installation
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
@@ -425,13 +477,13 @@ Production environment
 | 
			
		||||
.. warning::
 | 
			
		||||
    | Note that FitTrackee is under heavy development, some features may be unstable.
 | 
			
		||||
 | 
			
		||||
-  Download the last release (for now, it is the release v0.6.12):
 | 
			
		||||
-  Download the last release (for now, it is the release v0.7.0):
 | 
			
		||||
 | 
			
		||||
.. code:: bash
 | 
			
		||||
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.12.tar.gz
 | 
			
		||||
   $ tar -xzf v0.6.12.tar.gz
 | 
			
		||||
   $ mv FitTrackee-0.6.12 FitTrackee
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.0.tar.gz
 | 
			
		||||
   $ tar -xzf v0.7.0.tar.gz
 | 
			
		||||
   $ mv FitTrackee-0.7.0 FitTrackee
 | 
			
		||||
   $ cd FitTrackee
 | 
			
		||||
 | 
			
		||||
-  Create **.env** from example and update it
 | 
			
		||||
@@ -551,13 +603,13 @@ Prod environment
 | 
			
		||||
 | 
			
		||||
- Change to the directory where FitTrackee directory is located
 | 
			
		||||
 | 
			
		||||
- Download the last release (for now, it is the release v0.6.12) and overwrite existing files:
 | 
			
		||||
- Download the last release (for now, it is the release v0.7.0) and overwrite existing files:
 | 
			
		||||
 | 
			
		||||
.. code:: bash
 | 
			
		||||
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.12.tar.gz
 | 
			
		||||
   $ tar -xzf v0.6.12.tar.gz
 | 
			
		||||
   $ cp -R FitTrackee-0.6.12/* FitTrackee/
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.0.tar.gz
 | 
			
		||||
   $ tar -xzf v0.7.0.tar.gz
 | 
			
		||||
   $ cp -R FitTrackee-0.7.0/* FitTrackee/
 | 
			
		||||
   $ cd FitTrackee
 | 
			
		||||
 | 
			
		||||
- Update **.env** if needed (see `Environment variables <installation.html#environment-variables>`__).
 | 
			
		||||
@@ -685,6 +737,7 @@ Examples (to update depending on your application configuration and given distri
 | 
			
		||||
            proxy_set_header  X-Real-IP $remote_addr;
 | 
			
		||||
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
			
		||||
            proxy_set_header  X-Forwarded-Host $server_name;
 | 
			
		||||
            proxy_set_header  X-Forwarded-Proto $scheme;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								docs/_static/documentation_options.js
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1,6 +1,6 @@
 | 
			
		||||
var DOCUMENTATION_OPTIONS = {
 | 
			
		||||
    URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
 | 
			
		||||
    VERSION: '0.6.12',
 | 
			
		||||
    VERSION: '0.7.0',
 | 
			
		||||
    LANGUAGE: 'en',
 | 
			
		||||
    COLLAPSE_INDEX: false,
 | 
			
		||||
    BUILDER: 'html',
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										1
									
								
								docs/_static/pygments.css
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -54,6 +54,7 @@ span.linenos.special { color: #000000; background-color: #ffffc0; padding-left:
 | 
			
		||||
.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */
 | 
			
		||||
.highlight .nv { color: #000000 } /* Name.Variable */
 | 
			
		||||
.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */
 | 
			
		||||
.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */
 | 
			
		||||
.highlight .w { color: #f8f8f8 } /* Text.Whitespace */
 | 
			
		||||
.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */
 | 
			
		||||
.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Authentication — FitTrackee 0.6.12
 | 
			
		||||
    <title>Authentication — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -132,7 +133,7 @@
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-register">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/register</span></span><a class="headerlink" href="#post--api-auth-register" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>register a user and send confirmation email.</p>
 | 
			
		||||
<dd><p>Register a user and send confirmation email.</p>
 | 
			
		||||
<p>The newly created account is inactive. The user must confirm his email
 | 
			
		||||
to activate it.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
@@ -204,7 +205,7 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-account-confirm">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/confirm</span></span><a class="headerlink" href="#post--api-auth-account-confirm" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>activate user account after registration</p>
 | 
			
		||||
<dd><p>Activate user account after registration.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/account/confirm</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -240,8 +241,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-account-resend-confirmation">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/account/resend-confirmation</span></span><a class="headerlink" href="#post--api-auth-account-resend-confirmation" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>resend email with instructions to confirm account</p>
 | 
			
		||||
<p>If email sending is disabled, this endpoint is not available</p>
 | 
			
		||||
<dd><p>Resend email with instructions to confirm account.</p>
 | 
			
		||||
<p>If email sending is disabled, this endpoint is not available.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/account/resend-confirmation</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -277,7 +278,7 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-login">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/login</span></span><a class="headerlink" href="#post--api-auth-login" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>user login</p>
 | 
			
		||||
<dd><p>User login.</p>
 | 
			
		||||
<p>Only user with an active account can log in.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/login</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
@@ -331,7 +332,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-auth-profile">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile</span></span><a class="headerlink" href="#get--api-auth-profile" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>get authenticated user info (profile, account, preferences)</p>
 | 
			
		||||
<dd><p>Get authenticated user info (profile, account, preferences).</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/auth/profile</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -443,7 +445,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-profile-edit">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/edit</span></span><a class="headerlink" href="#post--api-auth-profile-edit" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>edit authenticated user profile</p>
 | 
			
		||||
<dd><p>Edit authenticated user profile.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/profile/edit</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -570,7 +573,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-profile-edit-preferences">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/edit/preferences</span></span><a class="headerlink" href="#post--api-auth-profile-edit-preferences" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>edit authenticated user preferences</p>
 | 
			
		||||
<dd><p>Edit authenticated user preferences.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/profile/edit/preferences</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -698,7 +702,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-profile-edit-sports">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/edit/sports</span></span><a class="headerlink" href="#post--api-auth-profile-edit-sports" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>edit authenticated user sport preferences</p>
 | 
			
		||||
<dd><p>Edit authenticated user sport preferences.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/profile/edit/sports</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -761,7 +766,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http delete">
 | 
			
		||||
<dt class="sig sig-object http" id="delete--api-auth-profile-reset-sports-(sport_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">DELETE</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/reset/sports/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">sport_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#delete--api-auth-profile-reset-sports-(sport_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>reset authenticated user preferences for a given sport</p>
 | 
			
		||||
<dd><p>Reset authenticated user preferences for a given sport.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">DELETE</span> <span class="nn">/api/auth/profile/reset/sports/1</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -805,7 +811,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-picture">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/picture</span></span><a class="headerlink" href="#post--api-auth-picture" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>update authenticated user picture</p>
 | 
			
		||||
<dd><p>Update authenticated user picture.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/picture</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">multipart/form-data</span>
 | 
			
		||||
@@ -858,7 +865,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http delete">
 | 
			
		||||
<dt class="sig sig-object http" id="delete--api-auth-picture">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">DELETE</span> </span><span class="sig-name descname"><span class="pre">/api/auth/picture</span></span><a class="headerlink" href="#delete--api-auth-picture" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>delete authenticated user picture</p>
 | 
			
		||||
<dd><p>Delete authenticated user picture.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">DELETE</span> <span class="nn">/api/auth/picture</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -893,7 +901,7 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-password-reset-request">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/password/reset-request</span></span><a class="headerlink" href="#post--api-auth-password-reset-request" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>handle password reset request</p>
 | 
			
		||||
<dd><p>Handle password reset request.</p>
 | 
			
		||||
<p>If email sending is disabled, this endpoint is not available</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/password/reset-request</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
@@ -929,7 +937,7 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http patch">
 | 
			
		||||
<dt class="sig sig-object http" id="patch--api-auth-profile-edit-account">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/auth/profile/edit/account</span></span><a class="headerlink" href="#patch--api-auth-profile-edit-account" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>update authenticated user email and password</p>
 | 
			
		||||
<dd><p>Update authenticated user email and password.</p>
 | 
			
		||||
<p>It sends emails if sending is enabled:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>Password change</p></li>
 | 
			
		||||
@@ -940,6 +948,7 @@ character “_” allowed</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
</ul>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">profile:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">PATCH</span> <span class="nn">/api/auth/profile/edit/account</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -1069,8 +1078,8 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-password-update">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/password/update</span></span><a class="headerlink" href="#post--api-auth-password-update" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>update user password after password reset request</p>
 | 
			
		||||
<p>It sends emails if sending is enabled</p>
 | 
			
		||||
<dd><p>Update user password after password reset request.</p>
 | 
			
		||||
<p>It sends emails if sending is enabled.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/password/update</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -1107,7 +1116,7 @@ character “_” allowed</p></li>
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-email-update">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/email/update</span></span><a class="headerlink" href="#post--api-auth-email-update" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>update user email after confirmation</p>
 | 
			
		||||
<dd><p>Update user email after confirmation.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/email/update</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -1139,6 +1148,65 @@ character “_” allowed</p></li>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-auth-logout">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/auth/logout</span></span><a class="headerlink" href="#post--api-auth-logout" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>User logout.
 | 
			
		||||
If a valid token is provided, it will be blacklisted.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/auth/logout</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example responses</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>successful logout</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">OK</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"successfully logged out"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>error on logout</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">401</span> <span class="ne">UNAUTHORIZED</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"provide a valid auth token"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"error"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – successfully logged out</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>The access token provided is expired, revoked, malformed, or invalid
 | 
			
		||||
for other reasons.</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.5.1">500 Internal Server Error</a></span> – <ul>
 | 
			
		||||
<li><p>error on token blacklist</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Configuration — FitTrackee 0.6.12
 | 
			
		||||
    <title>Configuration — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
    <script src="../_static/doctools.js"></script>
 | 
			
		||||
    <link rel="index" title="Index" href="../genindex.html" />
 | 
			
		||||
    <link rel="search" title="Search" href="../search.html" />
 | 
			
		||||
    <link rel="next" title="Records" href="records.html" />
 | 
			
		||||
    <link rel="next" title="OAuth2" href="oauth2.html" />
 | 
			
		||||
    <link rel="prev" title="Authentication" href="auth.html" />
 | 
			
		||||
<meta charset='utf-8'>
 | 
			
		||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -93,7 +94,7 @@
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="records.html" title="Next Chapter: Records"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Records »</span>
 | 
			
		||||
    <a href="oauth2.html" title="Next Chapter: OAuth2"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">OAuth2 »</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
              
 | 
			
		||||
@@ -132,7 +133,7 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-config">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/config</span></span><a class="headerlink" href="#get--api-config" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get Application config</p>
 | 
			
		||||
<dd><p>Get Application configuration.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/config</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -152,7 +153,7 @@
 | 
			
		||||
<span class="w">    </span><span class="nt">"max_users"</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"max_zip_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"map_attribution"</span><span class="p">:</span><span class="w"> </span><span class="nt">"&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.6.12"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.7.0"</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
@@ -171,8 +172,9 @@
 | 
			
		||||
<dl class="http patch">
 | 
			
		||||
<dt class="sig sig-object http" id="patch--api-config">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/config</span></span><a class="headerlink" href="#patch--api-config" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Update Application config</p>
 | 
			
		||||
<p>Authenticated user must be an admin</p>
 | 
			
		||||
<dd><p>Update Application configuration.</p>
 | 
			
		||||
<p>Authenticated user must be an admin.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">application:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/config</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -192,7 +194,7 @@
 | 
			
		||||
<span class="w">    </span><span class="nt">"max_users"</span><span class="p">:</span><span class="w"> </span><span class="mi">10</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"max_zip_file_size"</span><span class="p">:</span><span class="w"> </span><span class="mi">10485760</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"map_attribution"</span><span class="p">:</span><span class="w"> </span><span class="nt">"&copy; <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.6.12"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"version"</span><span class="p">:</span><span class="w"> </span><span class="s2">"0.7.0"</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
@@ -203,7 +205,7 @@
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>admin_contact</strong> (<em>string</em>) – email to contact the administrator</p></li>
 | 
			
		||||
<li><p><strong>gpx_limit_import</strong> (<em>integer</em>) – max number of files in zip archive</p></li>
 | 
			
		||||
<li><p><strong>is_registration_enabled</strong> (<em>boolean</em>) – is registration enabled ?</p></li>
 | 
			
		||||
<li><p><strong>is_registration_enabled</strong> (<em>boolean</em>) – is registration enabled?</p></li>
 | 
			
		||||
<li><p><strong>max_single_file_size</strong> (<em>integer</em>) – max size of a single file</p></li>
 | 
			
		||||
<li><p><strong>max_users</strong> (<em>integer</em>) – max users allowed to register on instance</p></li>
 | 
			
		||||
<li><p><strong>max_zip_file_size</strong> (<em>integer</em>) – max size of a zip archive</p></li>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>API documentation — FitTrackee 0.6.12
 | 
			
		||||
    <title>API documentation — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">API documentation</a></li>
 | 
			
		||||
@@ -134,6 +135,7 @@
 | 
			
		||||
<ul>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="auth.html">Authentication</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="configuration.html">Configuration</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="oauth2.html">OAuth2</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="records.html">Records</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="sports.html">Sports</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="stats.html">Statistics</a></li>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										700
									
								
								docs/api/oauth2.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,700 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>OAuth2 — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/custom.css" />
 | 
			
		||||
    <script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
 | 
			
		||||
    <script src="../_static/jquery.js"></script>
 | 
			
		||||
    <script src="../_static/underscore.js"></script>
 | 
			
		||||
    <script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
 | 
			
		||||
    <script src="../_static/doctools.js"></script>
 | 
			
		||||
    <link rel="index" title="Index" href="../genindex.html" />
 | 
			
		||||
    <link rel="search" title="Search" href="../search.html" />
 | 
			
		||||
    <link rel="next" title="Records" href="records.html" />
 | 
			
		||||
    <link rel="prev" title="Configuration" href="configuration.html" />
 | 
			
		||||
<meta charset='utf-8'>
 | 
			
		||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
			
		||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
			
		||||
<meta name="apple-mobile-web-app-capable" content="yes">
 | 
			
		||||
<script type="text/javascript" src="../_static/js/jquery-1.12.4.min.js"></script>
 | 
			
		||||
<script type="text/javascript" src="../_static/js/jquery-fix.js"></script>
 | 
			
		||||
<script type="text/javascript" src="../_static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
 | 
			
		||||
<script type="text/javascript" src="../_static/bootstrap-sphinx.js"></script>
 | 
			
		||||
 | 
			
		||||
  </head><body>
 | 
			
		||||
 | 
			
		||||
  <div id="navbar" class="navbar navbar-default navbar-fixed-top">
 | 
			
		||||
    <div class="container">
 | 
			
		||||
      <div class="navbar-header">
 | 
			
		||||
        <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
 | 
			
		||||
        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
 | 
			
		||||
          <span class="icon-bar"></span>
 | 
			
		||||
          <span class="icon-bar"></span>
 | 
			
		||||
          <span class="icon-bar"></span>
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
        <div class="collapse navbar-collapse nav-collapse">
 | 
			
		||||
          <ul class="nav navbar-nav">
 | 
			
		||||
            
 | 
			
		||||
                <li><a href="https://github.com/SamR1/FitTrackee">GitHub</a></li>
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
              <li class="dropdown globaltoc-container">
 | 
			
		||||
  <a role="button"
 | 
			
		||||
     id="dLabelGlobalToc"
 | 
			
		||||
     data-toggle="dropdown"
 | 
			
		||||
     data-target="#"
 | 
			
		||||
     href="../index.html">Docs <b class="caret"></b></a>
 | 
			
		||||
  <ul class="dropdown-menu globaltoc"
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../troubleshooting/index.html">Troubleshooting</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../changelog.html">Change log</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
              
 | 
			
		||||
                <li class="dropdown">
 | 
			
		||||
  <a role="button"
 | 
			
		||||
     id="dLabelLocalToc"
 | 
			
		||||
     data-toggle="dropdown"
 | 
			
		||||
     data-target="#"
 | 
			
		||||
     href="#">Page <b class="caret"></b></a>
 | 
			
		||||
  <ul class="dropdown-menu localtoc"
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelLocalToc"><ul>
 | 
			
		||||
<li><a class="reference internal" href="#">OAuth2</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
              
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
              
 | 
			
		||||
                
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="configuration.html" title="Previous Chapter: Configuration"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Configuration</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="records.html" title="Next Chapter: Records"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Records »</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
              
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
              <li class="hidden-sm">
 | 
			
		||||
<div id="sourcelink">
 | 
			
		||||
  <a href="../_sources/api/oauth2.rst.txt"
 | 
			
		||||
     rel="nofollow">Source</a>
 | 
			
		||||
</div></li>
 | 
			
		||||
            
 | 
			
		||||
          </ul>
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
            
 | 
			
		||||
<form class="navbar-form navbar-right" action="../search.html" method="get">
 | 
			
		||||
 <div class="form-group">
 | 
			
		||||
  <input type="text" name="q" class="form-control" placeholder="Search" />
 | 
			
		||||
 </div>
 | 
			
		||||
  <input type="hidden" name="check_keywords" value="yes" />
 | 
			
		||||
  <input type="hidden" name="area" value="default" />
 | 
			
		||||
</form>
 | 
			
		||||
          
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
<div class="container">
 | 
			
		||||
  <div class="row">
 | 
			
		||||
    <div class="body col-md-12 content" role="main">
 | 
			
		||||
      
 | 
			
		||||
  <section id="oauth2">
 | 
			
		||||
<h1>OAuth2<a class="headerlink" href="#oauth2" title="Permalink to this heading">¶</a></h1>
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-oauth-apps">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/apps</span></span><a class="headerlink" href="#get--api-oauth-apps" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get OAuth2 clients (apps) for authenticated user with pagination
 | 
			
		||||
(5 clients/page).</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>without parameters</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/oauth/apps</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>with ‘page’ parameter</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/oauth/apps?page=2</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"clients"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"client_description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"client_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"o22a27s2aBPUoxJbxV3UjDOx"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"issued_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Thu, 14 July 2022 06:27:53 GMT"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GPX Importer"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"redirect_uris"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
 | 
			
		||||
<span class="w">          </span><span class="s2">" https://example.com/callback"</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="p">],</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"profile:read workouts:write"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="nt">"website"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com"</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="p">}</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="p">]</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"pagination"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"has_next"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"has_prev"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"page"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"pages"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"total"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Query Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>page</strong> (<em>integer</em>) – page for pagination (default: 1)</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-oauth-apps">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/apps</span></span><a class="headerlink" href="#post--api-oauth-apps" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Create an OAuth2 client (app) for the authenticated user.</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/oauth/apps</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"client"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"o22a27s2aBPUoxJbxV3UjDOx"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_secret"</span><span class="p">:</span><span class="w"> </span><span class="s2">"<CLIENT SECRET>"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"issued_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Thu, 14 July 2022 06:27:53 GMT"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GPX Importer"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"redirect_uris"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="s2">"https://example.com/callback"</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="p">],</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"profile:read workouts:write"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"website"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="p">}</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"created"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">JSON Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>client_name</strong> (<em>string</em>) – client name</p></li>
 | 
			
		||||
<li><p><strong>client_uri</strong> (<em>string</em>) – client URL</p></li>
 | 
			
		||||
<li><p><strong>redirect_uri</strong> (<em>array</em>) – list of client redirect URLs (string)</p></li>
 | 
			
		||||
<li><p><strong>scope</strong> (<em>string</em>) – client scopes</p></li>
 | 
			
		||||
<li><p><strong>client_description</strong> (<em>string</em>) – client description (<cite>OPTIONAL</cite>)</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – <ul>
 | 
			
		||||
<li><p>invalid payload</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-oauth-apps-(string-client_client_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/apps/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">client_client_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-oauth-apps-(string-client_client_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get an OAuth2 client (app) by ‘client_id’.</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/oauth/apps/o22a27s2aBPUoxJbxV3UjDOx</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example responses</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>success</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"client"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"o22a27s2aBPUoxJbxV3UjDOx"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"issued_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Thu, 14 July 2022 06:27:53 GMT"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GPX Importer"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"redirect_uris"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="s2">"https://example.com/callback"</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="p">],</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"profile:read workouts:write"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"website"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="p">}</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>not found</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">404</span> <span class="ne">NOT FOUND</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"not found"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"OAuth2 client not found"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>client_client_id</strong> (<em>string</em>) – OAuth2 client client_id</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404 Not Found</a></span> – OAuth2 client not found</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-oauth-apps-(int-client_id)-by_id">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/apps/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">client_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/by_id</span></span><a class="headerlink" href="#get--api-oauth-apps-(int-client_id)-by_id" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get an OAuth2 client (app) by id (integer value).</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/oauth/apps/1/by_id</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example responses</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>success</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="nt">"client"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_description"</span><span class="p">:</span><span class="w"> </span><span class="s2">""</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"client_id"</span><span class="p">:</span><span class="w"> </span><span class="s2">"o22a27s2aBPUoxJbxV3UjDOx"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"issued_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Thu, 14 July 2022 06:27:53 GMT"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"GPX Importer"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"redirect_uris"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w"></span>
 | 
			
		||||
<span class="w">        </span><span class="s2">"https://example.com/callback"</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="p">],</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"scope"</span><span class="p">:</span><span class="w"> </span><span class="s2">"profile:read workouts:write"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">      </span><span class="nt">"website"</span><span class="p">:</span><span class="w"> </span><span class="s2">"https://example.com"</span><span class="w"></span>
 | 
			
		||||
<span class="w">    </span><span class="p">}</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="p">},</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>not found</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">404</span> <span class="ne">NOT FOUND</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"not found"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"message"</span><span class="p">:</span><span class="w"> </span><span class="s2">"OAuth2 client not found"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>client_id</strong> (<em>integer</em>) – OAuth2 client id</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404 Not Found</a></span> – OAuth2 client not found</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http delete">
 | 
			
		||||
<dt class="sig sig-object http" id="delete--api-oauth-apps-(int-client_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">DELETE</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/apps/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">client_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#delete--api-oauth-apps-(int-client_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Delete an OAuth2 client (app).</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">DELETE</span> <span class="nn">/api/oauth/apps/1</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">204</span> <span class="ne">NO CONTENT</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>client_id</strong> (<em>integer</em>) – OAuth2 client id</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.5">204 No Content</a></span> – OAuth2 client deleted</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404 Not Found</a></span> – OAuth2 client not found</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-oauth-apps-(int-client_id)-revoke">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/apps/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">client_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/revoke</span></span><a class="headerlink" href="#post--api-oauth-apps-(int-client_id)-revoke" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Revoke all tokens associated to an OAuth2 client (app).</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/oauth/apps/1/revoke</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>client_id</strong> (<em>integer</em>) – OAuth2 client id</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.5">404 Not Found</a></span> – OAuth2 client not found</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-oauth-authorize">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/authorize</span></span><a class="headerlink" href="#post--api-oauth-authorize" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Authorize an OAuth2 client (app).
 | 
			
		||||
If successful, it redirects to the client callback URL with the code to
 | 
			
		||||
issue a token.</p>
 | 
			
		||||
<p>This endpoint is only accessible by FitTrackee client (first-party
 | 
			
		||||
application).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/oauth/authorize</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">multipart/form-data</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"success"</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Form Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>string  client_id</strong> – OAuth2 client ‘client_id’</p></li>
 | 
			
		||||
<li><p><strong>string  response_type</strong> – client response type (only ‘code’ is supported
 | 
			
		||||
by FitTrackee)</p></li>
 | 
			
		||||
<li><p><strong>string  scopes</strong> – OAuth2 client scopes</p></li>
 | 
			
		||||
<li><p><strong>boolean confirm</strong> – confirmation (must be ‘true’)</p></li>
 | 
			
		||||
<li><p><strong>string  state</strong> – unique value to prevent cross-site request forgery
 | 
			
		||||
(not mandatory but recommended)</p></li>
 | 
			
		||||
<li><p><strong>string  code_challenge</strong> – string generated from a code verifier
 | 
			
		||||
(for PKCE, not mandatory but recommended)</p></li>
 | 
			
		||||
<li><p><strong>string  code_challenge_method</strong> – method used to create challenge,
 | 
			
		||||
for instance “S256” (mandatory if <cite>code_challenge</cite>
 | 
			
		||||
provided)</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Request Headers<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://tools.ietf.org/html/rfc7235#section-4.2">Authorization</a></span> – OAuth 2.0 Bearer Token</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-odd">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – <ul>
 | 
			
		||||
<li><p>invalid payload</p></li>
 | 
			
		||||
<li><p>errors returned by Authlib library</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-oauth-token">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/token</span></span><a class="headerlink" href="#post--api-oauth-token" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Issue or refresh token for a given OAuth2 client (app).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/oauth/token</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">multipart/form-data</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"access_token"</span><span class="p">:</span><span class="w"> </span><span class="s2">"rOEHv64THCG28WcewZHRnVLUsOdUvw8NVnHKCmL57e"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"expires_in"</span><span class="p">:</span><span class="w"> </span><span class="mi">864000</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"refresh_token"</span><span class="p">:</span><span class="w"> </span><span class="s2">"NuV9cY8VQOnrQKHTZ5pQAq2Zw7mSH0MorNPJr14AmSwD6f6I"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"scope"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">"profile:read"</span><span class="p">,</span><span class="w"> </span><span class="s2">"workouts:write"</span><span class="p">],</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"token_type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"Bearer"</span><span class="p">,</span><span class="w"></span>
 | 
			
		||||
<span class="w">  </span><span class="nt">"expires_at"</span><span class="p">:</span><span class="w"> </span><span class="mf">1658660147.0667062</span><span class="w"></span>
 | 
			
		||||
<span class="p">}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Form Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>string  client_id</strong> – OAuth2 client ‘client_id’</p></li>
 | 
			
		||||
<li><p><strong>string  client_secret</strong> – OAuth2 client secret</p></li>
 | 
			
		||||
<li><p><strong>string  grant_type</strong> – OAuth2 client grant type
 | 
			
		||||
(only ‘authorization_code’ (for token issue)
 | 
			
		||||
and ‘refresh_token’ (for token refresh)
 | 
			
		||||
are supported by FitTrackee)</p></li>
 | 
			
		||||
<li><p><strong>string  code</strong> – code generated after authorizing the client
 | 
			
		||||
(for token issue)</p></li>
 | 
			
		||||
<li><p><strong>string  code_verifier</strong> – code verifier
 | 
			
		||||
(for token issue with PKCE, not mandatory)</p></li>
 | 
			
		||||
<li><p><strong>string  refresh_token</strong> – refresh token (for token refresh)</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – <ul>
 | 
			
		||||
<li><p>errors returned by Authlib library</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-oauth-revoke">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/oauth/revoke</span></span><a class="headerlink" href="#post--api-oauth-revoke" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Revoke a token for a given OAuth2 client (app).</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/oauth/revoke</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">multipart/form-data</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">200</span> <span class="ne">SUCCESS</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 | 
			
		||||
<span class="p">{}</span><span class="w"></span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Form Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>string client_id</strong> – OAuth2 client ‘client_id’</p></li>
 | 
			
		||||
<li><p><strong>string client_secret</strong> – OAuth2 client secret</p></li>
 | 
			
		||||
<li><p><strong>string token</strong> – access token to revoke</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Status Codes<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-even"><ul class="simple">
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.2.1">200 OK</a></span> – success</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.1">400 Bad Request</a></span> – <ul>
 | 
			
		||||
<li><p>errors returned by Authlib library</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
<li><p><span><a class="reference external" href="https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.4.2">401 Unauthorized</a></span> – <ul>
 | 
			
		||||
<li><p>provide a valid auth token</p></li>
 | 
			
		||||
<li><p>signature expired, please log in again</p></li>
 | 
			
		||||
<li><p>invalid token, please log in again</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
      
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
<footer class="footer">
 | 
			
		||||
  <div class="container">
 | 
			
		||||
    <p class="pull-right">
 | 
			
		||||
      <a href="#">Back to top</a>
 | 
			
		||||
      
 | 
			
		||||
    </p>
 | 
			
		||||
    <p>
 | 
			
		||||
        © Copyright 2018 - 2022, SamR1.<br/>
 | 
			
		||||
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.1.1.<br/>
 | 
			
		||||
    </p>
 | 
			
		||||
  </div>
 | 
			
		||||
</footer>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Records — FitTrackee 0.6.12
 | 
			
		||||
    <title>Records — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
    <link rel="index" title="Index" href="../genindex.html" />
 | 
			
		||||
    <link rel="search" title="Search" href="../search.html" />
 | 
			
		||||
    <link rel="next" title="Sports" href="sports.html" />
 | 
			
		||||
    <link rel="prev" title="Configuration" href="configuration.html" />
 | 
			
		||||
    <link rel="prev" title="OAuth2" href="oauth2.html" />
 | 
			
		||||
<meta charset='utf-8'>
 | 
			
		||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
			
		||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -89,7 +90,7 @@
 | 
			
		||||
              
 | 
			
		||||
                
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="configuration.html" title="Previous Chapter: Configuration"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Configuration</span>
 | 
			
		||||
    <a href="oauth2.html" title="Previous Chapter: OAuth2"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« OAuth2</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
@@ -143,6 +144,7 @@
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/records</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Sports — FitTrackee 0.6.12
 | 
			
		||||
    <title>Sports — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -133,6 +134,7 @@
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-sports">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/sports</span></span><a class="headerlink" href="#get--api-sports" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get all sports</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/sports</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -295,6 +297,7 @@
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-sports-(int-sport_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/sports/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">sport_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-sports-(int-sport_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get a sport</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/sports/1</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -391,14 +394,15 @@
 | 
			
		||||
<dl class="http patch">
 | 
			
		||||
<dt class="sig sig-object http" id="patch--api-sports-(int-sport_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/sports/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">sport_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#patch--api-sports-(int-sport_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Update a sport
 | 
			
		||||
Authenticated user must be an admin</p>
 | 
			
		||||
<dd><p>Update a sport.</p>
 | 
			
		||||
<p>Authenticated user must be an admin.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">PATCH</span> <span class="nn">/api/sports/1</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Example response</strong>:</p>
 | 
			
		||||
<p><strong>Example responses</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>success</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Statistics — FitTrackee 0.6.12
 | 
			
		||||
    <title>Statistics — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -132,7 +133,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-stats-(user_name)-by_time">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/stats/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">user_name</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/by_time</span></span><a class="headerlink" href="#get--api-stats-(user_name)-by_time" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get workouts statistics for a user by time</p>
 | 
			
		||||
<dd><p>Get workouts statistics for a user by time.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example requests</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>without parameters</p></li>
 | 
			
		||||
@@ -208,7 +210,7 @@
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>user_name</strong> (<em>integer</em>) – user name</p></li>
 | 
			
		||||
<li><p><strong>user_name</strong> (<em>integer</em>) – username</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Query Parameters<span class="colon">:</span></dt>
 | 
			
		||||
@@ -251,7 +253,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-stats-(user_name)-by_sport">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/stats/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">user_name</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/by_sport</span></span><a class="headerlink" href="#get--api-stats-(user_name)-by_sport" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get workouts statistics for a user by sport</p>
 | 
			
		||||
<dd><p>Get workouts statistics for a user by sport.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example requests</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>without parameters (get stats for all sports with workouts)</p></li>
 | 
			
		||||
@@ -322,7 +325,7 @@
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Parameters<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><ul class="simple">
 | 
			
		||||
<li><p><strong>user_name</strong> (<em>integer</em>) – user name</p></li>
 | 
			
		||||
<li><p><strong>user_name</strong> (<em>integer</em>) – username</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
<dt class="field-even">Query Parameters<span class="colon">:</span></dt>
 | 
			
		||||
@@ -357,7 +360,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-stats-all">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/stats/all</span></span><a class="headerlink" href="#get--api-stats-all" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get all application statistics</p>
 | 
			
		||||
<dd><p>Get all application statistics.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example requests</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/stats/all</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Users — FitTrackee 0.6.12
 | 
			
		||||
    <title>Users — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -133,8 +134,9 @@
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-users">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/users</span></span><a class="headerlink" href="#get--api-users" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get all users (regardless their account status), if authenticated user
 | 
			
		||||
has admin rights</p>
 | 
			
		||||
has admin rights.</p>
 | 
			
		||||
<p>It returns user preferences only for authenticated user.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">users:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>without parameters</p></li>
 | 
			
		||||
@@ -293,6 +295,7 @@ has admin rights</p>
 | 
			
		||||
<dd><p>Get single user details. Only user with admin rights can get other users
 | 
			
		||||
details.</p>
 | 
			
		||||
<p>It returns user preferences only for authenticated user.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">users:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/users/admin</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -446,7 +449,7 @@ details.</p>
 | 
			
		||||
<dl class="http patch">
 | 
			
		||||
<dt class="sig sig-object http" id="patch--api-users-(user_name)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/users/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">user_name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#patch--api-users-(user_name)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Update user account</p>
 | 
			
		||||
<dd><p>Update user account.</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>add/remove admin rights (regardless user account status)</p></li>
 | 
			
		||||
<li><p>reset password (and send email to update user password,
 | 
			
		||||
@@ -454,7 +457,8 @@ if sending enabled)</p></li>
 | 
			
		||||
<li><p>update user email (and send email to new user email, if sending enabled)</p></li>
 | 
			
		||||
<li><p>activate account for an inactive user</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<p>Only user with admin rights can modify another user</p>
 | 
			
		||||
<p>Only user with admin rights can modify another user.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">users:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">PATCH</span> <span class="nn">/api/users/<user_name></span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -591,10 +595,11 @@ if sending enabled)</p></li>
 | 
			
		||||
<dl class="http delete">
 | 
			
		||||
<dt class="sig sig-object http" id="delete--api-users-(user_name)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">DELETE</span> </span><span class="sig-name descname"><span class="pre">/api/users/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">user_name</span></em><span class="sig-paren">)</span><a class="headerlink" href="#delete--api-users-(user_name)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Delete a user account</p>
 | 
			
		||||
<p>A user can only delete his own account</p>
 | 
			
		||||
<dd><p>Delete a user account.</p>
 | 
			
		||||
<p>A user can only delete his own account.</p>
 | 
			
		||||
<p>An admin can delete all accounts except his account if he’s the only
 | 
			
		||||
one admin</p>
 | 
			
		||||
one admin.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">users:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">DELETE</span> <span class="nn">/api/users/john_doe</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Workouts — FitTrackee 0.6.12
 | 
			
		||||
    <title>Workouts — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="reference internal" href="index.html">API documentation</a></li>
 | 
			
		||||
@@ -133,6 +134,7 @@
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts</span></span><a class="headerlink" href="#get--api-workouts" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get workouts for the authenticated user.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example requests</strong>:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>without parameters</p></li>
 | 
			
		||||
@@ -294,7 +296,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-(string-workout_short_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-workouts-(string-workout_short_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get a workout</p>
 | 
			
		||||
<dd><p>Get a workout.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
@@ -345,7 +348,7 @@
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>acitivity not found:</p></li>
 | 
			
		||||
<li><p>workout not found:</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span> <span class="m">404</span> <span class="ne">NOT FOUND</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -388,7 +391,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-(string-workout_short_id)-gpx">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/gpx</span></span><a class="headerlink" href="#get--api-workouts-(string-workout_short_id)-gpx" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get gpx file for a workout displayed on map with Leaflet</p>
 | 
			
		||||
<dd><p>Get gpx file for a workout displayed on map with Leaflet.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -441,7 +445,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-(string-workout_short_id)-chart_data">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/chart_data</span></span><a class="headerlink" href="#get--api-workouts-(string-workout_short_id)-chart_data" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get chart data from a workout gpx file, to display it with Recharts</p>
 | 
			
		||||
<dd><p>Get chart data from a workout gpx file, to display it with Chart.js.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF/chart</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -514,6 +519,7 @@
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-(string-workout_short_id)-chart_data-segment-(int-segment_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/chart_data/segment/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">segment_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-workouts-(string-workout_short_id)-chart_data-segment-(int-segment_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get chart data from a workout gpx file, to display it with Recharts</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF/chart/segment/0</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -583,7 +589,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-(string-workout_short_id)-gpx-segment-(int-segment_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/gpx/segment/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">int:</span> </em><em class="sig-param"><span class="pre">segment_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-workouts-(string-workout_short_id)-gpx-segment-(int-segment_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get gpx file for a workout segment displayed on map with Leaflet</p>
 | 
			
		||||
<dd><p>Get gpx file for a workout segment displayed on map with Leaflet.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx/segment/0</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -634,7 +641,7 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-map-(map_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/map/</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="pre">map_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#get--api-workouts-map-(map_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Get map image for workouts with gpx</p>
 | 
			
		||||
<dd><p>Get map image for workouts with gpx.</p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/map/fa33f4d996844a5c73ecd1ae24456ab8?1563529507772</span>
 | 
			
		||||
  <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
@@ -696,7 +703,8 @@
 | 
			
		||||
<dl class="http get">
 | 
			
		||||
<dt class="sig sig-object http" id="get--api-workouts-(string-workout_short_id)-gpx-download">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">GET</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><span class="sig-name descname"><span class="pre">/gpx/download</span></span><a class="headerlink" href="#get--api-workouts-(string-workout_short_id)-gpx-download" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Download gpx file</p>
 | 
			
		||||
<dd><p>Download gpx file.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:read</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">GET</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF/gpx/download</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
@@ -734,7 +742,8 @@
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-workouts">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/workouts</span></span><a class="headerlink" href="#post--api-workouts" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Post a workout with a gpx file</p>
 | 
			
		||||
<dd><p>Post a workout with a gpx file.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/workouts/</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">multipart/form-data</span>
 | 
			
		||||
@@ -857,7 +866,8 @@
 | 
			
		||||
<dl class="http post">
 | 
			
		||||
<dt class="sig sig-object http" id="post--api-workouts-no_gpx">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">POST</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/no_gpx</span></span><a class="headerlink" href="#post--api-workouts-no_gpx" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Post a workout without gpx file</p>
 | 
			
		||||
<dd><p>Post a workout without gpx file.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">POST</span> <span class="nn">/api/workouts/no_gpx</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -978,7 +988,8 @@
 | 
			
		||||
<dl class="http patch">
 | 
			
		||||
<dt class="sig sig-object http" id="patch--api-workouts-(string-workout_short_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">PATCH</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#patch--api-workouts-(string-workout_short_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Update a workout</p>
 | 
			
		||||
<dd><p>Update a workout.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">PATCH</span> <span class="nn">/api/workouts/1</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
@@ -1108,7 +1119,8 @@
 | 
			
		||||
<dl class="http delete">
 | 
			
		||||
<dt class="sig sig-object http" id="delete--api-workouts-(string-workout_short_id)">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">DELETE</span> </span><span class="sig-name descname"><span class="pre">/api/workouts/</span></span><span class="sig-paren">(</span><em class="property"><span class="pre">string:</span> </em><em class="sig-param"><span class="pre">workout_short_id</span></em><span class="sig-paren">)</span><a class="headerlink" href="#delete--api-workouts-(string-workout_short_id)" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p>Delete a workout</p>
 | 
			
		||||
<dd><p>Delete a workout.</p>
 | 
			
		||||
<p><strong>Scope</strong>: <code class="docutils literal notranslate"><span class="pre">workouts:write</span></code></p>
 | 
			
		||||
<p><strong>Example request</strong>:</p>
 | 
			
		||||
<div class="highlight-http notranslate"><div class="highlight"><pre><span></span><span class="nf">DELETE</span> <span class="nn">/api/workouts/kjxavSTUrJvoAh2wvCeGEF</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
 | 
			
		||||
<span class="na">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										205
									
								
								docs/apps.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,205 @@
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
 | 
			
		||||
<html lang="en">
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Third-party applications — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/custom.css" />
 | 
			
		||||
    <script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
 | 
			
		||||
    <script src="_static/jquery.js"></script>
 | 
			
		||||
    <script src="_static/underscore.js"></script>
 | 
			
		||||
    <script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
 | 
			
		||||
    <script src="_static/doctools.js"></script>
 | 
			
		||||
    <link rel="index" title="Index" href="genindex.html" />
 | 
			
		||||
    <link rel="search" title="Search" href="search.html" />
 | 
			
		||||
    <link rel="next" title="Installation" href="installation.html" />
 | 
			
		||||
    <link rel="prev" title="Features" href="features.html" />
 | 
			
		||||
<meta charset='utf-8'>
 | 
			
		||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
			
		||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
			
		||||
<meta name="apple-mobile-web-app-capable" content="yes">
 | 
			
		||||
<script type="text/javascript" src="_static/js/jquery-1.12.4.min.js"></script>
 | 
			
		||||
<script type="text/javascript" src="_static/js/jquery-fix.js"></script>
 | 
			
		||||
<script type="text/javascript" src="_static/bootstrap-3.4.1/js/bootstrap.min.js"></script>
 | 
			
		||||
<script type="text/javascript" src="_static/bootstrap-sphinx.js"></script>
 | 
			
		||||
 | 
			
		||||
  </head><body>
 | 
			
		||||
 | 
			
		||||
  <div id="navbar" class="navbar navbar-default navbar-fixed-top">
 | 
			
		||||
    <div class="container">
 | 
			
		||||
      <div class="navbar-header">
 | 
			
		||||
        <!-- .btn-navbar is used as the toggle for collapsed navbar content -->
 | 
			
		||||
        <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".nav-collapse">
 | 
			
		||||
          <span class="icon-bar"></span>
 | 
			
		||||
          <span class="icon-bar"></span>
 | 
			
		||||
          <span class="icon-bar"></span>
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
        <div class="collapse navbar-collapse nav-collapse">
 | 
			
		||||
          <ul class="nav navbar-nav">
 | 
			
		||||
            
 | 
			
		||||
                <li><a href="https://github.com/SamR1/FitTrackee">GitHub</a></li>
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
              <li class="dropdown globaltoc-container">
 | 
			
		||||
  <a role="button"
 | 
			
		||||
     id="dLabelGlobalToc"
 | 
			
		||||
     data-toggle="dropdown"
 | 
			
		||||
     data-target="#"
 | 
			
		||||
     href="index.html">Docs <b class="caret"></b></a>
 | 
			
		||||
  <ul class="dropdown-menu globaltoc"
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="troubleshooting/index.html">Troubleshooting</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="changelog.html">Change log</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
              
 | 
			
		||||
                <li class="dropdown">
 | 
			
		||||
  <a role="button"
 | 
			
		||||
     id="dLabelLocalToc"
 | 
			
		||||
     data-toggle="dropdown"
 | 
			
		||||
     data-target="#"
 | 
			
		||||
     href="#">Page <b class="caret"></b></a>
 | 
			
		||||
  <ul class="dropdown-menu localtoc"
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelLocalToc"><ul>
 | 
			
		||||
<li><a class="reference internal" href="#">Third-party applications</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
              
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
              
 | 
			
		||||
                
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="features.html" title="Previous Chapter: Features"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Features</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="installation.html" title="Next Chapter: Installation"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Installation »</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
              
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
            
 | 
			
		||||
              <li class="hidden-sm">
 | 
			
		||||
<div id="sourcelink">
 | 
			
		||||
  <a href="_sources/apps.rst.txt"
 | 
			
		||||
     rel="nofollow">Source</a>
 | 
			
		||||
</div></li>
 | 
			
		||||
            
 | 
			
		||||
          </ul>
 | 
			
		||||
 | 
			
		||||
          
 | 
			
		||||
            
 | 
			
		||||
<form class="navbar-form navbar-right" action="search.html" method="get">
 | 
			
		||||
 <div class="form-group">
 | 
			
		||||
  <input type="text" name="q" class="form-control" placeholder="Search" />
 | 
			
		||||
 </div>
 | 
			
		||||
  <input type="hidden" name="check_keywords" value="yes" />
 | 
			
		||||
  <input type="hidden" name="area" value="default" />
 | 
			
		||||
</form>
 | 
			
		||||
          
 | 
			
		||||
        </div>
 | 
			
		||||
    </div>
 | 
			
		||||
  </div>
 | 
			
		||||
 | 
			
		||||
<div class="container">
 | 
			
		||||
  <div class="row">
 | 
			
		||||
    <div class="body col-md-12 content" role="main">
 | 
			
		||||
      
 | 
			
		||||
  <section id="third-party-applications">
 | 
			
		||||
<h1>Third-party applications<a class="headerlink" href="#third-party-applications" title="Permalink to this heading">¶</a></h1>
 | 
			
		||||
<p>(<em>new in 0.7.0</em>)</p>
 | 
			
		||||
<p>FitTrackee provides a REST API (see <a class="reference external" href="api/index.html">documentation</a>) whose
 | 
			
		||||
most endpoints require authorization/authentication.</p>
 | 
			
		||||
<p>To allow a third-party application to interact with API endpoints, an
 | 
			
		||||
<a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc6749">OAuth2</a> client can be created
 | 
			
		||||
in user settings (‘apps’ tab).</p>
 | 
			
		||||
<div class="admonition warning">
 | 
			
		||||
<p class="admonition-title">Warning</p>
 | 
			
		||||
<p>OAuth2 endpoints requiring authentication are not accessible by third-party
 | 
			
		||||
applications (<a class="reference external" href="api/oauth2.html">documentation</a>), only by FitTrackee
 | 
			
		||||
client (first-party application).</p>
 | 
			
		||||
</div>
 | 
			
		||||
<p>FitTrackee supports only <a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.1">Authorization Code</a>
 | 
			
		||||
flow (with PKCE support).
 | 
			
		||||
It allows to exchange an authorization code for an access token.
 | 
			
		||||
The client ID and secret must be sent in the POST body.
 | 
			
		||||
It is recommended to use <a class="reference external" href="https://datatracker.ietf.org/doc/html/rfc7636">PKCE</a>
 | 
			
		||||
to provide a better security.</p>
 | 
			
		||||
<p>The following scopes are available:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">application:write</span></code>: grants write access to application configuration (only for users with administration rights),</p></li>
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">profile:read</span></code>: grants read access to auth endpoints,</p></li>
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">profile:write</span></code>: grants write access to auth endpoints,</p></li>
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">users:read</span></code>: grants read access to users endpoints,</p></li>
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">users:write</span></code>: grants write access to users endpoints,</p></li>
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">workouts:read</span></code>: grants read access to workouts-related endpoints,</p></li>
 | 
			
		||||
<li><p><code class="docutils literal notranslate"><span class="pre">workouts:write</span></code>: grants write access to workouts-related endpoints.</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<figure class="align-default">
 | 
			
		||||
<img alt="OAuth2 client creation on FitTrackee" src="_images/fittrackee_screenshot-07.png" />
 | 
			
		||||
</figure>
 | 
			
		||||
<div class="admonition note">
 | 
			
		||||
<p class="admonition-title">Note</p>
 | 
			
		||||
<p>OAuth2 support is implemented with <a class="reference external" href="https://docs.authlib.org/en/latest/">Authlib</a> library.</p>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="admonition warning">
 | 
			
		||||
<p class="admonition-title">Warning</p>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
<div class="line">If FitTrackee is running behind a proxy, the <code class="docutils literal notranslate"><span class="pre">X-Forwarded-Proto</span></code> header must be set.</div>
 | 
			
		||||
<div class="line">For instance for <cite>nginx</cite>:</div>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span>proxy_set_header  X-Forwarded-Proto $scheme;
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<p>Some resources about OAuth 2.0:</p>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p><a class="reference external" href="https://www.oauth.com">OAuth 2.0 Simplified</a> by <a class="reference external" href="https://aaronparecki.com">Aaron Parecki</a></p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://requests-oauthlib.readthedocs.io/en/latest/examples/real_world_example.html">Web App Example of OAuth 2 web application flow</a> with Requests-OAuthlib (python)</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://docs.authlib.org/en/latest/client/oauth2.html#oauth-2-session">OAuth 2 Session</a> with Authlib (python)</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://codeberg.org/SamR1/ft-oauth-client">Minimal example of an application interacting with FitTrackee</a> (python)</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</section>
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    </div>
 | 
			
		||||
      
 | 
			
		||||
  </div>
 | 
			
		||||
</div>
 | 
			
		||||
<footer class="footer">
 | 
			
		||||
  <div class="container">
 | 
			
		||||
    <p class="pull-right">
 | 
			
		||||
      <a href="#">Back to top</a>
 | 
			
		||||
      
 | 
			
		||||
    </p>
 | 
			
		||||
    <p>
 | 
			
		||||
        © Copyright 2018 - 2022, SamR1.<br/>
 | 
			
		||||
      Created using <a href="http://sphinx-doc.org/">Sphinx</a> 5.1.1.<br/>
 | 
			
		||||
    </p>
 | 
			
		||||
  </div>
 | 
			
		||||
</footer>
 | 
			
		||||
  </body>
 | 
			
		||||
</html>
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Command line interface — FitTrackee 0.6.12
 | 
			
		||||
    <title>Command line interface — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
@@ -85,7 +86,12 @@
 | 
			
		||||
<li><a class="reference internal" href="#ftcli-db-drop"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">db</span> <span class="pre">drop</span></code></a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a class="reference internal" href="#oauth2">OAuth2</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#ftcli-oauth2-clean"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">oauth2</span> <span class="pre">clean</span></code></a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a class="reference internal" href="#users">Users</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#ftcli-users-clean-tokens"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_tokens</span></code></a></li>
 | 
			
		||||
<li><a class="reference internal" href="#ftcli-users-update"><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">update</span></code></a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
@@ -140,7 +146,7 @@
 | 
			
		||||
      
 | 
			
		||||
  <section id="command-line-interface">
 | 
			
		||||
<h1>Command line interface<a class="headerlink" href="#command-line-interface" title="Permalink to this heading">¶</a></h1>
 | 
			
		||||
<p>A command line interface (CLI) is available to manage database and users.</p>
 | 
			
		||||
<p>A command line interface (CLI) is available to manage database, OAuth2 tokens and users.</p>
 | 
			
		||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ ftcli
 | 
			
		||||
Usage: ftcli <span class="o">[</span>OPTIONS<span class="o">]</span> COMMAND <span class="o">[</span>ARGS<span class="o">]</span>...
 | 
			
		||||
 | 
			
		||||
@@ -150,8 +156,9 @@ Options:
 | 
			
		||||
  --help  Show this message and exit.
 | 
			
		||||
 | 
			
		||||
Commands:
 | 
			
		||||
  db     Manage database.
 | 
			
		||||
  users  Manage users.
 | 
			
		||||
  db      Manage database.
 | 
			
		||||
  oauth2  Manage OAuth2 tokens.
 | 
			
		||||
  users   Manage users.
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="admonition warning">
 | 
			
		||||
@@ -179,8 +186,57 @@ Commands:
 | 
			
		||||
<p>Empty database and delete uploaded files, only on development environments.</p>
 | 
			
		||||
</section>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="oauth2">
 | 
			
		||||
<h2>OAuth2<a class="headerlink" href="#oauth2" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
<section id="ftcli-oauth2-clean">
 | 
			
		||||
<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">oauth2</span> <span class="pre">clean</span></code><a class="headerlink" href="#ftcli-oauth2-clean" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.7.0.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
<p>Remove tokens expired for more than provided number of days</p>
 | 
			
		||||
<table class="table-bordered docutils align-default">
 | 
			
		||||
<colgroup>
 | 
			
		||||
<col style="width: 33.3%" />
 | 
			
		||||
<col style="width: 66.7%" />
 | 
			
		||||
</colgroup>
 | 
			
		||||
<thead>
 | 
			
		||||
<tr class="row-odd"><th class="head"><p>Options</p></th>
 | 
			
		||||
<th class="head"><p>Description</p></th>
 | 
			
		||||
</tr>
 | 
			
		||||
</thead>
 | 
			
		||||
<tbody>
 | 
			
		||||
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">--days</span></code></p></td>
 | 
			
		||||
<td><p>Number of days.</p></td>
 | 
			
		||||
</tr>
 | 
			
		||||
</tbody>
 | 
			
		||||
</table>
 | 
			
		||||
</section>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="users">
 | 
			
		||||
<h2>Users<a class="headerlink" href="#users" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
<section id="ftcli-users-clean-tokens">
 | 
			
		||||
<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">clean_tokens</span></code><a class="headerlink" href="#ftcli-users-clean-tokens" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.7.0.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
<p>Remove blacklisted tokens expired for more than provided number of days.</p>
 | 
			
		||||
<table class="table-bordered docutils align-default">
 | 
			
		||||
<colgroup>
 | 
			
		||||
<col style="width: 33.3%" />
 | 
			
		||||
<col style="width: 66.7%" />
 | 
			
		||||
</colgroup>
 | 
			
		||||
<thead>
 | 
			
		||||
<tr class="row-odd"><th class="head"><p>Options</p></th>
 | 
			
		||||
<th class="head"><p>Description</p></th>
 | 
			
		||||
</tr>
 | 
			
		||||
</thead>
 | 
			
		||||
<tbody>
 | 
			
		||||
<tr class="row-even"><td><p><code class="docutils literal notranslate"><span class="pre">--days</span></code></p></td>
 | 
			
		||||
<td><p>Number of days.</p></td>
 | 
			
		||||
</tr>
 | 
			
		||||
</tbody>
 | 
			
		||||
</table>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="ftcli-users-update">
 | 
			
		||||
<h3><code class="docutils literal notranslate"><span class="pre">ftcli</span> <span class="pre">users</span> <span class="pre">update</span></code><a class="headerlink" href="#ftcli-users-update" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<div class="versionadded">
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Features — FitTrackee 0.6.12
 | 
			
		||||
    <title>Features — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -17,7 +17,7 @@
 | 
			
		||||
    <script src="_static/doctools.js"></script>
 | 
			
		||||
    <link rel="index" title="Index" href="genindex.html" />
 | 
			
		||||
    <link rel="search" title="Search" href="search.html" />
 | 
			
		||||
    <link rel="next" title="Installation" href="installation.html" />
 | 
			
		||||
    <link rel="next" title="Third-party applications" href="apps.html" />
 | 
			
		||||
    <link rel="prev" title="FitTrackee" href="index.html" />
 | 
			
		||||
<meta charset='utf-8'>
 | 
			
		||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
@@ -107,7 +108,7 @@
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="installation.html" title="Next Chapter: Installation"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Installation »</span>
 | 
			
		||||
    <a href="apps.html" title="Next Chapter: Third-party applications"><span class="glyphicon glyphicon-chevron-right visible-sm"></span><span class="hidden-sm hidden-tablet">Third-party a... »</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
              
 | 
			
		||||
@@ -143,6 +144,12 @@
 | 
			
		||||
      
 | 
			
		||||
  <section id="features">
 | 
			
		||||
<h1>Features<a class="headerlink" href="#features" title="Permalink to this heading">¶</a></h1>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
<div class="line"><strong>FitTrackee</strong> allows you to store and display gpx files and some statistics from your outdoor activities.</div>
 | 
			
		||||
<div class="line">For now, this app is kind of a single-user application. Even if several users can register, a user can only view his own workouts.</div>
 | 
			
		||||
</div>
 | 
			
		||||
<p>Gpx files are stored in an upload directory (without encryption).</p>
 | 
			
		||||
<p>With the default configuration, <a class="reference external" href="https://www.openstreetmap.org">Open Street Map</a> is used as tile server in Workout detail and for static map generation.</p>
 | 
			
		||||
<section id="workouts">
 | 
			
		||||
<h2>Workouts<a class="headerlink" href="#workouts" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
@@ -268,6 +275,9 @@ A user with an inactive account cannot log in. (<em>new in 0.6.0</em>)</p></li>
 | 
			
		||||
<div class="line">A workout with a disabled sport will still be displayed in the application.</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>A user can create <a class="reference external" href="apps.html">clients</a> for third-party applications (<em>new in 0.7.0</em>).</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="administration">
 | 
			
		||||
<h2>Administration<a class="headerlink" href="#administration" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>Index — FitTrackee 0.6.12
 | 
			
		||||
    <title>Index — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -38,7 +38,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -58,6 +58,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
@@ -123,6 +124,8 @@
 | 
			
		||||
    environment variable
 | 
			
		||||
 | 
			
		||||
      <ul>
 | 
			
		||||
        <li><a href="installation.html#envvar-API_RATE_LIMITS">API_RATE_LIMITS 🆕</a>
 | 
			
		||||
</li>
 | 
			
		||||
        <li><a href="installation.html#envvar-APP_LOG">APP_LOG</a>
 | 
			
		||||
</li>
 | 
			
		||||
        <li><a href="installation.html#envvar-APP_SECRET_KEY">APP_SECRET_KEY</a>
 | 
			
		||||
@@ -151,7 +154,7 @@
 | 
			
		||||
</li>
 | 
			
		||||
        <li><a href="installation.html#envvar-SENDER_EMAIL">SENDER_EMAIL</a>
 | 
			
		||||
</li>
 | 
			
		||||
        <li><a href="installation.html#envvar-STATICMAP_SUBDOMAINS">STATICMAP_SUBDOMAINS 🆕</a>
 | 
			
		||||
        <li><a href="installation.html#envvar-STATICMAP_SUBDOMAINS">STATICMAP_SUBDOMAINS</a>
 | 
			
		||||
</li>
 | 
			
		||||
        <li><a href="installation.html#envvar-TILE_SERVER_URL">TILE_SERVER_URL</a>
 | 
			
		||||
</li>
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>HTTP Routing Table — FitTrackee 0.6.12
 | 
			
		||||
    <title>HTTP Routing Table — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -45,7 +45,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -65,6 +65,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
@@ -137,6 +138,21 @@
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/configuration.html#get--api-config"><code class="xref">GET /api/config</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#get--api-oauth-apps"><code class="xref">GET /api/oauth/apps</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#get--api-oauth-apps-(int-client_id)-by_id"><code class="xref">GET /api/oauth/apps/(int:client_id)/by_id</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#get--api-oauth-apps-(string-client_client_id)"><code class="xref">GET /api/oauth/apps/(string:client_client_id)</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
@@ -252,6 +268,11 @@
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/auth.html#post--api-auth-login"><code class="xref">POST /api/auth/login</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/auth.html#post--api-auth-logout"><code class="xref">POST /api/auth/logout</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
@@ -287,6 +308,31 @@
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/auth.html#post--api-auth-register"><code class="xref">POST /api/auth/register</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#post--api-oauth-apps"><code class="xref">POST /api/oauth/apps</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#post--api-oauth-apps-(int-client_id)-revoke"><code class="xref">POST /api/oauth/apps/(int:client_id)/revoke</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#post--api-oauth-authorize"><code class="xref">POST /api/oauth/authorize</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#post--api-oauth-revoke"><code class="xref">POST /api/oauth/revoke</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#post--api-oauth-token"><code class="xref">POST /api/oauth/token</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
@@ -307,6 +353,11 @@
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/auth.html#delete--api-auth-profile-reset-sports-(sport_id)"><code class="xref">DELETE /api/auth/profile/reset/sports/(sport_id)</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
       <a href="api/oauth2.html#delete--api-oauth-apps-(int-client_id)"><code class="xref">DELETE /api/oauth/apps/(int:client_id)</code></a></td><td>
 | 
			
		||||
       <em></em></td></tr>
 | 
			
		||||
     <tr>
 | 
			
		||||
       <td></td>
 | 
			
		||||
       <td>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>FitTrackee — FitTrackee 0.6.12
 | 
			
		||||
    <title>FitTrackee — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -40,7 +40,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="#">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -60,6 +60,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
@@ -154,6 +155,7 @@ Map</a>.</div>
 | 
			
		||||
<div class="toctree-wrapper compound">
 | 
			
		||||
<ul>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Installation — FitTrackee 0.6.12
 | 
			
		||||
    <title>Installation — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -18,7 +18,7 @@
 | 
			
		||||
    <link rel="index" title="Index" href="genindex.html" />
 | 
			
		||||
    <link rel="search" title="Search" href="search.html" />
 | 
			
		||||
    <link rel="next" title="Command line interface" href="cli.html" />
 | 
			
		||||
    <link rel="prev" title="Features" href="features.html" />
 | 
			
		||||
    <link rel="prev" title="Third-party applications" href="apps.html" />
 | 
			
		||||
<meta charset='utf-8'>
 | 
			
		||||
<meta http-equiv='X-UA-Compatible' content='IE=edge,chrome=1'>
 | 
			
		||||
<meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1'>
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1 current"><a class="current reference internal" href="#">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
@@ -84,9 +85,10 @@
 | 
			
		||||
<li><a class="reference internal" href="#environment-variables">Environment variables</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#emails">Emails</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#map-tile-server">Map tile server</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#api-rate-limits">API rate limits 🆕</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a class="reference internal" href="#id1">Installation</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#id2">Installation</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#from-pypi">From PyPI</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#from-sources">From sources</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#dev-environment">Dev environment</a></li>
 | 
			
		||||
@@ -96,9 +98,9 @@
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
<li><a class="reference internal" href="#upgrade">Upgrade</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#id2">From PyPI</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#id3">From sources</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#id4">Dev environment</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#id3">From PyPI</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#id4">From sources</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#id5">Dev environment</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#prod-environment">Prod environment</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
@@ -106,7 +108,7 @@
 | 
			
		||||
</li>
 | 
			
		||||
<li><a class="reference internal" href="#deployment">Deployment</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#docker">Docker</a><ul>
 | 
			
		||||
<li><a class="reference internal" href="#id5">Installation</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#id6">Installation</a></li>
 | 
			
		||||
<li><a class="reference internal" href="#development">Development</a></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</li>
 | 
			
		||||
@@ -121,7 +123,7 @@
 | 
			
		||||
              
 | 
			
		||||
                
 | 
			
		||||
  <li>
 | 
			
		||||
    <a href="features.html" title="Previous Chapter: Features"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Features</span>
 | 
			
		||||
    <a href="apps.html" title="Previous Chapter: Third-party applications"><span class="glyphicon glyphicon-chevron-left visible-sm"></span><span class="hidden-sm hidden-tablet">« Third-party a...</span>
 | 
			
		||||
    </a>
 | 
			
		||||
  </li>
 | 
			
		||||
  <li>
 | 
			
		||||
@@ -170,6 +172,8 @@
 | 
			
		||||
<li><p><a class="reference external" href="https://github.com/komoot/staticmap">staticmap</a> to generate a static map image from gpx coordinates</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://github.com/ZeevG/python-forecast.io">python-forecast.io</a> to fetch weather data from <a class="reference external" href="https://darksky.net">Dark Sky</a> (former forecast.io)</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://flask-dramatiq.readthedocs.io/en/latest/">dramatiq</a> for task queue</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://docs.authlib.org/en/latest/">Authlib</a> for OAuth 2.0 Authorization support</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://flask-limiter.readthedocs.io/en/stable">Flask-Limiter</a> for API rate limits</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
@@ -191,14 +195,27 @@
 | 
			
		||||
<section id="prerequisites">
 | 
			
		||||
<h2>Prerequisites<a class="headerlink" href="#prerequisites" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><dl class="simple">
 | 
			
		||||
<dt>mandatory</dt><dd><ul>
 | 
			
		||||
<li><p>Python 3.7+</p></li>
 | 
			
		||||
<li><p>PostgreSQL database (10+)</p></li>
 | 
			
		||||
<li><p>SMTP provider and Redis for task queue (if email sending is enabled)</p></li>
 | 
			
		||||
<li><p>API key from <a class="reference external" href="https://darksky.net/dev">Dark Sky</a> (not mandatory)</p></li>
 | 
			
		||||
<li><p>PostgreSQL 10+</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</li>
 | 
			
		||||
<li><dl class="simple">
 | 
			
		||||
<dt>optional</dt><dd><ul>
 | 
			
		||||
<li><p>Redis for task queue (if email sending is enabled) and API rate limits</p></li>
 | 
			
		||||
<li><p>SMTP provider (if email sending is enabled)</p></li>
 | 
			
		||||
<li><p>API key from <a class="reference external" href="https://darksky.net/dev">Dark Sky</a></p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://poetry.eustace.io">Poetry</a> (for installation from sources only)</p></li>
 | 
			
		||||
<li><p><a class="reference external" href="https://yarnpkg.com">Yarn</a> (for development only)</p></li>
 | 
			
		||||
<li><p>Docker and Docker Compose (for development or evaluation purposes)</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="admonition note">
 | 
			
		||||
<p class="admonition-title">Note</p>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
@@ -235,7 +252,7 @@ deployment method.</p>
 | 
			
		||||
<dd><p><strong>FitTrackee</strong> host.</p>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Default<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><p>0.0.0.0</p>
 | 
			
		||||
<dd class="field-odd"><p>127.0.0.1</p>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
@@ -266,6 +283,10 @@ deployment method.</p>
 | 
			
		||||
<dt class="sig sig-object std" id="envvar-APP_SECRET_KEY">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">APP_SECRET_KEY</span></span><a class="headerlink" href="#envvar-APP_SECRET_KEY" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><p><strong>FitTrackee</strong> secret key, must be initialized in production environment.</p>
 | 
			
		||||
<div class="admonition warning">
 | 
			
		||||
<p class="admonition-title">Warning</p>
 | 
			
		||||
<p>Use a strong secret key. This key is used in JWT generation.</p>
 | 
			
		||||
</div>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="std envvar">
 | 
			
		||||
@@ -386,7 +407,7 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
 | 
			
		||||
<dd><div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.3.0.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
<p>Redis instance used by <strong>Dramatiq</strong>.</p>
 | 
			
		||||
<p>Redis instance used by <strong>Dramatiq</strong> and <strong>Flask-Limiter</strong>.</p>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Default<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><p>local Redis instance (<code class="docutils literal notranslate"><span class="pre">redis://</span></code>)</p>
 | 
			
		||||
@@ -403,6 +424,20 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
 | 
			
		||||
<p>Number of processes used by <strong>Dramatiq</strong>.</p>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="std envvar">
 | 
			
		||||
<dt class="sig sig-object std" id="envvar-API_RATE_LIMITS">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">API_RATE_LIMITS</span> <span class="pre">🆕</span></span><a class="headerlink" href="#envvar-API_RATE_LIMITS" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.7.0.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
<p>API rate limits, see <a class="reference external" href="installation.html#api-rate-limits">API rate limits</a>.</p>
 | 
			
		||||
<dl class="field-list simple">
 | 
			
		||||
<dt class="field-odd">Default<span class="colon">:</span></dt>
 | 
			
		||||
<dd class="field-odd"><p><cite>300 per 5 minutes</cite></p>
 | 
			
		||||
</dd>
 | 
			
		||||
</dl>
 | 
			
		||||
</dd></dl>
 | 
			
		||||
 | 
			
		||||
<dl class="std envvar">
 | 
			
		||||
<dt class="sig sig-object std" id="envvar-TILE_SERVER_URL">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">TILE_SERVER_URL</span></span><a class="headerlink" href="#envvar-TILE_SERVER_URL" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
@@ -422,7 +457,7 @@ see <a class="reference external" href="https://docs.sqlalchemy.org/en/13/core/p
 | 
			
		||||
 | 
			
		||||
<dl class="std envvar">
 | 
			
		||||
<dt class="sig sig-object std" id="envvar-STATICMAP_SUBDOMAINS">
 | 
			
		||||
<span class="sig-name descname"><span class="pre">STATICMAP_SUBDOMAINS</span> <span class="pre">🆕</span></span><a class="headerlink" href="#envvar-STATICMAP_SUBDOMAINS" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<span class="sig-name descname"><span class="pre">STATICMAP_SUBDOMAINS</span></span><a class="headerlink" href="#envvar-STATICMAP_SUBDOMAINS" title="Permalink to this definition">¶</a></dt>
 | 
			
		||||
<dd><div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.6.10.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -566,9 +601,48 @@ The tile server can be changed by updating <code class="docutils literal notrans
 | 
			
		||||
</ul>
 | 
			
		||||
<p>The subdomain will be chosen randomly.</p>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="api-rate-limits">
 | 
			
		||||
<h3>API rate limits 🆕<a class="headerlink" href="#api-rate-limits" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.7.0.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
<div class="line">API rate limits are managed by <a class="reference external" href="https://flask-limiter.readthedocs.io/en/stable">Flask-Limiter</a>, based on IP with fixed window strategy.</div>
 | 
			
		||||
<div class="line">To enable rate limits, <strong>Redis</strong> must be available.</div>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="admonition note">
 | 
			
		||||
<p class="admonition-title">Note</p>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
<div class="line">If no Redis instance is available for rate limits, FitTrackee can still start.</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
<div class="line">All endpoints are subject to rate limits, except endpoints serving assets.</div>
 | 
			
		||||
<div class="line">Limits can be modified by setting the environment variable <code class="docutils literal notranslate"><span class="pre">API_RATE_LIMITS</span></code> (see <a class="reference external" href="https://flask-limiter.readthedocs.io/en/stable/configuration.html#rate-limit-string-notation">Flask-Limiter documentation for notation</a>).</div>
 | 
			
		||||
<div class="line">Rate limits must be separated by a comma, for instance:</div>
 | 
			
		||||
</div>
 | 
			
		||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">export</span> <span class="n">API_RATE_LIMITS</span><span class="o">=</span><span class="s2">"200 per day, 50 per hour"</span>
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
<p><strong>Flask-Limiter</strong> provides a <a class="reference external" href="https://flask-limiter.readthedocs.io/en/stable/cli.html">Command Line Interface</a> for maintenance and diagnostic purposes.</p>
 | 
			
		||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ flask limiter
 | 
			
		||||
Usage: flask limiter <span class="o">[</span>OPTIONS<span class="o">]</span> COMMAND <span class="o">[</span>ARGS<span class="o">]</span>...
 | 
			
		||||
 | 
			
		||||
  Flask-Limiter maintenance <span class="p">&</span> utility commmands
 | 
			
		||||
 | 
			
		||||
Options:
 | 
			
		||||
  --help  Show this message and exit.
 | 
			
		||||
 | 
			
		||||
Commands:
 | 
			
		||||
  clear   Clear limits <span class="k">for</span> a specific key
 | 
			
		||||
  config  View the extension configuration
 | 
			
		||||
  limits  Enumerate details about all routes with rate limits
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="id1">
 | 
			
		||||
<h2>Installation<a class="headerlink" href="#id1" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="id2">
 | 
			
		||||
<h2>Installation<a class="headerlink" href="#id2" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
<div class="admonition warning">
 | 
			
		||||
<p class="admonition-title">Warning</p>
 | 
			
		||||
<div class="line-block">
 | 
			
		||||
@@ -713,11 +787,11 @@ $ make install-db
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>Download the last release (for now, it is the release v0.6.12):</p></li>
 | 
			
		||||
<li><p>Download the last release (for now, it is the release v0.7.0):</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.6.12.tar.gz
 | 
			
		||||
$ tar -xzf v0.6.12.tar.gz
 | 
			
		||||
$ mv FitTrackee-0.6.12 FitTrackee
 | 
			
		||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.7.0.tar.gz
 | 
			
		||||
$ tar -xzf v0.7.0.tar.gz
 | 
			
		||||
$ mv FitTrackee-0.7.0 FitTrackee
 | 
			
		||||
$ <span class="nb">cd</span> FitTrackee
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -770,8 +844,8 @@ database credentials</strong>):</p></li>
 | 
			
		||||
<div class="line">- upload directory (see <a class="reference external" href="installation.html#environment-variables">Environment variables</a>)</div>
 | 
			
		||||
</div>
 | 
			
		||||
</div>
 | 
			
		||||
<section id="id2">
 | 
			
		||||
<h3>From PyPI<a class="headerlink" href="#id2" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<section id="id3">
 | 
			
		||||
<h3>From PyPI<a class="headerlink" href="#id3" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>Stop the application and activate the virtualenv</p></li>
 | 
			
		||||
<li><p>Upgrade with pip</p></li>
 | 
			
		||||
@@ -796,10 +870,10 @@ $ <span class="nb">source</span> .env
 | 
			
		||||
<li><p>Restart the application and task queue workers (if email sending is enabled).</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
</section>
 | 
			
		||||
<section id="id3">
 | 
			
		||||
<h3>From sources<a class="headerlink" href="#id3" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<section id="id4">
 | 
			
		||||
<h4>Dev environment<a class="headerlink" href="#id4" title="Permalink to this heading">¶</a></h4>
 | 
			
		||||
<h3>From sources<a class="headerlink" href="#id4" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<section id="id5">
 | 
			
		||||
<h4>Dev environment<a class="headerlink" href="#id5" title="Permalink to this heading">¶</a></h4>
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>Stop the application and pull the repository:</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
@@ -837,11 +911,11 @@ $ <span class="nb">source</span> .env
 | 
			
		||||
<ul class="simple">
 | 
			
		||||
<li><p>Stop the application</p></li>
 | 
			
		||||
<li><p>Change to the directory where FitTrackee directory is located</p></li>
 | 
			
		||||
<li><p>Download the last release (for now, it is the release v0.6.12) and overwrite existing files:</p></li>
 | 
			
		||||
<li><p>Download the last release (for now, it is the release v0.7.0) and overwrite existing files:</p></li>
 | 
			
		||||
</ul>
 | 
			
		||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.6.12.tar.gz
 | 
			
		||||
$ tar -xzf v0.6.12.tar.gz
 | 
			
		||||
$ cp -R FitTrackee-0.6.12/* FitTrackee/
 | 
			
		||||
<div class="highlight-bash notranslate"><div class="highlight"><pre><span></span>$ wget https://github.com/SamR1/FitTrackee/archive/v0.7.0.tar.gz
 | 
			
		||||
$ tar -xzf v0.7.0.tar.gz
 | 
			
		||||
$ cp -R FitTrackee-0.7.0/* FitTrackee/
 | 
			
		||||
$ <span class="nb">cd</span> FitTrackee
 | 
			
		||||
</pre></div>
 | 
			
		||||
</div>
 | 
			
		||||
@@ -970,6 +1044,7 @@ One way is to use a <strong>systemd</strong> services and <strong>Nginx</strong>
 | 
			
		||||
        proxy_set_header  X-Real-IP $remote_addr;
 | 
			
		||||
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
			
		||||
        proxy_set_header  X-Forwarded-Host $server_name;
 | 
			
		||||
        proxy_set_header  X-Forwarded-Proto $scheme;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -989,8 +1064,8 @@ server {
 | 
			
		||||
</section>
 | 
			
		||||
<section id="docker">
 | 
			
		||||
<h2>Docker<a class="headerlink" href="#docker" title="Permalink to this heading">¶</a></h2>
 | 
			
		||||
<section id="id5">
 | 
			
		||||
<h3>Installation<a class="headerlink" href="#id5" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<section id="id6">
 | 
			
		||||
<h3>Installation<a class="headerlink" href="#id6" title="Permalink to this heading">¶</a></h3>
 | 
			
		||||
<div class="versionadded">
 | 
			
		||||
<p><span class="versionmodified added">New in version 0.4.4.</span></p>
 | 
			
		||||
</div>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								docs/objects.inv
									
									
									
									
									
								
							
							
						
						@@ -4,7 +4,7 @@
 | 
			
		||||
  <head>
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
 | 
			
		||||
    <title>Search — FitTrackee 0.6.12
 | 
			
		||||
    <title>Search — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -45,7 +45,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -65,6 +65,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="api/index.html">API documentation</a></li>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Administrator — FitTrackee 0.6.12
 | 
			
		||||
    <title>Administrator — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>Troubleshooting — FitTrackee 0.6.12
 | 
			
		||||
    <title>Troubleshooting — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@
 | 
			
		||||
    <meta charset="utf-8" />
 | 
			
		||||
    <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="generator" content="Docutils 0.19: https://docutils.sourceforge.io/" />
 | 
			
		||||
 | 
			
		||||
    <title>User — FitTrackee 0.6.12
 | 
			
		||||
    <title>User — FitTrackee 0.7.0
 | 
			
		||||
 documentation</title>
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
 | 
			
		||||
    <link rel="stylesheet" type="text/css" href="../_static/bootstrap-sphinx.css" />
 | 
			
		||||
@@ -41,7 +41,7 @@
 | 
			
		||||
        </button>
 | 
			
		||||
        <a class="navbar-brand" href="../index.html">
 | 
			
		||||
          FitTrackee</a>
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.6.12
 | 
			
		||||
        <span class="navbar-text navbar-version pull-left"><b>0.7.0
 | 
			
		||||
</b></span>
 | 
			
		||||
      </div>
 | 
			
		||||
 | 
			
		||||
@@ -61,6 +61,7 @@
 | 
			
		||||
      role="menu"
 | 
			
		||||
      aria-labelledby="dLabelGlobalToc"><ul class="current">
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../features.html">Features</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../apps.html">Third-party applications</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../installation.html">Installation</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../cli.html">Command line interface</a></li>
 | 
			
		||||
<li class="toctree-l1"><a class="reference internal" href="../api/index.html">API documentation</a></li>
 | 
			
		||||
 
 | 
			
		||||
| 
		 Before Width: | Height: | Size: 550 KiB After Width: | Height: | Size: 550 KiB  | 
| 
		 Before Width: | Height: | Size: 371 KiB After Width: | Height: | Size: 371 KiB  | 
| 
		 Before Width: | Height: | Size: 206 KiB After Width: | Height: | Size: 206 KiB  | 
| 
		 Before Width: | Height: | Size: 70 KiB After Width: | Height: | Size: 70 KiB  | 
| 
		 Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB  | 
| 
		 Before Width: | Height: | Size: 105 KiB After Width: | Height: | Size: 105 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								docsrc/source/_images/fittrackee_screenshot-07.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 109 KiB  | 
@@ -17,4 +17,5 @@ Authentication
 | 
			
		||||
    auth.request_password_reset,
 | 
			
		||||
    auth.update_user_account,
 | 
			
		||||
    auth.update_password,
 | 
			
		||||
    auth.update_email
 | 
			
		||||
    auth.update_email,
 | 
			
		||||
    auth.logout_user
 | 
			
		||||
 
 | 
			
		||||
@@ -7,6 +7,7 @@ API documentation
 | 
			
		||||
 | 
			
		||||
   auth
 | 
			
		||||
   configuration
 | 
			
		||||
   oauth2
 | 
			
		||||
   records
 | 
			
		||||
   sports
 | 
			
		||||
   stats
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										14
									
								
								docsrc/source/api/oauth2.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,14 @@
 | 
			
		||||
OAuth2
 | 
			
		||||
######
 | 
			
		||||
 | 
			
		||||
.. autoflask:: fittrackee:create_app()
 | 
			
		||||
   :endpoints:
 | 
			
		||||
    oauth2.get_clients,
 | 
			
		||||
    oauth2.create_client,
 | 
			
		||||
    oauth2.get_client_by_client_id,
 | 
			
		||||
    oauth2.get_client_by_id,
 | 
			
		||||
    oauth2.delete_client,
 | 
			
		||||
    oauth2.revoke_client_tokens,
 | 
			
		||||
    oauth2.authorize,
 | 
			
		||||
    oauth2.issue_token,
 | 
			
		||||
    oauth2.revoke_token
 | 
			
		||||
							
								
								
									
										53
									
								
								docsrc/source/apps.rst
									
									
									
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,53 @@
 | 
			
		||||
Third-party applications
 | 
			
		||||
########################
 | 
			
		||||
(*new in 0.7.0*)
 | 
			
		||||
 | 
			
		||||
FitTrackee provides a REST API (see `documentation <api/index.html>`__) whose
 | 
			
		||||
most endpoints require authorization/authentication.
 | 
			
		||||
 | 
			
		||||
To allow a third-party application to interact with API endpoints, an
 | 
			
		||||
`OAuth2 <https://datatracker.ietf.org/doc/html/rfc6749>`_ client can be created
 | 
			
		||||
in user settings ('apps' tab).
 | 
			
		||||
 | 
			
		||||
.. warning::
 | 
			
		||||
  OAuth2 endpoints requiring authentication are not accessible by third-party
 | 
			
		||||
  applications (`documentation <api/oauth2.html>`__), only by FitTrackee
 | 
			
		||||
  client (first-party application).
 | 
			
		||||
 | 
			
		||||
FitTrackee supports only `Authorization Code <https://datatracker.ietf.org/doc/html/rfc6749#section-1.3.1>`_
 | 
			
		||||
flow (with PKCE support).
 | 
			
		||||
It allows to exchange an authorization code for an access token.
 | 
			
		||||
The client ID and secret must be sent in the POST body.
 | 
			
		||||
It is recommended to use `PKCE <https://datatracker.ietf.org/doc/html/rfc7636>`_
 | 
			
		||||
to provide a better security.
 | 
			
		||||
 | 
			
		||||
The following scopes are available:
 | 
			
		||||
 | 
			
		||||
- ``application:write``: grants write access to application configuration (only for users with administration rights),
 | 
			
		||||
- ``profile:read``: grants read access to auth endpoints,
 | 
			
		||||
- ``profile:write``: grants write access to auth endpoints,
 | 
			
		||||
- ``users:read``: grants read access to users endpoints,
 | 
			
		||||
- ``users:write``: grants write access to users endpoints,
 | 
			
		||||
- ``workouts:read``: grants read access to workouts-related endpoints,
 | 
			
		||||
- ``workouts:write``: grants write access to workouts-related endpoints.
 | 
			
		||||
 | 
			
		||||
.. figure:: _images/fittrackee_screenshot-07.png
 | 
			
		||||
   :alt: OAuth2 client creation on FitTrackee
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
  OAuth2 support is implemented with `Authlib <https://docs.authlib.org/en/latest/>`_ library.
 | 
			
		||||
 | 
			
		||||
.. warning::
 | 
			
		||||
  | If FitTrackee is running behind a proxy, the ``X-Forwarded-Proto`` header must be set.
 | 
			
		||||
  | For instance for `nginx`:
 | 
			
		||||
 | 
			
		||||
  .. code-block::
 | 
			
		||||
 | 
			
		||||
     proxy_set_header  X-Forwarded-Proto $scheme;
 | 
			
		||||
 | 
			
		||||
Some resources about OAuth 2.0:
 | 
			
		||||
 | 
			
		||||
- `OAuth 2.0 Simplified <https://www.oauth.com>`_ by `Aaron Parecki <https://aaronparecki.com>`_
 | 
			
		||||
- `Web App Example of OAuth 2 web application flow <https://requests-oauthlib.readthedocs.io/en/latest/examples/real_world_example.html>`_ with Requests-OAuthlib (python)
 | 
			
		||||
- `OAuth 2 Session <https://docs.authlib.org/en/latest/client/oauth2.html#oauth-2-session>`_ with Authlib (python)
 | 
			
		||||
- `Minimal example of an application interacting with FitTrackee <https://codeberg.org/SamR1/ft-oauth-client>`_ (python)
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
Command line interface
 | 
			
		||||
######################
 | 
			
		||||
 | 
			
		||||
A command line interface (CLI) is available to manage database and users.
 | 
			
		||||
A command line interface (CLI) is available to manage database, OAuth2 tokens and users.
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
@@ -14,8 +14,9 @@ A command line interface (CLI) is available to manage database and users.
 | 
			
		||||
      --help  Show this message and exit.
 | 
			
		||||
 | 
			
		||||
    Commands:
 | 
			
		||||
      db     Manage database.
 | 
			
		||||
      users  Manage users.
 | 
			
		||||
      db      Manage database.
 | 
			
		||||
      oauth2  Manage OAuth2 tokens.
 | 
			
		||||
      users   Manage users.
 | 
			
		||||
 | 
			
		||||
.. warning::
 | 
			
		||||
    | The following commands are now deprecated and will be removed in a next version:
 | 
			
		||||
@@ -40,10 +41,47 @@ Apply migrations.
 | 
			
		||||
Empty database and delete uploaded files, only on development environments.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
OAuth2
 | 
			
		||||
~~~~~~
 | 
			
		||||
 | 
			
		||||
``ftcli oauth2 clean``
 | 
			
		||||
""""""""""""""""""""""
 | 
			
		||||
.. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
Remove tokens expired for more than provided number of days
 | 
			
		||||
 | 
			
		||||
.. cssclass:: table-bordered
 | 
			
		||||
.. list-table::
 | 
			
		||||
   :widths: 25 50
 | 
			
		||||
   :header-rows: 1
 | 
			
		||||
 | 
			
		||||
   * - Options
 | 
			
		||||
     - Description
 | 
			
		||||
   * - ``--days``
 | 
			
		||||
     - Number of days.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Users
 | 
			
		||||
~~~~~
 | 
			
		||||
 | 
			
		||||
``ftcli users clean_tokens``
 | 
			
		||||
""""""""""""""""""""""""""""
 | 
			
		||||
.. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
Remove blacklisted tokens expired for more than provided number of days.
 | 
			
		||||
 | 
			
		||||
.. cssclass:: table-bordered
 | 
			
		||||
.. list-table::
 | 
			
		||||
   :widths: 25 50
 | 
			
		||||
   :header-rows: 1
 | 
			
		||||
 | 
			
		||||
   * - Options
 | 
			
		||||
     - Description
 | 
			
		||||
   * - ``--days``
 | 
			
		||||
     - Number of days.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
``ftcli users update``
 | 
			
		||||
""""""""""""""""""""""
 | 
			
		||||
.. versionadded:: 0.6.5
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,14 @@
 | 
			
		||||
Features
 | 
			
		||||
########
 | 
			
		||||
 | 
			
		||||
| **FitTrackee** allows you to store and display gpx files and some statistics from your outdoor activities.
 | 
			
		||||
| For now, this app is kind of a single-user application. Even if several users can register, a user can only view his own workouts.
 | 
			
		||||
 | 
			
		||||
Gpx files are stored in an upload directory (without encryption).
 | 
			
		||||
 | 
			
		||||
With the default configuration, `Open Street Map <https://www.openstreetmap.org>`__ is used as tile server in Workout detail and for static map generation.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Workouts
 | 
			
		||||
^^^^^^^^
 | 
			
		||||
- 11 sports are supported:
 | 
			
		||||
@@ -83,6 +91,8 @@ Account & preferences
 | 
			
		||||
  | A disabled sport (by admin or user) will not appear in dropdown when **adding a workout**.
 | 
			
		||||
  | A workout with a disabled sport will still be displayed in the application.
 | 
			
		||||
 | 
			
		||||
- A user can create `clients <apps.html>`__ for third-party applications (*new in 0.7.0*).
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Administration
 | 
			
		||||
^^^^^^^^^^^^^^
 | 
			
		||||
 
 | 
			
		||||
@@ -33,6 +33,7 @@ Table of contents
 | 
			
		||||
   :maxdepth: 1
 | 
			
		||||
 | 
			
		||||
   features
 | 
			
		||||
   apps
 | 
			
		||||
   installation
 | 
			
		||||
   cli
 | 
			
		||||
   api/index
 | 
			
		||||
 
 | 
			
		||||
@@ -9,6 +9,8 @@ This application is written in Python (API) and Typescript (client):
 | 
			
		||||
    - `staticmap <https://github.com/komoot/staticmap>`_ to generate a static map image from gpx coordinates
 | 
			
		||||
    - `python-forecast.io <https://github.com/ZeevG/python-forecast.io>`_ to fetch weather data from `Dark Sky <https://darksky.net>`__ (former forecast.io)
 | 
			
		||||
    - `dramatiq <https://flask-dramatiq.readthedocs.io/en/latest/>`_ for task queue
 | 
			
		||||
    - `Authlib <https://docs.authlib.org/en/latest/>`_ for OAuth 2.0 Authorization support
 | 
			
		||||
    - `Flask-Limiter <https://flask-limiter.readthedocs.io/en/stable>`_ for API rate limits
 | 
			
		||||
- Client:
 | 
			
		||||
    - Vue3/Vuex
 | 
			
		||||
    - `Leaflet <https://leafletjs.com/>`__ to display map
 | 
			
		||||
@@ -20,13 +22,16 @@ This application is written in Python (API) and Typescript (client):
 | 
			
		||||
Prerequisites
 | 
			
		||||
~~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
-  Python 3.7+
 | 
			
		||||
-  PostgreSQL database (10+)
 | 
			
		||||
-  SMTP provider and Redis for task queue (if email sending is enabled)
 | 
			
		||||
-  API key from `Dark Sky <https://darksky.net/dev>`__ (not mandatory)
 | 
			
		||||
-  `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
			
		||||
-  `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
			
		||||
-  Docker and Docker Compose (for development or evaluation purposes)
 | 
			
		||||
- mandatory
 | 
			
		||||
    - Python 3.7+
 | 
			
		||||
    - PostgreSQL 10+
 | 
			
		||||
- optional
 | 
			
		||||
    - Redis for task queue (if email sending is enabled) and API rate limits
 | 
			
		||||
    - SMTP provider (if email sending is enabled)
 | 
			
		||||
    - API key from `Dark Sky <https://darksky.net/dev>`__
 | 
			
		||||
    - `Poetry <https://poetry.eustace.io>`__ (for installation from sources only)
 | 
			
		||||
    - `Yarn <https://yarnpkg.com>`__ (for development only)
 | 
			
		||||
    -  Docker and Docker Compose (for development or evaluation purposes)
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
    | The following steps describe an installation on Linux systems (tested
 | 
			
		||||
@@ -55,7 +60,7 @@ deployment method.
 | 
			
		||||
 | 
			
		||||
    **FitTrackee** host.
 | 
			
		||||
 | 
			
		||||
    :default: 0.0.0.0
 | 
			
		||||
    :default: 127.0.0.1
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: PORT
 | 
			
		||||
@@ -76,6 +81,8 @@ deployment method.
 | 
			
		||||
 | 
			
		||||
    **FitTrackee** secret key, must be initialized in production environment.
 | 
			
		||||
 | 
			
		||||
    .. warning::
 | 
			
		||||
        Use a strong secret key. This key is used in JWT generation.
 | 
			
		||||
 | 
			
		||||
.. envvar:: APP_WORKERS
 | 
			
		||||
 | 
			
		||||
@@ -153,7 +160,7 @@ deployment method.
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.3.0
 | 
			
		||||
 | 
			
		||||
    Redis instance used by **Dramatiq**.
 | 
			
		||||
    Redis instance used by **Dramatiq** and **Flask-Limiter**.
 | 
			
		||||
 | 
			
		||||
    :default: local Redis instance (``redis://``)
 | 
			
		||||
 | 
			
		||||
@@ -165,6 +172,15 @@ deployment method.
 | 
			
		||||
    Number of processes used by **Dramatiq**.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: API_RATE_LIMITS 🆕
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
    API rate limits, see `API rate limits <installation.html#api-rate-limits>`__.
 | 
			
		||||
 | 
			
		||||
    :default: `300 per 5 minutes`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: TILE_SERVER_URL
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.4.0
 | 
			
		||||
@@ -175,7 +191,7 @@ deployment method.
 | 
			
		||||
    :default: `https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png`
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
.. envvar:: STATICMAP_SUBDOMAINS 🆕
 | 
			
		||||
.. envvar:: STATICMAP_SUBDOMAINS
 | 
			
		||||
 | 
			
		||||
    .. versionadded:: 0.6.10
 | 
			
		||||
 | 
			
		||||
@@ -286,6 +302,42 @@ For instance, to set OSM France tile server, the expected values are:
 | 
			
		||||
The subdomain will be chosen randomly.
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
API rate limits 🆕
 | 
			
		||||
^^^^^^^^^^^^^^^^^^
 | 
			
		||||
.. versionadded:: 0.7.0
 | 
			
		||||
 | 
			
		||||
| API rate limits are managed by `Flask-Limiter <https://flask-limiter.readthedocs.io/en/stable>`_, based on IP with fixed window strategy.
 | 
			
		||||
| To enable rate limits, **Redis** must be available.
 | 
			
		||||
 | 
			
		||||
.. note::
 | 
			
		||||
    | If no Redis instance is available for rate limits, FitTrackee can still start.
 | 
			
		||||
 | 
			
		||||
| All endpoints are subject to rate limits, except endpoints serving assets.
 | 
			
		||||
| Limits can be modified by setting the environment variable ``API_RATE_LIMITS`` (see `Flask-Limiter documentation for notation <https://flask-limiter.readthedocs.io/en/stable/configuration.html#rate-limit-string-notation>`_).
 | 
			
		||||
| Rate limits must be separated by a comma, for instance:
 | 
			
		||||
 | 
			
		||||
.. code-block::
 | 
			
		||||
 | 
			
		||||
    export API_RATE_LIMITS="200 per day, 50 per hour"
 | 
			
		||||
 | 
			
		||||
**Flask-Limiter** provides a `Command Line Interface <https://flask-limiter.readthedocs.io/en/stable/cli.html>`_ for maintenance and diagnostic purposes.
 | 
			
		||||
 | 
			
		||||
.. code-block:: bash
 | 
			
		||||
 | 
			
		||||
    $ flask limiter
 | 
			
		||||
    Usage: flask limiter [OPTIONS] COMMAND [ARGS]...
 | 
			
		||||
 | 
			
		||||
      Flask-Limiter maintenance & utility commmands
 | 
			
		||||
 | 
			
		||||
    Options:
 | 
			
		||||
      --help  Show this message and exit.
 | 
			
		||||
 | 
			
		||||
    Commands:
 | 
			
		||||
      clear   Clear limits for a specific key
 | 
			
		||||
      config  View the extension configuration
 | 
			
		||||
      limits  Enumerate details about all routes with rate limits
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Installation
 | 
			
		||||
~~~~~~~~~~~~
 | 
			
		||||
 | 
			
		||||
@@ -425,13 +477,13 @@ Production environment
 | 
			
		||||
.. warning::
 | 
			
		||||
    | Note that FitTrackee is under heavy development, some features may be unstable.
 | 
			
		||||
 | 
			
		||||
-  Download the last release (for now, it is the release v0.6.12):
 | 
			
		||||
-  Download the last release (for now, it is the release v0.7.0):
 | 
			
		||||
 | 
			
		||||
.. code:: bash
 | 
			
		||||
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.12.tar.gz
 | 
			
		||||
   $ tar -xzf v0.6.12.tar.gz
 | 
			
		||||
   $ mv FitTrackee-0.6.12 FitTrackee
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.0.tar.gz
 | 
			
		||||
   $ tar -xzf v0.7.0.tar.gz
 | 
			
		||||
   $ mv FitTrackee-0.7.0 FitTrackee
 | 
			
		||||
   $ cd FitTrackee
 | 
			
		||||
 | 
			
		||||
-  Create **.env** from example and update it
 | 
			
		||||
@@ -551,13 +603,13 @@ Prod environment
 | 
			
		||||
 | 
			
		||||
- Change to the directory where FitTrackee directory is located
 | 
			
		||||
 | 
			
		||||
- Download the last release (for now, it is the release v0.6.12) and overwrite existing files:
 | 
			
		||||
- Download the last release (for now, it is the release v0.7.0) and overwrite existing files:
 | 
			
		||||
 | 
			
		||||
.. code:: bash
 | 
			
		||||
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.6.12.tar.gz
 | 
			
		||||
   $ tar -xzf v0.6.12.tar.gz
 | 
			
		||||
   $ cp -R FitTrackee-0.6.12/* FitTrackee/
 | 
			
		||||
   $ wget https://github.com/SamR1/FitTrackee/archive/v0.7.0.tar.gz
 | 
			
		||||
   $ tar -xzf v0.7.0.tar.gz
 | 
			
		||||
   $ cp -R FitTrackee-0.7.0/* FitTrackee/
 | 
			
		||||
   $ cd FitTrackee
 | 
			
		||||
 | 
			
		||||
- Update **.env** if needed (see `Environment variables <installation.html#environment-variables>`__).
 | 
			
		||||
@@ -685,6 +737,7 @@ Examples (to update depending on your application configuration and given distri
 | 
			
		||||
            proxy_set_header  X-Real-IP $remote_addr;
 | 
			
		||||
            proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
 | 
			
		||||
            proxy_set_header  X-Forwarded-Host $server_name;
 | 
			
		||||
            proxy_set_header  X-Forwarded-Proto $scheme;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,9 @@ import logging
 | 
			
		||||
import os
 | 
			
		||||
import re
 | 
			
		||||
from importlib import import_module, reload
 | 
			
		||||
from typing import Any
 | 
			
		||||
from typing import Any, Dict, Tuple
 | 
			
		||||
 | 
			
		||||
import redis
 | 
			
		||||
from flask import (
 | 
			
		||||
    Flask,
 | 
			
		||||
    Response,
 | 
			
		||||
@@ -13,19 +14,22 @@ from flask import (
 | 
			
		||||
)
 | 
			
		||||
from flask_bcrypt import Bcrypt
 | 
			
		||||
from flask_dramatiq import Dramatiq
 | 
			
		||||
from flask_limiter import Limiter
 | 
			
		||||
from flask_limiter.errors import RateLimitExceeded
 | 
			
		||||
from flask_limiter.util import get_remote_address
 | 
			
		||||
from flask_migrate import Migrate
 | 
			
		||||
from flask_sqlalchemy import SQLAlchemy
 | 
			
		||||
from sqlalchemy.exc import ProgrammingError
 | 
			
		||||
from werkzeug.middleware.proxy_fix import ProxyFix
 | 
			
		||||
 | 
			
		||||
from fittrackee.emails.email import EmailService
 | 
			
		||||
from fittrackee.request import CustomRequest
 | 
			
		||||
 | 
			
		||||
VERSION = __version__ = '0.6.12'
 | 
			
		||||
db = SQLAlchemy()
 | 
			
		||||
bcrypt = Bcrypt()
 | 
			
		||||
migrate = Migrate()
 | 
			
		||||
email_service = EmailService()
 | 
			
		||||
dramatiq = Dramatiq()
 | 
			
		||||
VERSION = __version__ = '0.7.0'
 | 
			
		||||
REDIS_URL = os.getenv('REDIS_URL', 'redis://')
 | 
			
		||||
API_RATE_LIMITS = os.environ.get('API_RATE_LIMITS', '300 per 5 minutes').split(
 | 
			
		||||
    ','
 | 
			
		||||
)
 | 
			
		||||
log_file = os.getenv('APP_LOG')
 | 
			
		||||
logging.basicConfig(
 | 
			
		||||
    filename=log_file,
 | 
			
		||||
@@ -34,6 +38,27 @@ logging.basicConfig(
 | 
			
		||||
)
 | 
			
		||||
appLog = logging.getLogger('fittrackee')
 | 
			
		||||
 | 
			
		||||
db = SQLAlchemy()
 | 
			
		||||
bcrypt = Bcrypt()
 | 
			
		||||
migrate = Migrate()
 | 
			
		||||
email_service = EmailService()
 | 
			
		||||
dramatiq = Dramatiq()
 | 
			
		||||
limiter = Limiter(
 | 
			
		||||
    key_func=get_remote_address,
 | 
			
		||||
    default_limits=API_RATE_LIMITS,  # type: ignore
 | 
			
		||||
    default_limits_per_method=True,
 | 
			
		||||
    headers_enabled=True,
 | 
			
		||||
    storage_uri=REDIS_URL,
 | 
			
		||||
    strategy='fixed-window',
 | 
			
		||||
)
 | 
			
		||||
# if redis is not available, disable the rate limiter
 | 
			
		||||
r = redis.from_url(REDIS_URL)
 | 
			
		||||
try:
 | 
			
		||||
    r.ping()
 | 
			
		||||
except redis.exceptions.ConnectionError:
 | 
			
		||||
    limiter.enabled = False
 | 
			
		||||
    appLog.warning('Redis not available, API rate limits are disabled.')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CustomFlask(Flask):
 | 
			
		||||
    # add custom Request to handle user-agent parsing
 | 
			
		||||
@@ -63,6 +88,12 @@ def create_app(init_email: bool = True) -> Flask:
 | 
			
		||||
    bcrypt.init_app(app)
 | 
			
		||||
    migrate.init_app(app, db)
 | 
			
		||||
    dramatiq.init_app(app)
 | 
			
		||||
    limiter.init_app(app)
 | 
			
		||||
 | 
			
		||||
    # set oauth2
 | 
			
		||||
    from fittrackee.oauth2.config import config_oauth
 | 
			
		||||
 | 
			
		||||
    config_oauth(app)
 | 
			
		||||
 | 
			
		||||
    # set up email if 'EMAIL_URL' is initialized
 | 
			
		||||
    if init_email:
 | 
			
		||||
@@ -95,6 +126,7 @@ def create_app(init_email: bool = True) -> Flask:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
    from .application.app_config import config_blueprint  # noqa
 | 
			
		||||
    from .oauth2.routes import oauth2_blueprint  # noqa
 | 
			
		||||
    from .users.auth import auth_blueprint  # noqa
 | 
			
		||||
    from .users.users import users_blueprint  # noqa
 | 
			
		||||
    from .workouts.records import records_blueprint  # noqa
 | 
			
		||||
@@ -103,6 +135,7 @@ def create_app(init_email: bool = True) -> Flask:
 | 
			
		||||
    from .workouts.workouts import workouts_blueprint  # noqa
 | 
			
		||||
 | 
			
		||||
    app.register_blueprint(auth_blueprint, url_prefix='/api')
 | 
			
		||||
    app.register_blueprint(oauth2_blueprint, url_prefix='/api')
 | 
			
		||||
    app.register_blueprint(config_blueprint, url_prefix='/api')
 | 
			
		||||
    app.register_blueprint(records_blueprint, url_prefix='/api')
 | 
			
		||||
    app.register_blueprint(sports_blueprint, url_prefix='/api')
 | 
			
		||||
@@ -132,7 +165,15 @@ def create_app(init_email: bool = True) -> Flask:
 | 
			
		||||
            )
 | 
			
		||||
            return response
 | 
			
		||||
 | 
			
		||||
    @app.errorhandler(429)
 | 
			
		||||
    def rate_limit_handler(error: RateLimitExceeded) -> Tuple[Dict, int]:
 | 
			
		||||
        return {
 | 
			
		||||
            'status': 'error',
 | 
			
		||||
            'message': f'rate limit exceeded ({error.description})',
 | 
			
		||||
        }, 429
 | 
			
		||||
 | 
			
		||||
    @app.route('/favicon.ico')
 | 
			
		||||
    @limiter.exempt
 | 
			
		||||
    def favicon() -> Any:
 | 
			
		||||
        return send_file(
 | 
			
		||||
            os.path.join(app.root_path, 'dist/favicon.ico')  # type: ignore
 | 
			
		||||
@@ -140,6 +181,7 @@ def create_app(init_email: bool = True) -> Flask:
 | 
			
		||||
 | 
			
		||||
    @app.route('/', defaults={'path': ''})
 | 
			
		||||
    @app.route('/<path:path>')
 | 
			
		||||
    @limiter.exempt
 | 
			
		||||
    def catch_all(path: str) -> Any:
 | 
			
		||||
        # workaround to serve images (not in static directory)
 | 
			
		||||
        if path.startswith('img/'):
 | 
			
		||||
@@ -153,4 +195,8 @@ def create_app(init_email: bool = True) -> Flask:
 | 
			
		||||
        else:
 | 
			
		||||
            return render_template('index.html')
 | 
			
		||||
 | 
			
		||||
    # to get headers, especially 'X-Forwarded-Proto' for scheme needed by
 | 
			
		||||
    # Authlib, when the application is running behind a proxy server
 | 
			
		||||
    app.wsgi_app = ProxyFix(app.wsgi_app)  # type: ignore
 | 
			
		||||
 | 
			
		||||
    return app
 | 
			
		||||
 
 | 
			
		||||
@@ -4,12 +4,12 @@ from flask import Blueprint, current_app, request
 | 
			
		||||
from sqlalchemy.orm.exc import MultipleResultsFound, NoResultFound
 | 
			
		||||
 | 
			
		||||
from fittrackee import db
 | 
			
		||||
from fittrackee.oauth2.server import require_auth
 | 
			
		||||
from fittrackee.responses import (
 | 
			
		||||
    HttpResponse,
 | 
			
		||||
    InvalidPayloadErrorResponse,
 | 
			
		||||
    handle_error_and_return_response,
 | 
			
		||||
)
 | 
			
		||||
from fittrackee.users.decorators import authenticate_as_admin
 | 
			
		||||
from fittrackee.users.models import User
 | 
			
		||||
from fittrackee.users.utils.controls import is_valid_email
 | 
			
		||||
 | 
			
		||||
@@ -22,7 +22,7 @@ config_blueprint = Blueprint('config', __name__)
 | 
			
		||||
@config_blueprint.route('/config', methods=['GET'])
 | 
			
		||||
def get_application_config() -> Union[Dict, HttpResponse]:
 | 
			
		||||
    """
 | 
			
		||||
    Get Application config
 | 
			
		||||
    Get Application configuration.
 | 
			
		||||
 | 
			
		||||
    **Example request**:
 | 
			
		||||
 | 
			
		||||
@@ -48,7 +48,7 @@ def get_application_config() -> Union[Dict, HttpResponse]:
 | 
			
		||||
          "max_users": 0,
 | 
			
		||||
          "max_zip_file_size": 10485760,
 | 
			
		||||
          "map_attribution": "© <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"
 | 
			
		||||
          "version": "0.6.12"
 | 
			
		||||
          "version": "0.7.0"
 | 
			
		||||
        },
 | 
			
		||||
        "status": "success"
 | 
			
		||||
      }
 | 
			
		||||
@@ -67,12 +67,14 @@ def get_application_config() -> Union[Dict, HttpResponse]:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@config_blueprint.route('/config', methods=['PATCH'])
 | 
			
		||||
@authenticate_as_admin
 | 
			
		||||
@require_auth(scopes=['application:write'], as_admin=True)
 | 
			
		||||
def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
			
		||||
    """
 | 
			
		||||
    Update Application config
 | 
			
		||||
    Update Application configuration.
 | 
			
		||||
 | 
			
		||||
    Authenticated user must be an admin
 | 
			
		||||
    Authenticated user must be an admin.
 | 
			
		||||
 | 
			
		||||
    **Scope**: ``application:write``
 | 
			
		||||
 | 
			
		||||
    **Example request**:
 | 
			
		||||
 | 
			
		||||
@@ -98,14 +100,14 @@ def update_application_config(auth_user: User) -> Union[Dict, HttpResponse]:
 | 
			
		||||
          "max_users": 10,
 | 
			
		||||
          "max_zip_file_size": 10485760,
 | 
			
		||||
          "map_attribution": "© <a href=http://www.openstreetmap.org/copyright>OpenStreetMap</a> contributors"
 | 
			
		||||
          "version": "0.6.12"
 | 
			
		||||
          "version": "0.7.0"
 | 
			
		||||
        },
 | 
			
		||||
        "status": "success"
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    :<json string admin_contact: email to contact the administrator
 | 
			
		||||
    :<json integer gpx_limit_import: max number of files in zip archive
 | 
			
		||||
    :<json boolean is_registration_enabled: is registration enabled ?
 | 
			
		||||
    :<json boolean is_registration_enabled: is registration enabled?
 | 
			
		||||
    :<json integer max_single_file_size: max size of a single file
 | 
			
		||||
    :<json integer max_users: max users allowed to register on instance
 | 
			
		||||
    :<json integer max_zip_file_size: max size of a zip archive
 | 
			
		||||
@@ -187,6 +189,5 @@ def health_check() -> Union[Dict, HttpResponse]:
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    :statuscode 200: success
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    return {'status': 'success', 'message': 'pong!'}
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
import click
 | 
			
		||||
 | 
			
		||||
from fittrackee.migrations.commands import db_cli
 | 
			
		||||
from fittrackee.oauth2.commands import oauth2_cli
 | 
			
		||||
from fittrackee.users.commands import users_cli
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -11,4 +12,5 @@ def cli() -> None:
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
cli.add_command(db_cli)
 | 
			
		||||
cli.add_command(oauth2_cli)
 | 
			
		||||
cli.add_command(users_cli)
 | 
			
		||||
 
 | 
			
		||||
@@ -51,6 +51,10 @@ class BaseConfig:
 | 
			
		||||
        current_app.root_path, 'emails/translations'
 | 
			
		||||
    )
 | 
			
		||||
    LANGUAGES = ['en', 'fr', 'de']
 | 
			
		||||
    OAUTH2_TOKEN_EXPIRES_IN = {
 | 
			
		||||
        'authorization_code': 864000,  # 10 days
 | 
			
		||||
    }
 | 
			
		||||
    OAUTH2_REFRESH_TOKEN_GENERATOR = True
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DevelopmentConfig(BaseConfig):
 | 
			
		||||
@@ -72,6 +76,9 @@ class TestingConfig(BaseConfig):
 | 
			
		||||
    PASSWORD_TOKEN_EXPIRATION_SECONDS = 3
 | 
			
		||||
    UI_URL = 'http://0.0.0.0:5000'
 | 
			
		||||
    SENDER_EMAIL = 'fittrackee@example.com'
 | 
			
		||||
    OAUTH2_TOKEN_EXPIRES_IN = {
 | 
			
		||||
        'authorization_code': 60,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class End2EndTestingConfig(TestingConfig):
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								fittrackee/dist/index.html
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1 +1 @@
 | 
			
		||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/static/css/fork-awesome.min.css"/><link rel="stylesheet" href="/static/css/leaflet.css"/><title>FitTrackee</title><script defer="defer" src="/static/js/chunk-vendors.084be0e8.js"></script><script defer="defer" src="/static/js/app.86e70c26.js"></script><link href="/static/css/app.f768a44b.css" rel="stylesheet"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="fittrackee_client"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but FitTrackee doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
 | 
			
		||||
<!doctype html><html lang="en"><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><!--[if IE]><link rel="icon" href="/favicon.ico"><![endif]--><link rel="stylesheet" href="/static/css/fork-awesome.min.css"/><link rel="stylesheet" href="/static/css/leaflet.css"/><title>FitTrackee</title><script defer="defer" src="/static/js/chunk-vendors.e9c5b3a5.js"></script><script defer="defer" src="/static/js/app.4f3048de.js"></script><link href="/static/css/app.eee1934d.css" rel="stylesheet"><link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png"><link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="fittrackee_client"><link rel="apple-touch-icon" href="/img/icons/apple-touch-icon-152x152.png"><link rel="mask-icon" href="/img/icons/safari-pinned-tab.svg" color="#4DBA87"><meta name="msapplication-TileImage" content="/img/icons/msapplication-icon-144x144.png"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but FitTrackee doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div></body></html>
 | 
			
		||||
							
								
								
									
										2
									
								
								fittrackee/dist/service-worker.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/service-worker.js.map
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/css/app.eee1934d.css
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/css/app.f768a44b.css
									
									
									
									
										vendored
									
									
								
							
							
						
						@@ -1 +1 @@
 | 
			
		||||
.chart-menu[data-v-22d55de2]{display:flex}.chart-menu .chart-arrow[data-v-22d55de2],.chart-menu .time-frames[data-v-22d55de2]{flex-grow:1;text-align:center}.chart-menu .chart-arrow[data-v-22d55de2]{cursor:pointer}.sports-menu{display:flex;flex-wrap:wrap;padding:10px}.sports-menu label{display:flex;align-items:center;font-size:.9em;font-weight:400;min-width:120px;padding:10px}@media screen and (max-width:1000px){.sports-menu label{min-width:100px}}@media screen and (max-width:500px){.sports-menu label{min-width:20px}.sports-menu label .sport-label{display:none}}.sports-menu .sport-img{padding:3px;width:20px;height:20px}#user-statistics.stats-disabled[data-v-d693c7da]{opacity:.3;pointer-events:none}#user-statistics[data-v-d693c7da] .chart-radio{justify-content:space-around;padding:30px 10px 10px 10px}#statistics[data-v-2e341d4e]{display:flex;width:100%}#statistics .container[data-v-2e341d4e]{display:flex;flex-direction:column;width:100%}
 | 
			
		||||
.chart-menu[data-v-22d55de2]{display:flex}.chart-menu .chart-arrow[data-v-22d55de2],.chart-menu .time-frames[data-v-22d55de2]{flex-grow:1;text-align:center}.chart-menu .chart-arrow[data-v-22d55de2]{cursor:pointer}.sports-menu{display:flex;flex-wrap:wrap;padding:10px}.sports-menu label{display:flex;align-items:center;font-size:.9em;font-weight:400;min-width:120px;padding:10px}@media screen and (max-width:1000px){.sports-menu label{min-width:100px}}@media screen and (max-width:500px){.sports-menu label{min-width:20px}.sports-menu label .sport-label{display:none}}.sports-menu .sport-img{padding:3px;width:20px;height:20px}#user-statistics.stats-disabled[data-v-30799d13]{opacity:.3;pointer-events:none}#user-statistics[data-v-30799d13] .chart-radio{justify-content:space-around;padding:30px 10px 10px 10px}#statistics[data-v-2e341d4e]{display:flex;width:100%}#statistics .container[data-v-2e341d4e]{display:flex;flex-direction:column;width:100%}
 | 
			
		||||
@@ -1,2 +1,2 @@
 | 
			
		||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[328],{6e3:function(t,e,i){i.r(e),i.d(e,{default:function(){return _}});var a=i(6252),n=i(2262),s=i(8273),c=i(8602),r=i(9917);const S=t=>((0,a.dD)("data-v-64629971"),t=t(),(0,a.Cn)(),t),l={id:"admin",class:"view"},p={key:0,class:"container"},u=S((()=>(0,a._)("div",{id:"bottom"},null,-1)));var T=(0,a.aZ)({__name:"AdminView",setup(t){const e=(0,r.o)(),i=(0,a.Fl)((()=>e.getters[c.SY.GETTERS.APP_CONFIG])),S=(0,a.Fl)((()=>e.getters[c.SY.GETTERS.APP_STATS])),T=(0,a.Fl)((()=>e.getters[c.YN.GETTERS.IS_ADMIN])),d=(0,a.Fl)((()=>e.getters[c.YN.GETTERS.USER_LOADING]));return(0,a.wF)((()=>e.dispatch(c.SY.ACTIONS.GET_APPLICATION_STATS))),(t,e)=>{const c=(0,a.up)("router-view");return(0,a.wg)(),(0,a.iD)("div",l,[(0,n.SU)(d)?(0,a.kq)("",!0):((0,a.wg)(),(0,a.iD)("div",p,[(0,n.SU)(T)?((0,a.wg)(),(0,a.j4)(c,{key:0,appConfig:(0,n.SU)(i),appStatistics:(0,n.SU)(S)},null,8,["appConfig","appStatistics"])):((0,a.wg)(),(0,a.j4)(s.Z,{key:1})),u]))])}}}),d=i(3744);const o=(0,d.Z)(T,[["__scopeId","data-v-64629971"]]);var _=o}}]);
 | 
			
		||||
//# sourceMappingURL=admin.37d75250.js.map
 | 
			
		||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[328],{6e3:function(t,e,i){i.r(e),i.d(e,{default:function(){return _}});var a=i(6252),n=i(2262),s=i(8273),c=i(5801),r=i(9917);const S=t=>((0,a.dD)("data-v-64629971"),t=t(),(0,a.Cn)(),t),l={id:"admin",class:"view"},p={key:0,class:"container"},u=S((()=>(0,a._)("div",{id:"bottom"},null,-1)));var T=(0,a.aZ)({__name:"AdminView",setup(t){const e=(0,r.o)(),i=(0,a.Fl)((()=>e.getters[c.SY.GETTERS.APP_CONFIG])),S=(0,a.Fl)((()=>e.getters[c.SY.GETTERS.APP_STATS])),T=(0,a.Fl)((()=>e.getters[c.YN.GETTERS.IS_ADMIN])),d=(0,a.Fl)((()=>e.getters[c.YN.GETTERS.USER_LOADING]));return(0,a.wF)((()=>e.dispatch(c.SY.ACTIONS.GET_APPLICATION_STATS))),(t,e)=>{const c=(0,a.up)("router-view");return(0,a.wg)(),(0,a.iD)("div",l,[(0,n.SU)(d)?(0,a.kq)("",!0):((0,a.wg)(),(0,a.iD)("div",p,[(0,n.SU)(T)?((0,a.wg)(),(0,a.j4)(c,{key:0,appConfig:(0,n.SU)(i),appStatistics:(0,n.SU)(S)},null,8,["appConfig","appStatistics"])):((0,a.wg)(),(0,a.j4)(s.Z,{key:1})),u]))])}}}),d=i(3744);const o=(0,d.Z)(T,[["__scopeId","data-v-64629971"]]);var _=o}}]);
 | 
			
		||||
//# sourceMappingURL=admin.ab9e5f5f.js.map
 | 
			
		||||
@@ -1 +1 @@
 | 
			
		||||
{"version":3,"file":"static/js/admin.37d75250.js","mappings":"mOAGA,MAAMA,EAAeC,KAAMC,EAAAA,EAAAA,IAAa,mBAAmBD,EAAEA,KAAIE,EAAAA,EAAAA,MAAcF,GACzEG,EAAa,CACjBC,GAAI,QACJC,MAAO,QAEHC,EAAa,CACjBC,IAAK,EACLF,MAAO,aAEHG,EAA2BT,GAAa,KAAmBU,EAAAA,EAAAA,GAAoB,MAAO,CAAEL,GAAI,UAAY,MAAO,KAUrH,OAA4BM,EAAAA,EAAAA,IAAiB,CAC3CC,OAAQ,YACRC,MAAMC,GAEN,MAAMC,GAAQC,EAAAA,EAAAA,KAERC,GAAqCC,EAAAA,EAAAA,KACzC,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,cAEhBC,GAA6CH,EAAAA,EAAAA,KACjD,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,aAEhBE,GAAuCJ,EAAAA,EAAAA,KAC3C,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,YAEhBC,GAAoCN,EAAAA,EAAAA,KACxC,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,gBAKxB,OAFEE,EAAAA,EAAAA,KAAc,IAAMV,EAAMW,SAASN,EAAAA,GAAAA,QAAAA,yBAE9B,CAACO,EAAUC,KAChB,MAAMC,GAAyBC,EAAAA,EAAAA,IAAkB,eAEjD,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAO5B,EAAY,EACzD6B,EAAAA,EAAAA,IAAOT,IAWLU,EAAAA,EAAAA,IAAoB,IAAI,KAVvBH,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAOzB,EAAY,EACnD0B,EAAAA,EAAAA,IAAOX,KACHS,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaN,EAAwB,CAClDrB,IAAK,EACLS,WAAWgB,EAAAA,EAAAA,IAAOhB,GAClBI,eAAeY,EAAAA,EAAAA,IAAOZ,IACrB,KAAM,EAAG,CAAC,YAAa,qBACzBU,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaC,EAAAA,EAAU,CAAE5B,IAAK,KACjDC,MAVR,CAeD,I,UCvDD,MAAM4B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,YAAY,qBAEvE,O","sources":["webpack://fittrackee_client/./src/views/AdminView.vue?67de","webpack://fittrackee_client/./src/views/AdminView.vue"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-64629971\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  id: \"admin\",\n  class: \"view\"\n}\nconst _hoisted_2 = {\n  key: 0,\n  class: \"container\"\n}\nconst _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { id: \"bottom\" }, null, -1))\n\nimport { computed, ComputedRef, onBeforeMount } from 'vue'\n\n  import NotFound from '@/components/Common/NotFound.vue'\n  import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'\n  import { TAppConfig, IAppStatistics } from '@/types/application'\n  import { useStore } from '@/use/useStore'\n\n  \nexport default /*#__PURE__*/_defineComponent({\n  __name: 'AdminView',\n  setup(__props) {\n\n  const store = useStore()\n\n  const appConfig: ComputedRef<TAppConfig> = computed(\n    () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n  )\n  const appStatistics: ComputedRef<IAppStatistics> = computed(\n    () => store.getters[ROOT_STORE.GETTERS.APP_STATS]\n  )\n  const isAuthUserAmin: ComputedRef<boolean> = computed(\n    () => store.getters[AUTH_USER_STORE.GETTERS.IS_ADMIN]\n  )\n  const userLoading: ComputedRef<boolean> = computed(\n    () => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]\n  )\n\n  onBeforeMount(() => store.dispatch(ROOT_STORE.ACTIONS.GET_APPLICATION_STATS))\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_router_view = _resolveComponent(\"router-view\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (!_unref(userLoading))\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          (_unref(isAuthUserAmin))\n            ? (_openBlock(), _createBlock(_component_router_view, {\n                key: 0,\n                appConfig: _unref(appConfig),\n                appStatistics: _unref(appStatistics)\n              }, null, 8, [\"appConfig\", \"appStatistics\"]))\n            : (_openBlock(), _createBlock(NotFound, { key: 1 })),\n          _hoisted_3\n        ]))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","import script from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./AdminView.vue?vue&type=style&index=0&id=64629971&lang=scss&scoped=true\"\n\nimport exportComponent from \"/mnt/data-lnx/Devs/00_Perso/FitTrackee/fittrackee_client/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-64629971\"]])\n\nexport default __exports__"],"names":["_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_1","id","class","_hoisted_2","key","_hoisted_3","_createElementVNode","_defineComponent","__name","setup","__props","store","useStore","appConfig","computed","getters","ROOT_STORE","appStatistics","isAuthUserAmin","AUTH_USER_STORE","userLoading","onBeforeMount","dispatch","_ctx","_cache","_component_router_view","_resolveComponent","_openBlock","_createElementBlock","_unref","_createCommentVNode","_createBlock","NotFound","__exports__"],"sourceRoot":""}
 | 
			
		||||
{"version":3,"file":"static/js/admin.ab9e5f5f.js","mappings":"mOAGA,MAAMA,EAAeC,KAAMC,EAAAA,EAAAA,IAAa,mBAAmBD,EAAEA,KAAIE,EAAAA,EAAAA,MAAcF,GACzEG,EAAa,CACjBC,GAAI,QACJC,MAAO,QAEHC,EAAa,CACjBC,IAAK,EACLF,MAAO,aAEHG,EAA2BT,GAAa,KAAmBU,EAAAA,EAAAA,GAAoB,MAAO,CAAEL,GAAI,UAAY,MAAO,KAUrH,OAA4BM,EAAAA,EAAAA,IAAiB,CAC3CC,OAAQ,YACRC,MAAMC,GAEN,MAAMC,GAAQC,EAAAA,EAAAA,KAERC,GAAqCC,EAAAA,EAAAA,KACzC,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,cAEhBC,GAA6CH,EAAAA,EAAAA,KACjD,IAAMH,EAAMI,QAAQC,EAAAA,GAAAA,QAAAA,aAEhBE,GAAuCJ,EAAAA,EAAAA,KAC3C,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,YAEhBC,GAAoCN,EAAAA,EAAAA,KACxC,IAAMH,EAAMI,QAAQI,EAAAA,GAAAA,QAAAA,gBAKxB,OAFEE,EAAAA,EAAAA,KAAc,IAAMV,EAAMW,SAASN,EAAAA,GAAAA,QAAAA,yBAE9B,CAACO,EAAUC,KAChB,MAAMC,GAAyBC,EAAAA,EAAAA,IAAkB,eAEjD,OAAQC,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAO5B,EAAY,EACzD6B,EAAAA,EAAAA,IAAOT,IAWLU,EAAAA,EAAAA,IAAoB,IAAI,KAVvBH,EAAAA,EAAAA,OAAcC,EAAAA,EAAAA,IAAoB,MAAOzB,EAAY,EACnD0B,EAAAA,EAAAA,IAAOX,KACHS,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaN,EAAwB,CAClDrB,IAAK,EACLS,WAAWgB,EAAAA,EAAAA,IAAOhB,GAClBI,eAAeY,EAAAA,EAAAA,IAAOZ,IACrB,KAAM,EAAG,CAAC,YAAa,qBACzBU,EAAAA,EAAAA,OAAcI,EAAAA,EAAAA,IAAaC,EAAAA,EAAU,CAAE5B,IAAK,KACjDC,MAVR,CAeD,I,UCvDD,MAAM4B,GAA2B,OAAgB,EAAQ,CAAC,CAAC,YAAY,qBAEvE,O","sources":["webpack://fittrackee_client/./src/views/AdminView.vue?67de","webpack://fittrackee_client/./src/views/AdminView.vue"],"sourcesContent":["import { defineComponent as _defineComponent } from 'vue'\nimport { unref as _unref, resolveComponent as _resolveComponent, openBlock as _openBlock, createBlock as _createBlock, createCommentVNode as _createCommentVNode, createElementVNode as _createElementVNode, createElementBlock as _createElementBlock, pushScopeId as _pushScopeId, popScopeId as _popScopeId } from \"vue\"\n\nconst _withScopeId = n => (_pushScopeId(\"data-v-64629971\"),n=n(),_popScopeId(),n)\nconst _hoisted_1 = {\n  id: \"admin\",\n  class: \"view\"\n}\nconst _hoisted_2 = {\n  key: 0,\n  class: \"container\"\n}\nconst _hoisted_3 = /*#__PURE__*/ _withScopeId(() => /*#__PURE__*/_createElementVNode(\"div\", { id: \"bottom\" }, null, -1))\n\nimport { computed, ComputedRef, onBeforeMount } from 'vue'\n\n  import NotFound from '@/components/Common/NotFound.vue'\n  import { AUTH_USER_STORE, ROOT_STORE } from '@/store/constants'\n  import { TAppConfig, IAppStatistics } from '@/types/application'\n  import { useStore } from '@/use/useStore'\n\n  \nexport default /*#__PURE__*/_defineComponent({\n  __name: 'AdminView',\n  setup(__props) {\n\n  const store = useStore()\n\n  const appConfig: ComputedRef<TAppConfig> = computed(\n    () => store.getters[ROOT_STORE.GETTERS.APP_CONFIG]\n  )\n  const appStatistics: ComputedRef<IAppStatistics> = computed(\n    () => store.getters[ROOT_STORE.GETTERS.APP_STATS]\n  )\n  const isAuthUserAmin: ComputedRef<boolean> = computed(\n    () => store.getters[AUTH_USER_STORE.GETTERS.IS_ADMIN]\n  )\n  const userLoading: ComputedRef<boolean> = computed(\n    () => store.getters[AUTH_USER_STORE.GETTERS.USER_LOADING]\n  )\n\n  onBeforeMount(() => store.dispatch(ROOT_STORE.ACTIONS.GET_APPLICATION_STATS))\n\nreturn (_ctx: any,_cache: any) => {\n  const _component_router_view = _resolveComponent(\"router-view\")!\n\n  return (_openBlock(), _createElementBlock(\"div\", _hoisted_1, [\n    (!_unref(userLoading))\n      ? (_openBlock(), _createElementBlock(\"div\", _hoisted_2, [\n          (_unref(isAuthUserAmin))\n            ? (_openBlock(), _createBlock(_component_router_view, {\n                key: 0,\n                appConfig: _unref(appConfig),\n                appStatistics: _unref(appStatistics)\n              }, null, 8, [\"appConfig\", \"appStatistics\"]))\n            : (_openBlock(), _createBlock(NotFound, { key: 1 })),\n          _hoisted_3\n        ]))\n      : _createCommentVNode(\"\", true)\n  ]))\n}\n}\n\n})","import script from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\nexport * from \"./AdminView.vue?vue&type=script&setup=true&lang=ts\"\n\nimport \"./AdminView.vue?vue&type=style&index=0&id=64629971&lang=scss&scoped=true\"\n\nimport exportComponent from \"/mnt/data-lnx/Devs/00_Perso/FitTrackee/fittrackee_client/node_modules/vue-loader/dist/exportHelper.js\"\nconst __exports__ = /*#__PURE__*/exportComponent(script, [['__scopeId',\"data-v-64629971\"]])\n\nexport default __exports__"],"names":["_withScopeId","n","_pushScopeId","_popScopeId","_hoisted_1","id","class","_hoisted_2","key","_hoisted_3","_createElementVNode","_defineComponent","__name","setup","__props","store","useStore","appConfig","computed","getters","ROOT_STORE","appStatistics","isAuthUserAmin","AUTH_USER_STORE","userLoading","onBeforeMount","dispatch","_ctx","_cache","_component_router_view","_resolveComponent","_openBlock","_createElementBlock","_unref","_createCommentVNode","_createBlock","NotFound","__exports__"],"sourceRoot":""}
 | 
			
		||||
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/app.4f3048de.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/js/app.4f3048de.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/app.86e70c26.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										67
									
								
								fittrackee/dist/static/js/chunk-vendors.e9c5b3a5.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/js/chunk-vendors.e9c5b3a5.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/password.d0f613fa.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										1
									
								
								fittrackee/dist/static/js/password.d0f613fa.js.map
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -1,2 +0,0 @@
 | 
			
		||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[845],{4264:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(6252),a=r(2262),s=r(3577),u=r(2201),o=r(7167),i=r(8602),c=r(9917);const l={key:0,id:"account-confirmation",class:"center-card with-margin"},E={class:"error-message"};var _=(0,n.aZ)({__name:"AccountConfirmationView",setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),_=(0,c.o)(),d=(0,n.Fl)((()=>_.getters[i.SY.GETTERS.ERROR_MESSAGES])),S=(0,n.Fl)((()=>t.query.token));function m(){S.value?_.dispatch(i.YN.ACTIONS.CONFIRM_ACCOUNT,{token:S.value}):r.push("/")}return(0,n.wF)((()=>m())),(0,n.Ah)((()=>_.commit(i.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(e,t)=>{const r=(0,n.up)("router-link");return(0,a.SU)(d)?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n.Wm)(r,{class:"links",to:"/account-confirmation/resend"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("buttons.ACCOUNT-CONFIRMATION-RESEND"))+"? ",1)])),_:1})])])):(0,n.kq)("",!0)}}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-785df978"]]);var m=S},8160:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(6252),a=r(2262),s=r(3577),u=r(2201),o=r(7167),i=r(8602),c=r(9917);const l={key:0,id:"email-update",class:"center-card with-margin"},E={class:"error-message"};var _=(0,n.aZ)({__name:"EmailUpdateView",setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),_=(0,c.o)(),d=(0,n.Fl)((()=>_.getters[i.YN.GETTERS.AUTH_USER_PROFILE])),S=(0,n.Fl)((()=>_.getters[i.YN.GETTERS.IS_AUTHENTICATED])),m=(0,n.Fl)((()=>_.getters[i.SY.GETTERS.ERROR_MESSAGES])),p=(0,n.Fl)((()=>t.query.token));function R(){p.value?_.dispatch(i.YN.ACTIONS.CONFIRM_EMAIL,{token:p.value,refreshUser:S.value}):r.push("/")}return(0,n.wF)((()=>R())),(0,n.Ah)((()=>_.commit(i.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(0,n.YP)((()=>m.value),(e=>{d.value.username&&e&&r.push("/")})),(e,t)=>{const r=(0,n.up)("router-link"),u=(0,n.up)("i18n-t");return(0,a.SU)(m)&&!(0,a.SU)(d).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n._)("span",null,[(0,n.Wm)(u,{keypath:"user.PROFILE.ERRORED_EMAIL_UPDATE"},{default:(0,n.w5)((()=>[(0,n.Wm)(r,{to:"/login"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("user.LOG_IN")),1)])),_:1})])),_:1})])])])):(0,n.kq)("",!0)}}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-8c2ec9ce"]]);var m=S},6266:function(e,t,r){r.r(t),r.d(t,{default:function(){return d}});var n=r(6252),a=r(2262),s=r(8602),u=r(9917);const o=e=>((0,n.dD)("data-v-05463732"),e=e(),(0,n.Cn)(),e),i={key:0,id:"profile",class:"container view"},c=o((()=>(0,n._)("div",{id:"bottom"},null,-1)));var l=(0,n.aZ)({__name:"ProfileView",setup(e){const t=(0,u.o)(),r=(0,n.Fl)((()=>t.getters[s.YN.GETTERS.AUTH_USER_PROFILE]));return(e,t)=>{const s=(0,n.up)("router-view");return(0,a.SU)(r).username?((0,n.wg)(),(0,n.iD)("div",i,[(0,n.Wm)(s,{user:(0,a.SU)(r)},null,8,["user"]),c])):(0,n.kq)("",!0)}}}),E=r(3744);const _=(0,E.Z)(l,[["__scopeId","data-v-05463732"]]);var d=_},9453:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(6252),a=r(2262),s=r(2201),u=r(2179),o=r(7408),i=r(8602),c=r(9917);const l={key:0,id:"user",class:"view"},E={class:"box"};var _=(0,n.aZ)({__name:"UserView",props:{fromAdmin:{type:Boolean}},setup(e){const t=e,{fromAdmin:r}=(0,a.BK)(t),_=(0,s.yj)(),d=(0,c.o)(),S=(0,n.Fl)((()=>d.getters[i.RT.GETTERS.USER]));return(0,n.wF)((()=>{_.params.username&&"string"===typeof _.params.username&&d.dispatch(i.RT.ACTIONS.GET_USER,_.params.username)})),(0,n.Jd)((()=>{d.dispatch(i.RT.ACTIONS.EMPTY_USER)})),(e,t)=>(0,a.SU)(S).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(u.Z,{user:(0,a.SU)(S)},null,8,["user"]),(0,n._)("div",E,[(0,n.Wm)(o.Z,{user:(0,a.SU)(S),"from-admin":(0,a.SU)(r)},null,8,["user","from-admin"])])])):(0,n.kq)("",!0)}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-af7007f4"]]);var m=S}}]);
 | 
			
		||||
//# sourceMappingURL=profile.893f39a0.js.map
 | 
			
		||||
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/profile.dd30724d.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,2 @@
 | 
			
		||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[845],{4264:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});r(7658);var n=r(6252),a=r(2262),s=r(3577),u=r(2201),o=r(7167),i=r(5801),c=r(9917);const l={key:0,id:"account-confirmation",class:"center-card with-margin"},E={class:"error-message"};var _=(0,n.aZ)({__name:"AccountConfirmationView",setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),_=(0,c.o)(),d=(0,n.Fl)((()=>_.getters[i.SY.GETTERS.ERROR_MESSAGES])),S=(0,n.Fl)((()=>t.query.token));function m(){S.value?_.dispatch(i.YN.ACTIONS.CONFIRM_ACCOUNT,{token:S.value}):r.push("/")}return(0,n.wF)((()=>m())),(0,n.Ah)((()=>_.commit(i.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(e,t)=>{const r=(0,n.up)("router-link");return(0,a.SU)(d)?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n.Wm)(r,{class:"links",to:"/account-confirmation/resend"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("buttons.ACCOUNT-CONFIRMATION-RESEND"))+"? ",1)])),_:1})])])):(0,n.kq)("",!0)}}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-785df978"]]);var m=S},8160:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});r(7658);var n=r(6252),a=r(2262),s=r(3577),u=r(2201),o=r(7167),i=r(5801),c=r(9917);const l={key:0,id:"email-update",class:"center-card with-margin"},E={class:"error-message"};var _=(0,n.aZ)({__name:"EmailUpdateView",setup(e){const t=(0,u.yj)(),r=(0,u.tv)(),_=(0,c.o)(),d=(0,n.Fl)((()=>_.getters[i.YN.GETTERS.AUTH_USER_PROFILE])),S=(0,n.Fl)((()=>_.getters[i.YN.GETTERS.IS_AUTHENTICATED])),m=(0,n.Fl)((()=>_.getters[i.SY.GETTERS.ERROR_MESSAGES])),p=(0,n.Fl)((()=>t.query.token));function R(){p.value?_.dispatch(i.YN.ACTIONS.CONFIRM_EMAIL,{token:p.value,refreshUser:S.value}):r.push("/")}return(0,n.wF)((()=>R())),(0,n.Ah)((()=>_.commit(i.SY.MUTATIONS.EMPTY_ERROR_MESSAGES))),(0,n.YP)((()=>m.value),(e=>{d.value.username&&e&&r.push("/")})),(e,t)=>{const r=(0,n.up)("router-link"),u=(0,n.up)("i18n-t");return(0,a.SU)(m)&&!(0,a.SU)(d).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(o.Z),(0,n._)("p",E,[(0,n._)("span",null,(0,s.zw)(e.$t("error.SOMETHING_WRONG"))+".",1),(0,n._)("span",null,[(0,n.Wm)(u,{keypath:"user.PROFILE.ERRORED_EMAIL_UPDATE"},{default:(0,n.w5)((()=>[(0,n.Wm)(r,{to:"/login"},{default:(0,n.w5)((()=>[(0,n.Uk)((0,s.zw)(e.$t("user.LOG_IN")),1)])),_:1})])),_:1})])])])):(0,n.kq)("",!0)}}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-8c2ec9ce"]]);var m=S},6266:function(e,t,r){r.r(t),r.d(t,{default:function(){return d}});var n=r(6252),a=r(2262),s=r(5801),u=r(9917);const o=e=>((0,n.dD)("data-v-05463732"),e=e(),(0,n.Cn)(),e),i={key:0,id:"profile",class:"container view"},c=o((()=>(0,n._)("div",{id:"bottom"},null,-1)));var l=(0,n.aZ)({__name:"ProfileView",setup(e){const t=(0,u.o)(),r=(0,n.Fl)((()=>t.getters[s.YN.GETTERS.AUTH_USER_PROFILE]));return(e,t)=>{const s=(0,n.up)("router-view");return(0,a.SU)(r).username?((0,n.wg)(),(0,n.iD)("div",i,[(0,n.Wm)(s,{user:(0,a.SU)(r)},null,8,["user"]),c])):(0,n.kq)("",!0)}}}),E=r(3744);const _=(0,E.Z)(l,[["__scopeId","data-v-05463732"]]);var d=_},9453:function(e,t,r){r.r(t),r.d(t,{default:function(){return m}});var n=r(6252),a=r(2262),s=r(2201),u=r(2179),o=r(7408),i=r(5801),c=r(9917);const l={key:0,id:"user",class:"view"},E={class:"box"};var _=(0,n.aZ)({__name:"UserView",props:{fromAdmin:{type:Boolean}},setup(e){const t=e,{fromAdmin:r}=(0,a.BK)(t),_=(0,s.yj)(),d=(0,c.o)(),S=(0,n.Fl)((()=>d.getters[i.RT.GETTERS.USER]));return(0,n.wF)((()=>{_.params.username&&"string"===typeof _.params.username&&d.dispatch(i.RT.ACTIONS.GET_USER,_.params.username)})),(0,n.Jd)((()=>{d.dispatch(i.RT.ACTIONS.EMPTY_USER)})),(e,t)=>(0,a.SU)(S).username?((0,n.wg)(),(0,n.iD)("div",l,[(0,n.Wm)(u.Z,{user:(0,a.SU)(S)},null,8,["user"]),(0,n._)("div",E,[(0,n.Wm)(o.Z,{user:(0,a.SU)(S),"from-admin":(0,a.SU)(r)},null,8,["user","from-admin"])])])):(0,n.kq)("",!0)}}),d=r(3744);const S=(0,d.Z)(_,[["__scopeId","data-v-af7007f4"]]);var m=S}}]);
 | 
			
		||||
//# sourceMappingURL=profile.dd30724d.js.map
 | 
			
		||||
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/reset.034fcfee.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/reset.987a4de8.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
							
								
								
									
										2
									
								
								fittrackee/dist/static/js/statistics.61163b0e.js
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						@@ -0,0 +1,2 @@
 | 
			
		||||
"use strict";(self["webpackChunkfittrackee_client"]=self["webpackChunkfittrackee_client"]||[]).push([[193],{7885:function(e,s,t){t.r(s),t.d(s,{default:function(){return A}});var a=t(6252),r=t(2262),l=t(3577),o=(t(7658),t(9150)),n=t(4998);const c={class:"chart-menu"},i={class:"chart-arrow"},u={class:"time-frames custom-checkboxes-group"},d={class:"time-frames-checkboxes custom-checkboxes"},p=["id","name","checked","onInput"],m={class:"chart-arrow"};var v=(0,a.aZ)({__name:"StatsMenu",emits:["arrowClick","timeFrameUpdate"],setup(e,{emit:s}){const t=(0,r.iH)("month"),o=["week","month","year"];function n(e){t.value=e,s("timeFrameUpdate",e)}return(e,r)=>((0,a.wg)(),(0,a.iD)("div",c,[(0,a._)("div",i,[(0,a._)("i",{class:"fa fa-chevron-left","aria-hidden":"true",onClick:r[0]||(r[0]=e=>s("arrowClick",!0))})]),(0,a._)("div",u,[(0,a._)("div",d,[((0,a.wg)(),(0,a.iD)(a.HY,null,(0,a.Ko)(o,(s=>(0,a._)("div",{class:"time-frame custom-checkbox",key:s},[(0,a._)("label",null,[(0,a._)("input",{type:"radio",id:s,name:s,checked:t.value===s,onInput:e=>n(s)},null,40,p),(0,a._)("span",null,(0,l.zw)(e.$t(`statistics.TIME_FRAMES.${s}`)),1)])]))),64))])]),(0,a._)("div",m,[(0,a._)("i",{class:"fa fa-chevron-right","aria-hidden":"true",onClick:r[1]||(r[1]=e=>s("arrowClick",!1))})])]))}}),k=t(3744);const _=(0,k.Z)(v,[["__scopeId","data-v-22d55de2"]]);var S=_,w=t(631);const f={class:"sports-menu"},h=["id","name","checked","onInput"],U={class:"sport-label"};var b=(0,a.aZ)({__name:"StatsSportsMenu",props:{userSports:null,selectedSportIds:{default:()=>[]}},emits:["selectedSportIdsUpdate"],setup(e,{emit:s}){const t=e,{t:n}=(0,o.QT)(),c=(0,a.f3)("sportColors"),{selectedSportIds:i}=(0,r.BK)(t),u=(0,a.Fl)((()=>(0,w.xH)(t.userSports,n)));function d(e){s("selectedSportIdsUpdate",e)}return(e,s)=>{const t=(0,a.up)("SportImage");return(0,a.wg)(),(0,a.iD)("div",f,[((0,a.wg)(!0),(0,a.iD)(a.HY,null,(0,a.Ko)((0,r.SU)(u),(e=>((0,a.wg)(),(0,a.iD)("label",{type:"checkbox",key:e.id,style:(0,l.j5)({color:e.color?e.color:(0,r.SU)(c)[e.label]})},[(0,a._)("input",{type:"checkbox",id:e.id,name:e.label,checked:(0,r.SU)(i).includes(e.id),onInput:s=>d(e.id)},null,40,h),(0,a.Wm)(t,{"sport-label":e.label,color:e.color},null,8,["sport-label","color"]),(0,a._)("span",U,(0,l.zw)(e.translatedLabel),1)],4)))),128))])}}});const I=b;var g=I,T=t(9318);const y={key:0,id:"user-statistics"};var C=(0,a.aZ)({__name:"index",props:{sports:null,user:null},setup(e){const s=e,{t:t}=(0,o.QT)(),{sports:l,user:c}=(0,r.BK)(s),i=(0,r.iH)("month"),u=(0,r.iH)(v(i.value)),d=(0,a.Fl)((()=>(0,w.xH)(s.sports,t))),p=(0,r.iH)(_(s.sports));function m(e){i.value=e,u.value=v(i.value)}function v(e){return(0,T.aZ)(new Date,e,s.user.weekm)}function k(e){u.value=(0,T.FN)(u.value,e,s.user.weekm)}function _(e){return e.map((e=>e.id))}function f(e){p.value.includes(e)?p.value=p.value.filter((s=>s!==e)):p.value.push(e)}return(0,a.YP)((()=>s.sports),(e=>{p.value=_(e)})),(e,s)=>(0,r.SU)(d)?((0,a.wg)(),(0,a.iD)("div",y,[(0,a.Wm)(S,{onTimeFrameUpdate:m,onArrowClick:k}),(0,a.Wm)(n.Z,{sports:(0,r.SU)(l),user:(0,r.SU)(c),chartParams:u.value,"displayed-sport-ids":p.value,fullStats:!0},null,8,["sports","user","chartParams","displayed-sport-ids"]),(0,a.Wm)(g,{"selected-sport-ids":p.value,"user-sports":(0,r.SU)(l),onSelectedSportIdsUpdate:f},null,8,["selected-sport-ids","user-sports"])])):(0,a.kq)("",!0)}});const F=(0,k.Z)(C,[["__scopeId","data-v-30799d13"]]);var Z=F,x=t(5630),D=t(5801),H=t(9917);const E={id:"statistics",class:"view"},R={key:0,class:"container"};var W=(0,a.aZ)({__name:"StatisticsView",setup(e){const s=(0,H.o)(),t=(0,a.Fl)((()=>s.getters[D.YN.GETTERS.AUTH_USER_PROFILE])),o=(0,a.Fl)((()=>s.getters[D.O8.GETTERS.SPORTS].filter((e=>t.value.sports_list.includes(e.id)))));return(e,s)=>{const n=(0,a.up)("Card");return(0,a.wg)(),(0,a.iD)("div",E,[(0,r.SU)(t).username?((0,a.wg)(),(0,a.iD)("div",R,[(0,a.Wm)(n,null,{title:(0,a.w5)((()=>[(0,a.Uk)((0,l.zw)(e.$t("statistics.STATISTICS")),1)])),content:(0,a.w5)((()=>[(0,a.Wm)(Z,{class:(0,l.C_)({"stats-disabled":0===(0,r.SU)(t).nb_workouts}),user:(0,r.SU)(t),sports:(0,r.SU)(o)},null,8,["class","user","sports"])])),_:1}),0===(0,r.SU)(t).nb_workouts?((0,a.wg)(),(0,a.j4)(x.Z,{key:0})):(0,a.kq)("",!0)])):(0,a.kq)("",!0)])}}});const P=(0,k.Z)(W,[["__scopeId","data-v-2e341d4e"]]);var A=P}}]);
 | 
			
		||||
//# sourceMappingURL=statistics.61163b0e.js.map
 | 
			
		||||