Skip to content

Commit

Permalink
docs(api): improve api documentation (#3343)
Browse files Browse the repository at this point in the history
  • Loading branch information
ReenigneArcher authored Oct 30, 2024
1 parent d8fbe2d commit ec0cdcf
Show file tree
Hide file tree
Showing 6 changed files with 213 additions and 10 deletions.
1 change: 1 addition & 0 deletions docs/Doxyfile
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ INPUT = ../README.md \
app_examples.md \
guides.md \
performance_tuning.md \
api.md \
troubleshooting.md \
building.md \
contributing.md \
Expand Down
64 changes: 64 additions & 0 deletions docs/api.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
# API

Sunshine has a RESTful API which can be used to interact with the service.

Unless otherwise specified, authentication is required for all API calls. You can authenticate using
basic authentication with the admin username and password.

## GET /api/apps
@copydoc confighttp::getApps()

## GET /api/logs
@copydoc confighttp::getLogs()

## POST /api/apps
@copydoc confighttp::saveApp()

## DELETE /api/apps{index}
@copydoc confighttp::deleteApp()

## POST /api/covers/upload
@copydoc confighttp::uploadCover()

## GET /api/config
@copydoc confighttp::getConfig()

## GET /api/configLocale
@copydoc confighttp::getLocale()

## POST /api/config
@copydoc confighttp::saveConfig()

## POST /api/restart
@copydoc confighttp::restart()

## POST /api/password
@copydoc confighttp::savePassword()

## POST /api/pin
@copydoc confighttp::savePin()

## POST /api/clients/unpair-all
@copydoc confighttp::unpairAll()

## POST /api/clients/unpair
@copydoc confighttp::unpair()

## GET /api/clients/list
@copydoc confighttp::listClients()

## GET /api/apps/close
@copydoc confighttp::closeApp()

<div class="section_buttons">

| Previous | Next |
|:--------------------------------------------|--------------------------------------:|
| [Performance Tuning](performance_tuning.md) | [Troubleshooting](troubleshooting.md) |

</div>

<details style="display: none;">
<summary></summary>
[TOC]
</details>
6 changes: 3 additions & 3 deletions docs/performance_tuning.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,9 @@ Enabling *Fast Sync* in Nvidia settings may help reduce latency.

<div class="section_buttons">

| Previous | Next |
|:--------------------|--------------------------------------:|
| [Guides](guides.md) | [Troubleshooting](troubleshooting.md) |
| Previous | Next |
|:--------------------|--------------:|
| [Guides](guides.md) | [API](api.md) |

</div>

Expand Down
6 changes: 3 additions & 3 deletions docs/troubleshooting.md
Original file line number Diff line number Diff line change
Expand Up @@ -200,9 +200,9 @@ permissions on the disk.

<div class="section_buttons">

| Previous | Next |
|:--------------------------------------------|------------------------:|
| [Performance Tuning](performance_tuning.md) | [Building](building.md) |
| Previous | Next |
|:--------------|------------------------:|
| [API](api.md) | [Building](building.md) |

</div>

Expand Down
138 changes: 138 additions & 0 deletions src/confighttp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -324,6 +324,11 @@ namespace confighttp {
}
}

/**
* @brief Get the list of available applications.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
getApps(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand All @@ -336,6 +341,11 @@ namespace confighttp {
response->write(content, headers);
}

/**
* @brief Get the logs from the log file.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
getLogs(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand All @@ -348,6 +358,36 @@ namespace confighttp {
response->write(SimpleWeb::StatusCode::success_ok, content, headers);
}

/**
* @brief Save an application. If the application already exists, it will be updated, otherwise it will be added.
* @param response The HTTP response object.
* @param request The HTTP request object.
* The body for the post request should be JSON serialized in the following format:
* @code{.json}
* {
* "name": "Application Name",
* "output": "Log Output Path",
* "cmd": "Command to run the application",
* "index": -1,
* "exclude-global-prep-cmd": false,
* "elevated": false,
* "auto-detach": true,
* "wait-all": true,
* "exit-timeout": 5,
* "prep-cmd": [
* {
* "do": "Command to prepare",
* "undo": "Command to undo preparation",
* "elevated": false
* }
* ],
* "detached": [
* "Detached command"
* ],
* "image-path": "Full path to the application image. Must be a png file.",
* }
* @endcode
*/
void
saveApp(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down Expand Up @@ -436,6 +476,11 @@ namespace confighttp {
proc::refresh(config::stream.file_apps);
}

/**
* @brief Delete an application.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
deleteApp(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down Expand Up @@ -485,6 +530,18 @@ namespace confighttp {
proc::refresh(config::stream.file_apps);
}

/**
* @brief Upload a cover image.
* @param response The HTTP response object.
* @param request The HTTP request object.
* The body for the post request should be JSON serialized in the following format:
* @code{.json}
* {
* "key": "igdb_<game_id>",
* "url": "https://images.igdb.com/igdb/image/upload/t_cover_big_2x/<slug>.png",
* }
* @endcode
*/
void
uploadCover(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down Expand Up @@ -545,6 +602,11 @@ namespace confighttp {
outputTree.put("path", path);
}

/**
* @brief Get the configuration settings.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
getConfig(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand All @@ -570,6 +632,11 @@ namespace confighttp {
}
}

/**
* @brief Get the locale setting. This endpoint does not require authentication.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
getLocale(resp_https_t response, req_https_t request) {
// we need to return the locale whether authenticated or not
Expand All @@ -588,6 +655,19 @@ namespace confighttp {
outputTree.put("locale", config::sunshine.locale);
}

/**
* @brief Save the configuration settings.
* @param response The HTTP response object.
* @param request The HTTP request object.
* The body for the post request should be JSON serialized in the following format:
* @code{.json}
* {
* "key": "value"
* }
* @endcode
*
* @attention{It is recommended to ONLY save the config settings that differ from the default behavior.}
*/
void
saveConfig(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down Expand Up @@ -624,6 +704,11 @@ namespace confighttp {
}
}

/**
* @brief Restart Sunshine.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
restart(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand All @@ -634,6 +719,21 @@ namespace confighttp {
platf::restart();
}

/**
* @brief Update existing credentials.
* @param response The HTTP response object.
* @param request The HTTP request object.
* The body for the post request should be JSON serialized in the following format:
* @code{.json}
* {
* "currentUsername": "Current Username",
* "currentPassword": "Current Password",
* "newUsername": "New Username",
* "newPassword": "New Password",
* "confirmNewPassword": "Confirm New Password"
* }
* @endcode
*/
void
savePassword(resp_https_t response, req_https_t request) {
if (!config::sunshine.username.empty() && !authenticate(response, request)) return;
Expand Down Expand Up @@ -692,6 +792,18 @@ namespace confighttp {
}
}

/**
* @brief Send a pin code to the host. The pin is generated from the Moonlight client during the pairing process.
* @param response The HTTP response object.
* @param request The HTTP request object.
* The body for the post request should be JSON serialized in the following format:
* @code{.json}
* {
* "pin": "<pin>",
* "name": "Friendly Client Name"
* }
* @endcode
*/
void
savePin(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down Expand Up @@ -724,6 +836,11 @@ namespace confighttp {
}
}

/**
* @brief Unpair all clients.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
unpairAll(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand All @@ -742,6 +859,17 @@ namespace confighttp {
outputTree.put("status", true);
}

/**
* @brief Unpair a client.
* @param response The HTTP response object.
* @param request The HTTP request object.
* The body for the post request should be JSON serialized in the following format:
* @code{.json}
* {
* "uuid": "<uuid>"
* }
* @endcode
*/
void
unpair(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down Expand Up @@ -773,6 +901,11 @@ namespace confighttp {
}
}

/**
* @brief Get the list of paired clients.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
listClients(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand All @@ -795,6 +928,11 @@ namespace confighttp {
outputTree.put("status", true);
}

/**
* @brief Close the currently running application.
* @param response The HTTP response object.
* @param request The HTTP request object.
*/
void
closeApp(resp_https_t response, req_https_t request) {
if (!authenticate(response, request)) return;
Expand Down
8 changes: 4 additions & 4 deletions src_assets/common/assets/web/apps.html
Original file line number Diff line number Diff line change
Expand Up @@ -506,12 +506,12 @@ <h4>{{ $t('apps.env_vars_about') }}</h4>
if (dotIndex < 0 || slashIndex < 0) {
return null;
}
const hash = thumb.substring(slashIndex + 1, dotIndex);
const slug = thumb.substring(slashIndex + 1, dotIndex);
return {
name: game.name,
key: "igdb_" + game.id,
url: "https://images.igdb.com/igdb/image/upload/t_cover_big/" + hash + ".jpg",
saveUrl: "https://images.igdb.com/igdb/image/upload/t_cover_big_2x/" + hash + ".png",
key: `igdb_${game.id}`,
url: `https://images.igdb.com/igdb/image/upload/t_cover_big/${slug}.jpg`,
saveUrl: `https://images.igdb.com/igdb/image/upload/t_cover_big_2x/${slug}.png`,
}
}).filter(item => item));
}
Expand Down

0 comments on commit ec0cdcf

Please sign in to comment.