Browse Source

done away with tune variants lol

was talking to a friend, and she made the good point that a variation upon a tune creates a new tune

oh, also started on user accounts lol
master
Cerys 4 weeks ago
parent
commit
202641b039
  1. 10
      App/Enumerators/SessionElement.php
  2. 5
      Localisation/en-GB.yaml
  3. 10
      Pages/login.php
  4. 26
      Pages/profile.php
  5. 9
      Pages/tune/uuid.php
  6. 15
      Public/API/V1/GetABCFile.php
  7. 45
      Public/FormHandling/Login.php
  8. 12
      Routing/Router.php
  9. 6
      Templates/Bases/StandardWebPage.html.twig
  10. 25
      Templates/Pages/login.html.twig
  11. 48
      Templates/Pages/profile.html.twig
  12. 89
      Templates/Pages/tune/uuid.html.twig

10
App/Enumerators/SessionElement.php

@ -0,0 +1,10 @@
<?php
namespace App\Enumerators;
enum SessionElement: string
{
case IS_LOGGED_IN = "IS_LOGGED_IN";
case USER_ID = "USER_ID";
case USERNAME = "USERNAME";
}

5
Localisation/en-GB.yaml

@ -101,6 +101,7 @@ Number of Parts: Number of Parts
##################################################
# P
##################################################
Password: Password
@ -120,6 +121,7 @@ Number of Parts: Number of Parts
# S
##################################################
Suggest another: Suggest another
Summary: Summary
@ -133,6 +135,8 @@ Time Signature: Time Signature
##################################################
# U
##################################################
User ID: User ID
Username: Username
@ -159,6 +163,7 @@ Variants of: Variants of
##################################################
# Y
##################################################
Your Profile: Your Profile

10
Pages/login.php

@ -0,0 +1,10 @@
<?php
use App\Wrappers\TwigWrapper;
require_once __DIR__ . "/../vendor/autoload.php";
TwigWrapper::RenderTwig(
target: "Pages/login.html.twig",
arguments: [],
);

26
Pages/profile.php

@ -0,0 +1,26 @@
<?php
use App\Enumerators\SessionElement;
use App\Wrappers\DatabaseInteractions;
use App\Wrappers\TwigWrapper;
require_once __DIR__ . "/../vendor/autoload.php";
$db = new DatabaseInteractions();
$yourTunes = $db->RunSelect(
queryBuilder: \App\Wrappers\SQLQueryBuilderWrapper::SELECT(
table: 'Tunes'
)
->where(cond: 'T.CreatedBy LIKE :__user_id__')
->bindValue(name: '__user_id__', value: $_SESSION[SessionElement::USER_ID->value])
);
TwigWrapper::RenderTwig(
target: "Pages/profile.html.twig",
arguments: [
"YourTunes" => $yourTunes,
"YourDances" => [],
],
);

9
Pages/tune/uuid.php

@ -15,14 +15,6 @@ $tuneDetails = $db->RunOneSelect(
),
);
$variants = $db->RunSelect(
queryBuilder: SQLQueryBuilderWrapper::SELECT(
table: 'TuneVariants',
)
->where(cond: 'T.TuneID=:__tune_id__')
->bindValue(name: '__tune_id__', value: $_GET["tune-id"])
);
$dances = $db->RunSelect(
queryBuilder: SQLQueryBuilderWrapper::SELECT(
table: 'Dances',
@ -73,7 +65,6 @@ TwigWrapper::RenderTwig(
target: "Pages/tune/uuid.html.twig",
arguments: [
"TuneDetails"=>$tuneDetails,
"TuneVariants"=>$variants,
"Dances"=>$dances,
]
);

15
Public/API/V1/GetABCFile.php

@ -14,24 +14,23 @@ $db = new DatabaseInteractions();
$variantDetails = $db->RunOneSelect(
queryBuilder: SQLQueryBuilderWrapper::SELECT_ONE(
table: 'TuneVariants',
table: 'Tunes',
id: $targetTuneVariantID
)
->cols([
'T.ID AS TuneVariantID',
'T.TuneID AS TuneID',
'T.ID AS TuneID',
"CONCAT('[', GROUP_CONCAT(
CONCAT(
'{\"TimeSignature\":', JSON_QUOTE(T_TVP.TimeSignature), ',',
'\"KeySignature\":', JSON_QUOTE(T_TVP.KeySignature), ',',
'\"ABCNotation\":', JSON_QUOTE(T_TVP.ABCNotation), '}'
'{\"TimeSignature\":', JSON_QUOTE(T_TP.TimeSignature), ',',
'\"KeySignature\":', JSON_QUOTE(T_TP.KeySignature), ',',
'\"ABCNotation\":', JSON_QUOTE(T_TP.ABCNotation), '}'
)
), ']') AS Parts"
])
->join(
join: 'INNER',
spec: 'TuneVariantParts AS T_TVP',
cond: 'T.ID = T_TVP.TuneVariantID'
spec: 'TuneParts AS T_TP',
cond: 'T.ID = T_TP.TuneID'
)
->groupBy(spec: [
'T.ID',

45
Public/FormHandling/Login.php

@ -0,0 +1,45 @@
<?php
use App\Enumerators\SessionElement;
use App\Wrappers\DatabaseInteractions;
use App\Wrappers\SQLQueryBuilderWrapper;
require_once __DIR__ . "/../../vendor/autoload.php";
$username = $_POST['Username'];
$password = $_POST['Password'];
$sha512Hash = hash(algo: 'sha512', data: $password, binary: false);
$hashedPassword = password_hash(password: $sha512Hash, algo: PASSWORD_BCRYPT);
$db = new DatabaseInteractions();
$result = $db->RunSelect(
queryBuilder: SQLQueryBuilderWrapper::SELECT(
table: 'Users'
)
->where(cond: 'T.Username LIKE :__username__')
->bindValue(name: '__username__', value: $username)
->limit(limit: 1)
);
if(sizeof($result) != 1)
{
echo "invalid user";
die();
}
$result = $result[0];
if (!password_verify($sha512Hash, $result['PasswordHash']))
{
echo "invalid password";
die();
}
$_SESSION[SessionElement::IS_LOGGED_IN->value] = true;
$_SESSION[SessionElement::USER_ID->value] = $result['ID'];
$_SESSION[SessionElement::USERNAME->value] = $result['Username'];
header("Location: /");

12
Routing/Router.php

@ -15,13 +15,23 @@ $requestElements = explode("/", trim($requestUri, "/"));
switch($requestElements[0])
{
case "favicon.ico":
case "API":
case "Static":
case "API":
case "FormHandling":
default:
return false;
case "":
require_once __DIR__ . '/../Pages/index.php';
return true;
case "login":
require_once __DIR__ . '/../Pages/login.php';
return true;
case "logout":
require_once __DIR__ . '/../Pages/logout.php';
return true;
case "profile":
require_once __DIR__ . '/../Pages/profile.php';
return true;
case "tune":
$_GET['tune-id'] = $requestElements[1];
if(sizeof($requestElements) == 2)

6
Templates/Bases/StandardWebPage.html.twig

@ -31,7 +31,11 @@
<li>
<input type="text" placeholder="Search for tunes...">
</li>
<li style="float:right"><a class="active" href="#about">About</a></li>
{% if _SESSION_.IS_LOGGED_IN %}
<li style="float:right"><a class="active" href="/profile">My Account</a></li>
{% else %}
<li style="float:right"><a class="active" href="/login">Login</a></li>
{% endif %}
</ul>
</nav>
<main>

25
Templates/Pages/login.html.twig

@ -0,0 +1,25 @@
{% extends "/Bases/StandardWebPage.html.twig" %}
{% block content %}
<div class="InnerContent">
<h1>Ceilidh Kit Login</h1>
<form
action="/FormHandling/Login.php"
method="POST"
>
<label for="Username">{{ "Username"|translate }}</label>
<br>
<input id="Username" name="Username" type="text">
<br>
<label for="Password">{{ "Password"|translate }}</label>
<br>
<input id="Password" name="Password" type="password">
<br>
<input type="submit">
</form>
</div>
{% endblock %}

48
Templates/Pages/profile.html.twig

@ -0,0 +1,48 @@
{% extends "/Bases/StandardWebPage.html.twig" %}
{% block content %}
<div class="InnerContent">
<h1>{{ "Your Profile"|translate }}</h1>
<div class="DLContainer">
<h2>{{ "Summary"|translate }}</h2>
<dl>
<dt>{{ "User ID"|translate }}</dt>
<dd>{{ _SESSION_.USER_ID }}</dd>
<dt>{{ "Username"|translate }}</dt>
<dd>{{ _SESSION_.USERNAME }}</dd>
</dl>
</div>
<h2>{{ "Your Tunes"|translate }}</h2>
<table>
<thead>
<tr>
<th>{{ "Title"|translate }}</th>
<th>{{ "Created At"|translate }}</th>
<th>{{ "Copyright"|translate }}</th>
</tr>
</thead>
<tbody>
{% for tuneDetails in YourTunes %}
<tr>
<td><a href="/tune/{{ tuneDetails.ID }}">{{ tuneDetails.Title }}</a></td>
<td>{{ tuneDetails.CreatedAt }}</td>
<td>{{ tuneDetails.Copyright }}</td>
</tr>
{% endfor %}
</tbody>
</table>
<h2>{{ "Your Dances"|translate }}</h2>
<table>
<thead>
<tr>
<th>{{ "Title"|translate }}</th>
<th>{{ "Created At"|translate }}</th>
</tr>
</thead>
</table>
</div>
{% endblock %}

89
Templates/Pages/tune/uuid.html.twig

@ -8,57 +8,42 @@
<div class="InnerContent">
<h1>
{{ "Variants of"|translate }}
"{{ TuneDetails.Title }}"
<span>
<sup>
<a href="/tune/{{ TuneDetails.ID }}/suggest-variant">
{{ "Suggest another"|translate }}
</a>
</sup>
</span>
</h1>
{% for x in TuneVariants %}
<div>
<button class="accordion">{{ "Variant"|translate }} {{ loop.index }}</button>
<div class="panel">
<div class="container">
<div class="left">
<div class="DLContainer">
<dl>
<dt>{{ "Time Signature"|translate }}</dt>
<dd>{{ x.TimeSignature }}</dd>
<dt>{{ "Key Signature"|translate }}</dt>
<dd>{{ x.KeySignature }}</dd>
<dt>{{ "Copyright"|translate }}</dt>
<dd>{{ TuneDetails.Copyright }}</dd>
<dt>{{ "Number of Parts"|translate }}</dt>
<dd>{{ TuneDetails.Parts|json_encode }}</dd>
</dl>
</div>
</div>
<div class="center">
<div id="NotationContainer--{{ x.ID }}"></div>
<div>
<h2>{{ "ABC Notation"|translate }}</h2>
<pre id="RawABCReadout--{{ x.ID }}">
</pre>
</div>
</div>
<div class="right">
<h2>{{ "Audio"|translate }}</h2>
<div id="MIDI--{{ x.ID }}"></div>
</div>
<h1>{{ TuneDetails.Title }}</h1>
<div>
<div class="container">
<div class="left">
<div class="DLContainer">
<dl>
<dt>{{ "Time Signature"|translate }}</dt>
<dd>{{ TuneDetails.TimeSignature }}</dd>
<dt>{{ "Key Signature"|translate }}</dt>
<dd>{{ TuneDetails.KeySignature }}</dd>
<dt>{{ "Copyright"|translate }}</dt>
<dd>{{ TuneDetails.Copyright }}</dd>
<dt>{{ "Number of Parts"|translate }}</dt>
<dd>{{ TuneDetails.Parts|json_encode }}</dd>
</dl>
</div>
</div>
<div class="center">
<div id="NotationContainer--{{ TuneDetails.ID }}"></div>
<div>
<h2>{{ "ABC Notation"|translate }}</h2>
<pre id="RawABCReadout--{{ TuneDetails.ID }}">
</pre>
</div>
</div>
<div class="right">
<h2>{{ "Audio"|translate }}</h2>
<div id="MIDI--{{ TuneDetails.ID }}"></div>
</div>
</div>
{% endfor %}
</div>
</div>
<div class="InnerContent">
@ -75,7 +60,7 @@
</h1>
{% for x in Dances %}
<div>
<button class="accordion">{{ x.Title }}</button>
<button class="accordion">{{ TuneDetails.Title }}</button>
<div class="panel">
<h2>Steps</h2>
<table>
@ -86,7 +71,7 @@
</tr>
</thead>
<tbody>
{% for step in x.Steps %}
{% for step in TuneDetails.Steps %}
<tr>
<th>{{ step.BarCountAtStart }}</th>
<th>{{ step.BarCountAtEnd }}</th>
@ -182,9 +167,7 @@
}
{% for x in TuneVariants %}
RenderABC('{{ x.ID }}');
{% endfor %}
RenderABC('{{ TuneDetails.ID }}');
});
</script>
{% endblock %}
Loading…
Cancel
Save