diff --git a/_config.php b/_config.php
index 4fdac95..0e0fde4 100644
--- a/_config.php
+++ b/_config.php
@@ -6,6 +6,7 @@
require __DIR__ . '/vendor/autoload.php';
require __DIR__ . '/util/Database.php';
require __DIR__ . '/util/Discord.php';
+ require __DIR__ . '/util/Admin.php';
use Twig\Loader\FilesystemLoader;
diff --git a/css/map.min.css b/css/map.min.css
index fe66c6d..f5371ec 100644
--- a/css/map.min.css
+++ b/css/map.min.css
@@ -1 +1 @@
-*{padding:0;margin:0;box-sizing:border-box}#map{height:100vh}#homeLink{position:absolute;bottom:10px;left:10px;padding:5px 10px;z-index:400;background-color:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:5px;text-decoration:none;color:#000}img.leaflet-tile{image-rendering:pixelated}.leaflet-control{color:#333}.leaflet-control-mouseposition{background:rgba(255,255,255,.8);margin:0 !important;padding:6px;width:calc(100% - 12px);text-align:end;border-top-left-radius:5px}.leaflet-marker-icon{transition:300ms}/*# sourceMappingURL=map.min.css.map */
+*{padding:0;margin:0;box-sizing:border-box}#map{height:100vh}#homeLink{position:absolute;bottom:10px;left:10px;padding:5px 10px;z-index:400;background-color:#fff;background-clip:padding-box;border:2px solid rgba(0,0,0,.2);border-radius:5px;text-decoration:none;color:#000}img.leaflet-tile,img.leaflet-marker-icon{image-rendering:pixelated}.leaflet-control{color:#333}.leaflet-control-mouseposition{background:rgba(255,255,255,.8);margin:0 !important;padding:6px;width:100%;text-align:end;border-top-left-radius:5px}.leaflet-marker-icon{transition:300ms}/*# sourceMappingURL=map.min.css.map */
diff --git a/css/map.min.css.map b/css/map.min.css.map
index a7c2682..23db633 100644
--- a/css/map.min.css.map
+++ b/css/map.min.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["src/map.scss"],"names":[],"mappings":"AAAA,EACE,UACA,SAEA,sBAKF,kBAEA,UACE,kBACA,YACA,UACA,iBACA,YAEA,sBACA,4BAEA,gCACA,kBAEA,qBACA,WAGF,iBACE,0BAGF,iBACE,WAGF,+BACE,gCAEA,oBACA,YAEA,wBAEA,eAEA,2BAGF,qBACE","file":"map.min.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["src/map.scss"],"names":[],"mappings":"AAAA,EACE,UACA,SAEA,sBAKF,kBAEA,UACE,kBACA,YACA,UACA,iBACA,YAEA,sBACA,4BAEA,gCACA,kBAEA,qBACA,WAGF,yCACE,0BAGF,iBACE,WAGF,+BACE,gCAEA,oBACA,YAEA,WAEA,eAEA,2BAGF,qBACE","file":"map.min.css"}
\ No newline at end of file
diff --git a/css/src/map.scss b/css/src/map.scss
index b006199..b5807b6 100644
--- a/css/src/map.scss
+++ b/css/src/map.scss
@@ -26,7 +26,7 @@
color: #000;
}
-img.leaflet-tile {
+img.leaflet-tile, img.leaflet-marker-icon {
image-rendering: pixelated;
}
@@ -40,7 +40,7 @@ img.leaflet-tile {
margin: 0 !important;
padding: 6px;
- width: calc(100% - 2 * 6px);
+ width: 100%;
text-align: end;
diff --git a/css/src/style.scss b/css/src/style.scss
index 2517025..3a80b02 100644
--- a/css/src/style.scss
+++ b/css/src/style.scss
@@ -3,10 +3,12 @@
@use "colors/dark" as dark;
* {
- -webkit-tap-highlight-color: transparent; // fuck you
+ -webkit-tap-highlight-color: transparent; // fuck you (L)
}
-html, body { overflow-x: hidden;}
+html, body {
+ overflow-x: hidden;
+}
body {
margin: 0;
@@ -21,21 +23,21 @@ body {
}
main {
- transition: 0.24s;
+ transition: 0.24s;
- &.buffering {
- transform: scale(1.01);
- transition: 0.16s;
- opacity: 0.4;
- pointer-events: none;
- user-select: none;
- }
+ &.buffering {
+ transform: scale(1.01);
+ transition: 0.16s;
+ opacity: 0.4;
+ pointer-events: none;
+ user-select: none;
+ }
- &.transition {
- transform: scale(0.96);
- transition: 0.16s;
- opacity: 0;
- }
+ &.transition {
+ transform: scale(0.96);
+ transition: 0.16s;
+ opacity: 0;
+ }
}
.container {
@@ -63,96 +65,96 @@ img {
}
.cards {
- display: flex;
- flex-wrap: wrap;
- gap: 8px;
- width: 100%;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 8px;
+ width: 100%;
- @media (max-width: 600px) {
- gap: 12px;
- }
+ @media (max-width: 600px) {
+ gap: 12px;
+ }
}
.card {
- position: relative;
- display: flex;
- flex-direction: column;
- box-sizing: border-box;
- max-width: 100%;
- height: 150px;
+ position: relative;
+ display: flex;
+ flex-direction: column;
+ box-sizing: border-box;
+ max-width: 100%;
+ height: 150px;
text-decoration: none;
border-radius: 4px;
padding: 8px 12px;
cursor: pointer;
overflow: hidden;
- outline: 1px solid light.$cardNormalBorder;
+ outline: 1px solid light.$cardNormalBorder;
background: light.$cardNormalBG;
color: light.$cardNormalFG;
@media (prefers-color-scheme: dark) {
outline-color: dark.$cardNormalBorder;
background: dark.$cardNormalBG;
- color: dark.$cardNormalFG;
+ color: dark.$cardNormalFG;
}
transition: 0.24s;
&:hover {
- outline-width: 2px;
- outline-color: light.$cardActiveBorder;
- background: light.$cardActiveBG;
- color: light.$cardActiveFG;
+ outline-width: 2px;
+ outline-color: light.$cardActiveBorder;
+ background: light.$cardActiveBG;
+ color: light.$cardActiveFG;
- @media (prefers-color-scheme: dark) {
- outline-color: dark.$cardActiveBorder;
- background: dark.$cardActiveBG;
- color: dark.$cardActiveFG;
- }
-
- transition: 0.08s;
+ @media (prefers-color-scheme: dark) {
+ outline-color: dark.$cardActiveBorder;
+ background: dark.$cardActiveBG;
+ color: dark.$cardActiveFG;
+ }
- .icon {
- transition: 0.48s;
- transform: scale(1.2);
- }
+ transition: 0.08s;
+
+ .icon {
+ transition: 0.48s;
+ transform: scale(1.2);
+ }
}
- width: calc(100% / 3 - 6px);
+ width: calc(100% / 3 - 6px);
@media (max-width: 800px) {
- width: calc(50% - 4px);
- }
+ width: calc(50% - 4px);
+ }
- @media (max-width: 600px) {
- border-radius: 8px;
- width: 100%;
- }
+ @media (max-width: 600px) {
+ border-radius: 8px;
+ width: 100%;
+ }
h1 {
- margin: 0;
- font-size: 1.2em;
- font-weight: 400;
+ margin: 0;
+ font-size: 1.2em;
+ font-weight: 400;
}
.icon {
- position: absolute;
- top: 0;
- right: 0;
- height: 100%;
- aspect-ratio: 1/1;
- object-fit: cover;
+ position: absolute;
+ top: 0;
+ right: 0;
+ height: 100%;
+ aspect-ratio: 1/1;
+ object-fit: cover;
- mask-image: linear-gradient(to right, transparent, rgba(red, 0.3));
- @media (prefers-color-scheme: dark) {
- mask-image: linear-gradient(to right, transparent, rgba(red, 0.1));
- }
+ mask-image: linear-gradient(to right, transparent, rgba(red, 0.3));
+ @media (prefers-color-scheme: dark) {
+ mask-image: linear-gradient(to right, transparent, rgba(red, 0.1));
+ }
- transition: 0.64s;
+ transition: 0.64s;
}
p {
- margin: 8px 0;
+ margin: 8px 0;
}
}
@@ -169,13 +171,11 @@ a {
}
.pageHero {
- background-image:
- linear-gradient(rgba(light.$headerOverlay, 0.9),rgba(light.$headerOverlay, 0.9)), // white overlay. yeah that's a bit of an ugly hack?
- url('/img/Panorama-Lens-Blur.png');
+ background-image: linear-gradient(rgba(light.$headerOverlay, 0.9), rgba(light.$headerOverlay, 0.9)), // white overlay. yeah that's a bit of an ugly hack?
+ url('/img/Panorama-Lens-Blur.png');
@media (prefers-color-scheme: dark) {
- background-image:
- linear-gradient(rgba(dark.$headerOverlay, 0.9),rgba(dark.$headerOverlay, 0.9)),
+ background-image: linear-gradient(rgba(dark.$headerOverlay, 0.9), rgba(dark.$headerOverlay, 0.9)),
url('/img/Panorama-Lens-Blur.png');
}
@@ -211,7 +211,9 @@ a {
}
@media (prefers-color-scheme: dark) {
- img { filter: invert(1) }
+ img {
+ filter: invert(1)
+ }
}
span {
@@ -248,7 +250,7 @@ a {
display: none;
}
z-index: 10;
-
+
position: fixed;
top: 8px;
right: 8px;
@@ -258,14 +260,14 @@ a {
color: light.$btnNormalFG;
@media (prefers-color-scheme: dark) {
- background: dark.$btnNormalBG;
- color: dark.$btnNormalFG;
+ background: dark.$btnNormalBG;
+ color: dark.$btnNormalFG;
}
padding: 8px 24px;
border-radius: 32px;
-
+
font-weight: bold;
user-select: none;
@@ -302,24 +304,28 @@ a {
height: 100%;
z-index: 9;
- backdrop-filter: blur(15px);
- background: rgba(light.$navBG, 0.86);
- @media (prefers-color-scheme: dark) {
- background: rgba(dark.$navBG, 0.9);
- }
+ backdrop-filter: blur(15px);
+ background: rgba(light.$navBG, 0.86);
+ @media (prefers-color-scheme: dark) {
+ background: rgba(dark.$navBG, 0.9);
+ }
- justify-content: center;
+ justify-content: center;
flex-direction: column;
gap: 64px;
-
- &, > * { transition: 0.16s }
+
+ &, > * {
+ transition: 0.16s
+ }
&:not(.opened) {
opacity: 0;
pointer-events: none;
//&, > * { transition: 0.12s }
- > * { transform: translateX(32px); }
+ > * {
+ transform: translateX(32px);
+ }
}
}
@@ -333,7 +339,7 @@ a {
gap: 6px;
@media (max-width: 600px) {
- width: 100%;
+ width: 100%;
flex-direction: column;
}
@@ -344,7 +350,9 @@ a {
font-size: 16px;
box-sizing: border-box;
color: light.$navLinkNormalColor;
- @media (prefers-color-scheme: dark) { color: dark.$navLinkNormalColor; }
+ @media (prefers-color-scheme: dark) {
+ color: dark.$navLinkNormalColor;
+ }
@media (max-width: 600px) {
font-size: 28px;
@@ -353,7 +361,7 @@ a {
text-align: end;
&.active::before {
- content: "➤"; // i know..
+ content: "➤"; // i know..
}
}
@@ -369,7 +377,7 @@ a {
transition: 0.24s;
&.active {
- pointer-events: none;
+ pointer-events: none;
}
&:hover, &.active {
@@ -387,18 +395,18 @@ a {
}
@media (min-width: 601px) {
- &.buttonPrimary {
- background: light.$btnNormalBG;
- color: light.$btnNormalFG;
+ &.buttonPrimary {
+ background: light.$btnNormalBG;
+ color: light.$btnNormalFG;
- @media (prefers-color-scheme: dark) {
- background: dark.$btnNormalBG;
- color: dark.$btnNormalFG;
- }
+ @media (prefers-color-scheme: dark) {
+ background: dark.$btnNormalBG;
+ color: dark.$btnNormalFG;
+ }
- font-weight: 700 !important;
- }
- }
+ font-weight: 700 !important;
+ }
+ }
}
}
}
diff --git a/css/style.min.css.map b/css/style.min.css.map
index 4f8d3af..0f72c97 100644
--- a/css/style.min.css.map
+++ b/css/style.min.css.map
@@ -1 +1 @@
-{"version":3,"sourceRoot":"","sources":["src/_fonts.scss","src/style.scss","src/colors/_light.scss","src/colors/_dark.scss"],"names":[],"mappings":"CAEQ,qKAER,WACE,sDAGF,kBACE,mDACA,gBAIF,UACE,uECXF,EACC,0CAGD,4BAEA,KACE,SAEA,WCXO,KDYP,MCXO,KDaP,mCANF,KAOI,WEfK,QFgBL,MEfK,MFmBT,KACC,gBAEA,eACC,sBACA,gBACA,WACA,oBACA,iBAGD,gBACC,sBACA,gBACA,UAIF,WACE,gBAEA,WAEA,cAEA,aACA,sBAGF,MACE,2BAGF,EACE,gBACA,YAGF,IACE,eAGF,OACC,aACA,eACA,QACA,WAEA,yBAND,OAOE,UAIF,MACC,kBACA,aACA,sBACA,sBACA,eACA,aACC,qBACA,kBACA,iBACA,eACA,gBAED,0BACC,WCzEa,QD0Eb,MCvFO,KD+FP,gBAsBD,iCA5BC,mCAjBF,MAkBI,cE3Ee,QF4Ef,WE9EW,QF+EZ,ME5FM,MFiGP,YACC,kBACA,cCxFS,QDyFT,WC1FK,QD2FL,MCnGM,QD2GP,gBANC,mCAND,YAOG,cE7FO,QF8FP,WE/FG,QFgGJ,MEvGQ,SF4GT,kBACC,gBACA,qBAMF,yBA/CF,MAgDE,uBAGD,yBAnDD,MAoDG,kBACD,YAGA,SACC,SACA,gBACA,gBAGD,YACC,kBACA,MACA,QACA,YACA,iBACA,iBAEA,wEAKA,gBAJA,mCATD,YAUE,yEAMF,QACC,aAIH,EACE,MC1JO,QD4JP,mCAHF,EAII,ME5JQ,SF+JV,UACE,WAIJ,UACE,iBACE,uGASF,2BACA,sBAEA,aATA,mCALF,UAMI,iBACA,kGASF,qBACE,YAEA,aACA,mBAEA,mBACA,8BAEA,yBATF,qBAUI,wBAGF,yBACE,aACA,sBAEA,SAEA,kCACE,uBAEA,yBAHF,kCAII,oBAGF,mCACE,wDAGF,uCACE,eACA,YAIJ,4CAKE,mBACA,QALA,yBADF,4CAEI,cAMF,kDACE,kBACA,eAEA,qEACE,cACA,2BACA,yBAQZ,WAIE,WAEA,eACA,QACA,UACA,eAEA,WC3PO,QD4PP,MCxPY,KD+PZ,iBAEA,mBAEA,iBACA,iBAEA,eAzBA,yBADF,WAEI,cAYF,mCAdF,WAeG,WE/PM,QFgQN,ME5PW,MFyQd,SACE,WAEA,qBACA,uBAEA,WC3QM,QD6QN,mCARF,SASI,aE7QQ,QF8QR,WE/QI,SFkRN,oBACE,kBAEA,aACA,eAEA,mBACA,8BAEA,yBATF,oBAUI,eACA,MACA,OACA,WACA,YACA,UAEF,2BACC,iCAKA,uBACC,sBACA,UANF,yDAnBF,oBAoBI,8BAXF,yBAkBE,0DAEA,iCACE,UACA,oBAGA,+DAIJ,wBACE,SAEA,aACA,eACA,qBAEA,QAEA,yBATF,wBAUG,WACC,uBAGF,0BACE,mBACA,iBAEA,eACA,sBACA,MC7Ta,QD4Ub,qBAEA,iBAEA,mBAEA,gCAEA,gBAtBA,mCAPF,0BAOwC,MElUzB,SFoUb,yBATF,0BAUI,eACA,aACA,iBACA,eAEA,yCACC,aAeH,iCACC,oBAGD,iEAEE,MCnXD,QDoXC,cC9VY,QDsWZ,gBANA,mCALF,iEAMI,MEnWS,QFoWT,cEtWU,SF6Wd,yBACC,wCACE,WCjYF,QDkYE,MC9XG,KDqYH,4BALA,yDAJF,wCAKI,WErYJ,QFsYI,MElYC,MFiZd,YACE,WAEA,uBACE,aACA,eACA,SAEA,yBACE,aACA,QAEA,eAEA,cAEA,6BACE,UAEA,mCAHF,6BAII,kBAIJ,4CACE","file":"style.min.css"}
\ No newline at end of file
+{"version":3,"sourceRoot":"","sources":["src/_fonts.scss","src/style.scss","src/colors/_light.scss","src/colors/_dark.scss"],"names":[],"mappings":"CAEQ,qKAER,WACE,sDAGF,kBACE,mDACA,gBAIF,UACE,uECXF,EACE,0CAGF,UACE,kBAGF,KACE,SAEA,WCbO,KDcP,MCbO,KDeP,mCANF,KAOI,WEjBK,QFkBL,MEjBK,MFqBT,KACE,gBAEA,eACE,sBACA,gBACA,WACA,oBACA,iBAGF,gBACE,sBACA,gBACA,UAIJ,WACE,gBAEA,WAEA,cAEA,aACA,sBAGF,MACE,2BAGF,EACE,gBACA,YAGF,IACE,eAGF,OACE,aACA,eACA,QACA,WAEA,yBANF,OAOI,UAIJ,MACE,kBACA,aACA,sBACA,sBACA,eACA,aACA,qBACA,kBACA,iBACA,eACA,gBAEA,0BACA,WC3Ea,QD4Eb,MCzFO,KDiGP,gBAsBA,iCA5BA,mCAjBF,MAkBI,cE7Ee,QF8Ef,WEhFW,QFiFX,ME9FK,MFmGP,YACE,kBACA,cC1FQ,QD2FR,WC5FI,QD6FJ,MCrGK,QD6GL,gBANA,mCANF,YAOI,cE/FM,QFgGN,WEjGE,QFkGF,MEzGM,SF8GR,kBACE,gBACA,qBAMJ,yBA/CF,MAgDI,uBAGF,yBAnDF,MAoDI,kBACA,YAGF,SACE,SACA,gBACA,gBAGF,YACE,kBACA,MACA,QACA,YACA,iBACA,iBAEA,wEAKA,gBAJA,mCATF,YAUI,yEAMJ,QACE,aAIJ,EACE,MC5JO,QD8JP,mCAHF,EAII,ME9JQ,SFiKV,UACE,WAIJ,UACE,wHAQA,2BACA,sBAEA,aARA,mCAJF,UAKI,mHASF,qBACE,YAEA,aACA,mBAEA,mBACA,8BAEA,yBATF,qBAUI,wBAGF,yBACE,aACA,sBAEA,SAEA,kCACE,uBAEA,yBAHF,kCAII,oBAGF,mCACE,sCACE,kBAIJ,uCACE,eACA,YAIJ,4CAKE,mBACA,QALA,yBADF,4CAEI,cAMF,kDACE,kBACA,eAEA,qEACE,cACA,2BACA,yBAQZ,WAIE,WAEA,eACA,QACA,UACA,eAEA,WC7PO,QD8PP,MC1PY,KDiQZ,iBAEA,mBAEA,iBACA,iBAEA,eAzBA,yBADF,WAEI,cAYF,mCAdF,WAeI,WEjQK,QFkQL,ME9PU,MF2Qd,SACE,WAEA,qBACA,uBAEA,WC7QM,QD+QN,mCARF,SASI,aE/QQ,QFgRR,WEjRI,SFoRN,oBACE,kBAEA,aACA,eAEA,mBACA,8BAEA,yBATF,oBAUI,eACA,MACA,OACA,WACA,YACA,UAEA,2BACA,iCAKA,uBACA,sBACA,UANA,yDAnBJ,oBAoBM,8BAXJ,yBAkBE,0CACE,gBAGF,iCACE,UACA,oBAGA,mCACE,4BAKN,wBACE,SAEA,aACA,eACA,qBAEA,QAEA,yBATF,wBAUI,WACA,uBAGF,0BACE,mBACA,iBAEA,eACA,sBACA,MCnUa,QDoVb,qBAEA,iBAEA,mBAEA,gCAEA,gBAxBA,mCAPF,0BAQI,MEzUW,SF4Ub,yBAXF,0BAYI,eACA,aACA,iBACA,eAEA,yCACE,aAeJ,iCACE,oBAGF,iEAEE,MC3XD,QD4XC,cCtWY,QD8WZ,gBANA,mCALF,iEAMI,ME3WS,QF4WT,cE9WU,SFqXd,yBACE,wCACE,WCzYH,QD0YG,MCtYE,KD6YF,4BALA,yDAJF,wCAKI,WE7YL,QF8YK,ME1YA,MFyZd,YACE,WAEA,uBACE,aACA,eACA,SAEA,yBACE,aACA,QAEA,eAEA,cAEA,6BACE,UAEA,mCAHF,6BAII,kBAIJ,4CACE","file":"style.min.css"}
\ No newline at end of file
diff --git a/index.php b/index.php
index 4f0d546..500ec35 100644
--- a/index.php
+++ b/index.php
@@ -84,15 +84,21 @@
global $twig, $mysql;
$twig->addGlobal('pageUri', '/profile');
-
- $user = $mysql->getUserRecordFromId($_SESSION['user']['id']);
- if($user == null) {
+ if (isset($_SESSION['user'])) {
+ $user = $mysql->getUserRecordFromId($_SESSION['user']['id']);
+
+ if ($user == null && $user['admin'] == 0) {
+ http_response_code(404);
+
+ echo $twig->render('404.twig');
+ } else {
+ echo $twig->render('profile.twig', array('db_data' => $user));
+ }
+ } else {
http_response_code(404);
echo $twig->render('404.twig');
- } else {
- echo $twig->render('profile.twig', array('db_data' => $user));
}
});
@@ -114,12 +120,12 @@
global $twig, $mysql, $discord;
$twig->addGlobal('pageUri', '/u/' . $name);
-
+
$user = $mysql->getUserRecordFromUsername($name);
-
+
if($user == null) {
http_response_code(404);
-
+
echo $twig->render('404.twig');
} else {
echo $twig->render('user.twig', array('db_user' => $user));
@@ -133,17 +139,32 @@
$twig->addGlobal('pageUri', '/admin');
- $user = $mysql->getUserRecordFromId($_SESSION['user']['id']);
+ if (isset($_SESSION['user'])) {
+ $user = $mysql->getUserRecordFromId($_SESSION['user']['id']);
- if($user == null && $user['admin'] == 0) {
+ $users = $mysql->getUsers();
+ $markers = $mysql->getMarkers();
+
+ if ($user == null && $user['admin'] == 0) {
+ http_response_code(404);
+
+ echo $twig->render('404.twig');
+ } else {
+ echo $twig->render('admin/index.twig', array('users' => $users, 'markers' => $markers));
+ }
+ } else {
http_response_code(404);
echo $twig->render('404.twig');
- } else {
- echo $twig->render('admin/index.twig', array('db_data' => $user));
}
});
+ // ---------------- Admin API ---------------- //
+
+ $adminApi = new Admin($router);
+
+ $adminApi->registerApiRoutes();
+
// ----------------- 404 ----------------- //
$router->set404(function() {
diff --git a/js/map.js b/js/map.js
index e4a08f8..240b083 100644
--- a/js/map.js
+++ b/js/map.js
@@ -137,13 +137,13 @@ const updatePlayerPos = (players) =>{
mappedPlayers[player.uniqueId] = playerMarker;
} else {
const playerIcon = L.icon({
- iconUrl: `https://mc-heads.net/avatar/${player.displayName}`,
+ iconUrl: `https://mc-heads.net/avatar/${player.displayName}/16`,
iconSize: [28, 28],
iconAnchor: [14, 14],
popupAnchor: [0, -14]
});
- const marker = L.marker([player.location.z, player.location.x], { icon: playerIcon })
+ const marker = L.marker([player.location.z, player.location.x], { icon: playerIcon, alt: player.displayName })
.bindPopup(`${player.displayName} (${Math.floor(player.location.x)}; ${Math.floor(player.location.y)}; ${Math.floor(player.location.z)})`);
playerMarkers.addLayer(marker);
diff --git a/template/admin/index.twig b/template/admin/index.twig
index 4acf566..450254f 100644
--- a/template/admin/index.twig
+++ b/template/admin/index.twig
@@ -11,7 +11,138 @@
-
soon
+
Users
+
+
+
+
+ id
+ username
+ display_name
+ is_admin
+ date
+ actions
+
+
+
+ {% for user in users %}
+
+ {{ user.id }}
+ {{ user.username }}
+ {{ user.display_name }}
+ {{ user.is_admin == 1 ? "true" : "false" }}
+ {{ user.date }}
+
+ {% if user.is_admin == 1 %}
+ Revoke Admin
+ {% else %}
+ Make Admin
+ {% endif %}
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus aspernatur fugit id impedit iusto perferendis possimus provident quos sunt vero. Assumenda blanditiis culpa eaque error ipsa non quasi sint unde?
+
+
+
+
+
+
+
+
Markers
+
+
+
+
+ id
+ name
+ category
+ data
+ actions
+
+
+
+ {% for marker in markers %}
+
+ {{ marker.id }}
+ {{ marker.name }}
+ {{ marker.category }}
+ {{ marker.data }}
+
+ Edit
+
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit. Accusamus aspernatur fugit id impedit iusto perferendis possimus provident quos sunt vero. Assumenda blanditiis culpa eaque error ipsa non quasi sint unde?
+
+
+
+
+
+
+
diff --git a/util/Admin.php b/util/Admin.php
new file mode 100644
index 0000000..bb9e32c
--- /dev/null
+++ b/util/Admin.php
@@ -0,0 +1,81 @@
+router = $router;
+ }
+
+ function notFound($error): void {
+ header('Content-Type: application/json');
+ http_response_code(404);
+
+ echo json_encode(array(
+ 'error' => true,
+ 'error_description' => $error
+ ));
+
+ exit();
+ }
+
+ function isSignedInAdmin(): void {
+ global $mysql;
+
+ if(!isset($_SESSION['user'])) {
+ $this->notFound('You are not logged in.');
+ }
+
+ $user = $mysql->getUserRecordFromId($_SESSION['user']['id']);
+
+ if($user == null && $user['admin'] == 0) {
+ $this->notFound('You are not an admin.');
+ }
+ }
+
+ function registerApiRoutes(): void {
+ $router = $this->router;
+
+ $router->mount('/admin/api', function() use ($router) {
+ $router->mount('/v1', function() use ($router) {
+ $router->get('/markers', function() {
+ global $mysql;
+
+ header('Content-Type: application/json');
+
+ $this->isSignedInAdmin();
+
+ $markers = $mysql->getMarkers();
+
+ $markersNew = array();
+
+ foreach ($markers as $marker) {
+ $markersNew[] = array(
+ 'id' => $marker['id'],
+ 'name' => $marker['name'],
+ 'category' => $marker['category'],
+ 'x' => floatval(explode(';', $marker['data'])[1]),
+ 'y' => floatval(explode(';', $marker['data'])[0])
+ );
+ }
+
+ $finalOut = array(
+ 'error' => false,
+ 'markers' => $markersNew
+ );
+
+ echo json_encode($finalOut);
+ });
+
+ $router->get('/users', function() {
+ global $mysql;
+
+ header('Content-Type: application/json');
+
+ $this->isSignedInAdmin();
+
+ echo json_encode($mysql->getUsers());
+ });
+ });
+ });
+ }
+ }
\ No newline at end of file
diff --git a/util/Database.php b/util/Database.php
index b6988a8..2cfd5c2 100644
--- a/util/Database.php
+++ b/util/Database.php
@@ -58,7 +58,23 @@
}
}
- function getMarkers() {
+ function getUsers(): array | null {
+ $sql = 'SELECT * FROM users';
+
+ $stmt = $this->conn->prepare($sql);
+
+ $stmt->execute();
+
+ $res = $stmt->get_result();
+
+ if($res->num_rows > 0) {
+ return $res->fetch_all(MYSQLI_ASSOC);
+ } else {
+ return null;
+ }
+ }
+
+ function getMarkers(): array | null {
$sql = 'SELECT * FROM markers';
$stmt = $this->conn->prepare($sql);