Commit 576fc193 authored by SpinShare's avatar SpinShare

static api to twig, api update

parent edf2cbcf
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Authentication - SpinShare API</title>
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Authentication
</h1>
<p>Open APIs don't require any type of authentication, these APIs are read-only and only give you publicly accessible data. If you need to modify content and/or want more detailled data (as well as user-private data), you need to use our Connect Authentication system. More information about how to register an app and authenticate it can be found on the <a href="connect-connect.htm">Connect</a> page.</p>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Endpoints & Versioning - SpinShare API</title>
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Endpoints & Versioning
</h1>
<p>Every API-Endpoint is prefixed with <code class="code">https://spinsha.re/api/</code>. Additionally, every API-call reports back the API-version in form of the <code class="code">version</code> property. If you want to ping the API (to check if it's online), you can run the Ping API-call.</p>
<div class="card" id="detail">
<h2 class="card-title">Ping</h2>
<p>Pong's back.</p>
<table class="table table-bordered">
<tr>
<th>Method</th>
<td>GET</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/ping</td>
</tr>
</table>
<br /><br />
<strong>Output Body</strong>
<pre class="code">
{
"version":1,
"status":200,
"pong":true
}
</pre>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Introduction - SpinShare API</title>
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Introduction ~ SpinShare API</title>
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Introduction
</h1>
<p>Welcome to the SpinShare API Documentation! These pages focus on all the data you can access from SpinSha.re to make cool stuff. Whether you're working on a Twitch bot, a mod for the game or anything else helping, we want you to be able to use our platform to make your projects even better!<br /><br />So what are we waiting for? Let's create something awesome together!</p>
</div>
<div class="content">
<h1 class="content-title">
Support
</h1>
<p>If you need any help implementing the SpinShare API, feel free to ask us anything in the <code class="code">#development</code> channel on our <a href="https://spinsha.re/discord" target="_blank">Discord Server</a>.</p>
</div>
<div class="content">
<h1 class="content-title">
Changelog
</h1>
<div class="alert alert-primary" role="alert">
<h4 class="alert-heading">Last Update</h4>
This documentation was last updated on 09/09/2020 at 17:48 CEST
</div>
<div class="card">
<h2 class="card-title">09/09/2020</h2>
<ul>
<li>Removed Charts, Reviews and SpinPlays from the UserDetail endpoint</li>
<li>Renamed the UserDetail endpoint to UserOverview</li>
<li>Added an endpoint for UserCharts</li>
<li>Added an endpoint for UserReviews</li>
<li>Added an endpoint for UserSpinPlays</li>
<li>Added song reference to the UserReviews endpoint</li>
<li>Added counts of charts, reviews and spinplays to the UserOverview endpoint</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
<body style="background: #25282C;">
<a href="https://spinsha.re/api/docs" style="color: #fff;">Click here</a>
<script>
window.location = "https://spinsha.re/api/docs";
</script>
</body>
</html>
\ No newline at end of file
</html>
\ No newline at end of file
<?php
namespace App\Controller\API;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\RedirectResponse;
class APIDocsController extends AbstractController
{
/**
* @Route("/api/docs", name="api.docs.introduction")
*/
public function introduction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/gettingstarted/introduction.html.twig', $data);
}
/**
* @Route("/api/docs/usage-policy", name="api.docs.usagePolicy")
*/
public function usagePolicy(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/gettingstarted/usage-policy.html.twig', $data);
}
/**
* @Route("/api/docs/endpoints-versioning", name="api.docs.endpointsVersioning")
*/
public function endpointsVersioning(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/gettingstarted/endpoints-versioning.html.twig', $data);
}
/**
* @Route("/api/docs/authentication", name="api.docs.authentication")
*/
public function authentication(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/gettingstarted/authentication.html.twig', $data);
}
/**
* @Route("/api/docs/open/discovery", name="api.docs.open.discovery")
*/
public function openDiscovery(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/open/discovery.html.twig', $data);
}
/**
* @Route("/api/docs/open/promos", name="api.docs.open.promos")
*/
public function openPromos(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/open/promos.html.twig', $data);
}
/**
* @Route("/api/docs/open/songs", name="api.docs.open.songs")
*/
public function openSongs(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/open/songs.html.twig', $data);
}
/**
* @Route("/api/docs/open/users", name="api.docs.open.users")
*/
public function openUsers(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/open/users.html.twig', $data);
}
/**
* @Route("/api/docs/open/tournaments", name="api.docs.open.tournaments")
*/
public function openTournaments(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/open/tournaments.html.twig', $data);
}
/**
* @Route("/api/docs/connect/connect", name="api.docs.connect.connect")
*/
public function connectConnect(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/connect/connect.html.twig', $data);
}
/**
* @Route("/api/docs/connect/profile", name="api.docs.connect.profile")
*/
public function connectProfile(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/connect/profile.html.twig', $data);
}
/**
* @Route("/api/docs/connect/reviews", name="api.docs.connect.reviews")
*/
public function connectReviews(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
return $this->render('apidocs/connect/reviews.html.twig', $data);
}
}
<?php
namespace App\Controller\API\Connect;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpClient\HttpClient;
use App\Entity\User;
use App\Entity\Song;
use App\Entity\SongReview;
use App\Entity\Connection;
use App\Entity\ConnectApp;
use App\Entity\UserNotification;
class APIConnectReviewsController extends AbstractController
{
/**
* @Route("/api/connect/reviews/{songID}/get", name="api.connect.reviews.get")
*/
public function getReview(Request $request, $songID)
{
$em = $this->getDoctrine()->getManager();
$data = [];
$connectToken = $request->query->get('connectToken');
// 422 - Parameter Missing
if($connectToken == "") {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 422, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$connection = $em->getRepository(Connection::class)->findOneBy(array('connectToken' => $connectToken));
if($connection) {
// Find Song
$songToReview = $em->getRepository(Song::class)->findOneBy(array('id' => $songID));
// 404 - Song not Found
if(!$songToReview) {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 404, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$previousReview = $em->getRepository(SongReview::class)->findOneBy(array('song' => $songToReview, 'user' => $connection->getUser()));
if($previousReview) {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 200, 'data' => $previousReview->getJSON()]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
} else {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 404, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
} else {
// 403 - Not Authenticated
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 403, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
}
/**
* @Route("/api/connect/reviews/{songID}/add", name="api.connect.reviews.add")
*/
public function addReview(Request $request, $songID)
{
$em = $this->getDoctrine()->getManager();
$data = [];
$connectToken = $request->query->get('connectToken');
$reviewRecommend = $request->request->get('recommend');
$reviewComment = $request->request->get('comment');
// 422 - Parameter Missing
if($connectToken == "" || $reviewRecommend == "" || $songID == "") {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 422, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$connection = $em->getRepository(Connection::class)->findOneBy(array('connectToken' => $connectToken));
if($connection) {
// Find Song
$songToReview = $em->getRepository(Song::class)->findOneBy(array('id' => $songID));
$songUploader = $em->getRepository(User::class)->findOneBy(array('id' => $songToReview->getUploader()));
// 404 - Song not Found
if(!$songToReview) {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 404, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$previousReview = $em->getRepository(SongReview::class)->findOneBy(array('song' => $songToReview, 'user' => $connection->getUser()));
if($previousReview) {
// Update Existing Review
$previousReview->setRecommended($reviewRecommend == "true" | $reviewRecommend == "1" ? true : false);
if($reviewComment != "") { $previousReview->setComment($reviewComment); }
$previousReview->setReviewDate(new \DateTime('NOW'));
$em->persist($previousReview);
$em->flush();
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 200, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
} else {
// Create new Review
$newReview = new SongReview();
$newReview->setUser($connection->getUser());
$newReview->setSong($songToReview);
$newReview->setRecommended($reviewRecommend == "true" || $reviewRecommend == "1" ? true : false);
$newReview->setComment($reviewComment);
$newReview->setReviewDate(new \DateTime('NOW'));
$em->persist($newReview);
$em->flush();
// Add Notification
$newNotification = new UserNotification();
$newNotification->setUser($songUploader);
$newNotification->setConnectedUser($connection->getUser());
$newNotification->setConnectedSong($songToReview);
$newNotification->setNotificationType(1);
$newNotification->setNotificationData($newReview->getID());
$em->persist($newNotification);
$em->flush();
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 201, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
} else {
// 403 - Not Authenticated
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 403, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
}
}
......@@ -23,19 +23,35 @@ class APIConnectUserController extends AbstractController
public function getProfile(Request $request)
{
$em = $this->getDoctrine()->getManager();
$baseUrl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
$data = [];
$connectToken = $request->query->get('connectToken');
// TODO: Find Connection
$user = $em->getRepository(User::class)->findOneBy(array('connectToken' => $connectToken));
if($connectToken == "") {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 403, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
$connection = $em->getRepository(Connection::class)->findOneBy(array('connectToken' => $connectToken));
if($connection) {
$data['id'] = $connection->getUser()->getId();
$data['username'] = $connection->getUser()->getUsername();
$data['isVerified'] = $connection->getUser()->getIsVerified();
$data['isPatreon'] = $connection->getUser()->getIsPatreon();
if($connection->getUser()->getCoverReference()) {
$data['avatar'] = $baseUrl."/uploads/avatar/".$connection->getUser()->getCoverReference();
} else {
$data['avatar'] = $baseUrl."/assets/img/defaultAvatar.jpg";
}
if($connectToken != "" && $user) {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 200, 'data' => []]);
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 200, 'data' => $data]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
} else {
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 404, 'data' => []]);
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 403, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
......
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
......@@ -7,13 +7,13 @@
<meta name="viewport" content="width=device-width" />
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Usage Policy - SpinShare API</title>
<link rel="icon" type="image/png" href="{{ asset('assets/img/favicon.png') }}" />
<title>{% block title %}{% endblock %} ~ SpinShare API</title>
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
<link rel="stylesheet" href="{{ asset('assets/css/apidocs.css?v=' ~ date().timestamp) }}" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
......@@ -36,25 +36,25 @@
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.introduction') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.introduction' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon active">
<a href="{{ path('api.docs.usagePolicy') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.usagePolicy' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.endpointsVersioning') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.endpointsVersioning' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
Endpoints &amp; Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.authentication') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.authentication' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
......@@ -62,34 +62,35 @@
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.open.discovery') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.open.discovery' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.open.promos') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.open.promos' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.open.songs') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.open.songs' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.open.users') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.open.users' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.open.tournaments') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.open.tournaments' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
......@@ -100,55 +101,34 @@
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<a href="{{ path('api.docs.connect.connect') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.connect.connect' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
<a href="{{ path('api.docs.connect.profile') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.connect.profile' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Profile
</a>
<a href="{{ path('api.docs.connect.reviews') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.connect.reviews' %}active{% endif %}">
<span class="sidebar-icon">
<i class="mdi mdi-thumbs-up-down" aria-hidden="true"></i>
</span>
Reviews
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Usage Policy
</h1>
<p>Our Usage Policy serves as the Terms of Service of the SpinShare API. Please follow this ruleset if you are using the SpinShare API.</p>
<div class="card">
<h2 class="card-title">DO</h2>
<ul>
<li>Protect userdata.</li>
<li>Provide users with information about which data you access</li>
<li>Add a label or a backlink to SpinShare</li>
</ul>
</div>
<div class="card">
<h2 class="card-title">DON'T</h2>
<ul>
<li>Use API data for a purpose not connected to SpinShare or Spin Rhythm XD</li>
<li>Obtain passwords or other credentials</li>
<li>Use userdata for marketing or advertisements</li>
<li>Sell or license API data</li>
<li>Scrape API data (caching is excluded from this)</li>
<li>Use this API data to do anything illegal or harmful</li>
</ul>
</div>
<p>We currently don't ratelimit our open APIs. However, we still would like you to keep an eye on your API usage and cache API data whenever possible.</p>
</div>
</div>
</div>
{% block content %}{% endblock %}
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.4/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% extends 'apidocs/base.html.twig' %}
{% block title %}Connect{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content" id="introduction">
<h1 class="content-title">
Introduction
</h1>
<p>This document outlines how to connect a SpinShare userprofile with your application and how you can use this connection to perform user actions such as creating reviews or adding charts to playlists.</p>
</div>
<div class="content" id="terminology">
<h1 class="content-title">
Terminology
</h1>
<table class="table table-bordered">
<tr>
<th>User</th>
<td>A "User" is a SpinShare userprofile.</td>
</tr>
<tr>
<th>ConnectApp</th>
<td>A "ConnectApp" is your application, bot or whatever.</td>
</tr>
<tr>
<th>Connection</th>
<td>A "Connection" is a relationship between a ConnectApp and a User. A User can always revoke access to a ConnectApp by going into the usersettings on SpinShare.</td>
</tr>
<tr>
<th>ConnectCode</th>
<td>A "ConnectCode" is a 6 character code that is used for establishing the connection between a User and a ConnectApp. This code will change every 15 seconds as long as the user is on the SpinShare connect page.</td>
</tr>
<tr>
<th>ConnectToken</th>
<td>A "ConnectToken" is a series of characters used along with your ApiKey to verify you are allowed to perform certain actions and ping certain api endpoints. This token is valid until the user revokes access.</td>
</tr>
</table>
</div>
<div class="content" id="creating-a-connection">
<h1 class="content-title">
Creating a Connection
</h1>
<div class="alert alert-secondary" role="alert">
<h4 class="alert-heading">Attention</h4>
API access is handled privately as of now. Please refer to the developers on the SpinShare Discord to receive API access.
</div>
<p>The SpinShare API does not consume login credentials for protected API endpoints but rather a simple apikey/token solution. Users have to connect to a ConnectApp once by inputting a 6 character long ConnectCode that changes every 15 seconds.</p>
<strong>Steps to establish a Connection</strong>
<p>Prompt the user to input their connect code. The code can be found on within the profile settings under the "Connect" tab.</p>
<p>Put the ConnectCode through the <a href="#getting-a-token">Getting a Token</a> API endpoint along with your ApiKey to generate a ConnectToken.</p>
<p>Save the ConnectToken locally and use it for protected API endpoints. If you need to verify if your ConnectToken is still valid, you can use the <a href="#validating-a-token">Validating a Token</a> API endpoint.</p>
</div>
<div class="content">
<div class="card" id="getting-a-token">
<h2 class="card-title">Getting a Token</h2>
<p>Returns a ConnectToken.</p>
<table class="table table-bordered">
<tr>
<th>Method</th>
<td>GET</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/connect/getToken</td>
</tr>
<tr>
<th>Query Parameters</th>
<td>(string) connectCode<br />
(string) connectAppApiKey</td>
</tr>
</table>
<br />
<br />
<strong>Responses</strong>
<br /><br />
<table class="table table-bordered">
<thead>
<tr>
<th>Code</th>
<th>Explaination</th>
</tr>
</thead>
<tbody>
<tr>
<td>200</td>
<td>OK. The body contains the ConnectToken</td>
</tr>
<tr>
<td>400</td>
<td>Parameters are missing. The body contains the needed parameters and their value</td>
</tr>
<tr>
<td>403</td>
<td>The ConnectCode or ApiKey was wrong.</td>
</tr>
</tbody>
</table>
</div>
<div class="card" id="validating-a-token">
<h2 class="card-title">Validating a Token</h2>
<p>Checks if a ConnectToken is still valid.</p>
<table class="table table-bordered">
<tr>
<th>Method</th>
<td>GET</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/connect/validateToken</td>
</tr>
<tr>
<th>Query Parameters</th>
<td>(string) connectToken</td>
</tr>
</table>
<br /><br />
<strong>Responses</strong>
<br /><br />
<table class="table table-bordered">
<thead>
<tr>
<th>Code</th>
<th>Explaination</th>
</tr>
</thead>
<tbody>
<tr>
<td>200</td>
<td>The ConnectToken is valid.</td>
</tr>
<tr>
<td>403</td>
<td>The ConnectToken is not valid.</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="content">
<div class="on-this-page-nav">
<div class="title">On this page</div>
<a href="#introduction">Introduction</a>
<a href="#terminology">Terminology</a>
<a href="#creating-a-connection">Creating a Connection</a>
<a href="#getting-a-token">Getting a Token</a>
<a href="#validating-a-token">Validating a Token</a>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends 'apidocs/base.html.twig' %}
{% block title %}Profile{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Profile
</h1>
<div class="card" id="overview">
<h2 class="card-title">Overview</h2>
<p>Returns a general overview of information about the connected user.</p>
<table class="table table-bordered">
<tr>
<th>Method</th>
<td>GET</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/connect/profile</td>
</tr>
<tr>
<th>Query Parameters</th>
<td>(string) connectToken</td>
</tr>
</table>
<br /><br />
<strong>Output Body (Success)</strong>
<pre class="code">
{
"version":1,
"status":200,
"data":{
"id":1,
"username":"taw",
"isVerified":true,
"isPatreon":true,
"avatar":"https:\/\/spinsha.re\/uploads\/avatar\/5f4147b117c7b.png"
}
}
</pre>
<br /><br />
<strong>Responses</strong>
<br /><br />
<table class="table table-bordered">
<thead>
<tr>
<th>Code</th>
<th>Explaination</th>
</tr>
</thead>
<tbody>
<tr>
<td>200</td>
<td>The profile exists.</td>
</tr>
<tr>
<td>422</td>
<td>Some parameters were missing.</td>
</tr>
<tr>
<td>403</td>
<td>Your connectToken is missing or wrong.</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="col-lg-3">
<div class="content">
<div class="on-this-page-nav">
<div class="title">On this page</div>
<a href="#overview">Overview</a>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
{% extends 'apidocs/base.html.twig' %}
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Discovery - SpinShare API</title>
{% block title %}Reviews{% endblock %}
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content" id="introduction">
<h1 class="content-title">
Introduction
</h1>
<p>This document outlines how to connect a SpinShare userprofile with your application and how you can use this connection to perform user actions such as creating reviews or adding charts to playlists.</p>
</div>
<div class="content" id="terminology">
<h1 class="content-title">
Terminology
</h1>
<table class="table table-bordered">
<tr>
<th>User</th>
<td>A "User" is a SpinShare userprofile.</td>
</tr>
<tr>
<th>ConnectApp</th>
<td>A "ConnectApp" is your application, bot or whatever.</td>
</tr>
<tr>
<th>Connection</th>
<td>A "Connection" is a relationship between a ConnectApp and a User. A User can always revoke access to a ConnectApp by going into the usersettings on SpinShare.</td>
</tr>
<tr>
<th>ConnectCode</th>
<td>A "ConnectCode" is a 6 character code that is used for establishing the connection between a User and a ConnectApp. This code will change every 15 seconds as long as the user is on the SpinShare connect page.</td>
</tr>
<tr>
<th>ConnectToken</th>
<td>A "ConnectToken" is a series of characters used along with your ApiKey to verify you are allowed to perform certain actions and ping certain api endpoints. This token is valid until the user revokes access.</td>
</tr>
</table>
</div>
<div class="content" id="creating-a-connection">
<div class="content">
<h1 class="content-title">
Creating a Connection
Reviews
</h1>
<div class="alert alert-secondary" role="alert">
<h4 class="alert-heading">Attention</h4>
API access is handled privately as of now. Please refer to the developers on the SpinShare Discord to receive API access.
</div>
<p>The SpinShare API does not consume login credentials for protected API endpoints but rather a simple apikey/token solution. Users have to connect to a ConnectApp once by inputting a 6 character long ConnectCode that changes every 15 seconds.</p>
<strong>Steps to establish a Connection</strong>
<p>Prompt the user to input their connect code. The code can be found on within the profile settings under the "Connect" tab.</p>
<p>Put the ConnectCode through the <a href="#getting-a-token">Getting a Token</a> API endpoint along with your ApiKey to generate a ConnectToken.</p>
<p>Save the ConnectToken locally and use it for protected API endpoints. If you need to verify if your ConnectToken is still valid, you can use the <a href="#validating-a-token">Validating a Token</a> API endpoint.</p>
</div>
<div class="content">
<div class="card" id="getting-a-token">
<h2 class="card-title">Getting a Token</h2>
<p>Returns a ConnectToken.</p>
<div class="card" id="get">
<h2 class="card-title">Get Review</h2>
<p>Gets the users review of a song.</p>
<table class="table table-bordered">
<tr>
......@@ -178,18 +21,70 @@
</tr>
<tr>
<th>Endpoint</th>
<td>/connect/getToken</td>
<td>/connect/reviews/<code class="code">songID</code>/get</td>
</tr>
<tr>
<th>Query Parameters</th>
<td>(string) connectCode<br />
(string) connectAppApiKey</td>
<td>(string) connectToken</td>
</tr>
</table>
<br />
<br /><br />
<br />
<strong>Output Body (Success)</strong>
<pre class="code">
{
"version":1,
"status":200,
"data":{
"id":23,
"song":{
"id":138,
"title":"Tendril",
"subtitle":"",
"artist":"Collin McLoughlin \u0026 Au5",
"charter":"Halflite",
"uploader":1,
"fileReference":"spinshare_5ea59e04df800",
"tags":[
"test",
"awesome",
"nice"
],
"views":536,
"downloads":2,
"isExplicit":false,
"isTournament":false,
"hasEasyDifficulty":false,
"hasNormalDifficulty":false,
"hasHardDifficulty":false,
"hasExtremeDifficulty":false,
"hasXDDifficulty":true,
"uploadDate":{
"date":"2020-04-26 16:43:16.000000",
"timezone_type":3,
"timezone":"Europe\/Berlin"
},
"description":"I\u0027m very proud of this chart!"
},
"user":{
"id":1,
"username":"taw",
"coverReference":"5f4147b117c7b.png",
"isVerified":true,
"isPatreon":true
},
"recommended":true,
"comment":"Nice1337",
"reviewDate":{
"date":"2020-09-09 19:25:29.000000",
"timezone_type":3,
"timezone":"Europe\/Berlin"
}
}
}
</pre>
<br /><br />
<strong>Responses</strong>
<br /><br />
......@@ -203,37 +98,45 @@
<tbody>
<tr>
<td>200</td>
<td>OK. The body contains the ConnectToken</td>
<td>The review exists.</td>
</tr>
<tr>
<td>400</td>
<td>Parameters are missing. The body contains the needed parameters and their value</td>
<td>422</td>
<td>Some parameters were missing.</td>
</tr>
<tr>
<td>403</td>
<td>The ConnectCode or ApiKey was wrong.</td>
<td>Your connectToken is missing or wrong.</td>
</tr>
<tr>
<td>404</td>
<td>This song does not exist or there is no review from this user.</td>
</tr>
</tbody>
</table>
</div>
<div class="card" id="validating-a-token">
<h2 class="card-title">Validating a Token</h2>
<p>Checks if a ConnectToken is still valid.</p>
<div class="card" id="add">
<h2 class="card-title">Add Review</h2>
<p>Adds or updates a review of a song.</p>
<table class="table table-bordered">
<tr>
<th>Method</th>
<td>GET</td>
<td>POST</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/connect/validateToken</td>
<td>/connect/reviews/<code class="code">songID</code>/add</td>
</tr>
<tr>
<th>Query Parameters</th>
<td>(string) connectCode<br />
(string) connectAppApiKey</td>
<td>(string) connectToken</td>
</tr>
<tr>
<th>POST Form-Data</th>
<td>(int) recommend<br />
(string) comment</td>
</tr>
</table>
......@@ -251,11 +154,23 @@
<tbody>
<tr>
<td>200</td>
<td>The ConnectToken is valid.</td>
<td>The review was posted successfully.</td>
</tr>
<tr>
<td>201</td>
<td>The review was updated successfully.</td>
</tr>
<tr>
<td>422</td>
<td>Some parameters were missing.</td>
</tr>
<tr>
<td>403</td>
<td>The ConnectToken is not valid.</td>
<td>Your connectToken is missing or wrong.</td>
</tr>
<tr>
<td>404</td>
<td>This song does not exist.</td>
</tr>
</tbody>
</table>
......@@ -266,19 +181,10 @@
<div class="content">
<div class="on-this-page-nav">
<div class="title">On this page</div>
<a href="#introduction">Introduction</a>
<a href="#terminology">Terminology</a>
<a href="#creating-a-connection">Creating a Connection</a>
<a href="#getting-a-token">Getting a Token</a>
<a href="#validating-a-token">Validating a Token</a>
</div>
<a href="#get">Get Review</a>
<a href="#add">Add Review</a>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% endblock %}
\ No newline at end of file
{% extends 'apidocs/base.html.twig' %}
{% block title %}Authentication{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Authentication
</h1>
<p>Open APIs don't require any type of authentication, these APIs are read-only and only give you publicly accessible data.
If you need to modify content and/or want more detailled data (as well as user-private data), you need to use our Connect
Authentication system. More information about how to register an app and authenticate it can be found on
the <a href="{{ path('api.docs.connect.connect') }}">Connect</a> page.</p>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends 'apidocs/base.html.twig' %}
{% block title %}Endpoints &amp; Versioning{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Endpoints & Versioning
</h1>
<p>Every API-Endpoint is prefixed with <code class="code">https://spinsha.re/api/</code>. Additionally, every API-call reports back the API-version in form of the <code class="code">version</code> property. If you want to ping the API (to check if it's online), you can run the Ping API-call.</p>
<div class="card" id="detail">
<h2 class="card-title">Ping</h2>
<p>Pong's back.</p>
<table class="table table-bordered">
<tr>
<th>Method</th>
<td>GET</td>
</tr>
<tr>
<th>Endpoint</th>
<td>/ping</td>
</tr>
</table>
<br /><br />
<strong>Output Body</strong>
<pre class="code">
{
"version":1,
"status":200,
"pong":true
}
</pre>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends 'apidocs/base.html.twig' %}
{% block title %}Introduction{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Introduction
</h1>
<p>Welcome to the SpinShare API Documentation! These pages focus on all the data you can access from SpinSha.re to make cool stuff. Whether you're working on a Twitch bot, a mod for the game or anything else helping, we want you to be able to use our platform to make your projects even better!<br /><br />So what are we waiting for? Let's create something awesome together!</p>
</div>
<div class="content">
<h1 class="content-title">
Support
</h1>
<p>If you need any help implementing the SpinShare API, feel free to ask us anything in the <code class="code">#development</code> channel on our <a href="https://spinsha.re/discord" target="_blank">Discord Server</a>.</p>
</div>
<div class="content">
<h1 class="content-title">
Changelog
</h1>
<div class="alert alert-primary" role="alert">
<h4 class="alert-heading">Last Update</h4>
This documentation was last updated on 09/09/2020 at 19:50 CEST
</div>
<div class="card">
<h2 class="card-title">09/09/2020</h2>
<ul>
<li>Removed Charts, Reviews and SpinPlays from the UserDetail endpoint</li>
<li>Renamed the UserDetail endpoint to UserOverview</li>
<li>Added an endpoint for UserCharts, UserReviews and UserSpinPlays</li>
<li>Added song reference to the UserReviews endpoint</li>
<li>Added counts of charts, reviews and spinplays to the UserOverview endpoint</li>
<li>Ported the documentation to the main codebase</li>
<li>Added a deprecation warning to the PopularSongs endpoint</li>
<li>Added ConnectReview endpoint documentation</li>
<li>Added ConnectProfile endpoint documentation</li>
</ul>
</div>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
{% extends 'apidocs/base.html.twig' %}
{% block title %}Usage Policy{% endblock %}
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
<h1 class="content-title">
Usage Policy
</h1>
<p>Our Usage Policy serves as the Terms of Service of the SpinShare API. Please follow this ruleset if you are using the SpinShare API.</p>
<div class="card">
<h2 class="card-title">DO</h2>
<ul>
<li>Protect userdata.</li>
<li>Provide users with information about which data you access</li>
<li>Add a label or a backlink to SpinShare</li>
</ul>
</div>
<div class="card">
<h2 class="card-title">DON'T</h2>
<ul>
<li>Use API data for a purpose not connected to SpinShare or Spin Rhythm XD</li>
<li>Obtain passwords or other credentials</li>
<li>Use userdata for marketing or advertisements</li>
<li>Sell or license API data</li>
<li>Scrape API data (caching is excluded from this)</li>
<li>Use this API data to do anything illegal or harmful</li>
</ul>
</div>
<p>We currently don't ratelimit our open APIs. However, we still would like you to keep an eye on your API usage and cache API data whenever possible.</p>
</div>
</div>
</div>
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
{% extends 'apidocs/base.html.twig' %}
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Discovery - SpinShare API</title>
{% block title %}Discovery{% endblock %}
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
......@@ -337,7 +229,7 @@
</div>
<div class="card" id="popular">
<h2 class="card-title">Popular Songs</h2>
<h2 class="card-title">Popular Songs <span class="badge badge-secondary">deprecated</span></h2>
<p>Returns the 12 most popular songs of all time. Use <code class="code">offset</code> for pagination.</p>
<table class="table table-bordered">
......@@ -351,7 +243,12 @@
</tr>
</table>
<br /><br />
<br />
<div class="alert alert-secondary" role="alert">
<h4 class="alert-heading">Deprecated</h4>
This API-Endpoint will soon be removed and shouldn't been used anymore.
</div>
<br />
<strong>Output Body (Success)</strong>
<pre class="code">
......@@ -399,15 +296,9 @@
<a href="#searchAll">Search All</a>
<a href="#new">New Songs</a>
<a href="#hot">Hot Songs</a>
<a href="#popular">Popular Songs</a>
<a href="#popular">Popular Songs <span class="badge badge-secondary">Deprecated</span></a>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
{% extends 'apidocs/base.html.twig' %}
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Promos - SpinShare API</title>
{% block title %}Promos{% endblock %}
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
......@@ -189,10 +81,4 @@
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
{% extends 'apidocs/base.html.twig' %}
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Songs - SpinShare API</title>
{% block title %}Songs{% endblock %}
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
......@@ -356,10 +248,4 @@
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
{% extends 'apidocs/base.html.twig' %}
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Tournaments - SpinShare API</title>
{% block title %}Tournaments{% endblock %}
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
......@@ -199,10 +91,4 @@
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% endblock %}
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" name="viewport" />
<meta name="viewport" content="width=device-width" />
{% extends 'apidocs/base.html.twig' %}
<!-- Meta -->
<link rel="icon" href="https://spinsha.re/assets/img/favicon.png" />
<title>Users - SpinShare API</title>
{% block title %}Users{% endblock %}
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="css/style.css" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="index.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-hand-peace-variant" aria-hidden="true"></i>
</span>
Introduction
</a>
<a href="usage-policy.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-police-badge" aria-hidden="true"></i>
</span>
Usage Policy
</a>
<a href="endpoints-versioning.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-api" aria-hidden="true"></i>
</span>
Endpoints & Versioning
</a>
<a href="authentication.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-shield-account" aria-hidden="true"></i>
</span>
Authentication
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Open APIs</h5>
<div class="sidebar-divider"></div>
<a href="open-discovery.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-magnify" aria-hidden="true"></i>
</span>
Discovery
</a>
<a href="open-promos.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-cursor-default-click" aria-hidden="true"></i>
</span>
Promos
</a>
<a href="open-songs.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-music-circle" aria-hidden="true"></i>
</span>
Songs
</a>
<a href="open-users.htm" class="sidebar-link sidebar-link-with-icon active">
<span class="sidebar-icon">
<i class="mdi mdi-account-circle" aria-hidden="true"></i>
</span>
Users
</a>
<a href="open-tournaments.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-boxing-glove" aria-hidden="true"></i>
</span>
Tournaments
</a>
</div>
<div class="sidebar-group">
<h5 class="sidebar-title">Connect APIs</h5>
<div class="sidebar-divider"></div>
<a href="connect-connect.htm" class="sidebar-link sidebar-link-with-icon">
<span class="sidebar-icon">
<i class="mdi mdi-toy-brick" aria-hidden="true"></i>
</span>
Connect
</a>
</div>
</div>
<div class="content-wrapper">
<div class="container-fluid">
{% block content %}
<div class="row justify-content-center">
<div class="col-lg-7">
<div class="content">
......@@ -152,7 +44,7 @@
"cards":[
{
"id":1,
"icon":"http:\/\/localhost\/www\/spinshare\/server\/public\/uploads\/card\/card_b4bcc0b27340a10b012a1ba8a6fd04b0.png",
"icon":"http:\/\/spinsha.re\/uploads\/card\/card_b4bcc0b27340a10b012a1ba8a6fd04b0.png",
"title":"SSSO Spring 2020 Player",
"description":"This card was given out to every player of the Spring 2020 SpinShare Speen Open tournament."
},
......@@ -386,10 +278,4 @@
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/js/halfmoon.min.js"></script>
</body>
</html>
\ No newline at end of file
{% endblock %}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment