Compare commits

..

6 Commits

Author SHA1 Message Date
Hickmeister
b6da8a5ad5 adding printer form 2025-01-04 14:28:53 +00:00
Hickmeister
3216e90c4f renamed to .php 2025-01-04 14:28:31 +00:00
Hickmeister
0fa05b6514 added env 2025-01-04 14:28:17 +00:00
Hickmeister
a8676a432f created page template 2025-01-04 14:27:59 +00:00
Hickmeister
155b1ff293 Added GitIgnore 2025-01-04 14:27:42 +00:00
Hickmeister
9dd13bc802 Added Etsy Auth 2025-01-04 14:27:31 +00:00
10 changed files with 553 additions and 3 deletions

13
.gitignore vendored Normal file
View File

@@ -0,0 +1,13 @@
# Ignore .env file to keep sensitive data out of version control
.env
# Ignore compiled PHP files
*.php~
# Ignore token files
etsyTokens.json
# Ignore system and IDE files
.DS_Store
node_modules/
vendor/

252
addPrinter.php Normal file
View File

@@ -0,0 +1,252 @@
<?php include 'assets/php/session_check.php'; ?>
<html lang="en" data-bs-theme="light">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--favicon-->
<link rel="icon" href="assets/images/favicon-32x32.png" type="image/png">
<!--plugins-->
<link href="assets/plugins/vectormap/jquery-jvectormap-2.0.2.css" rel="stylesheet">
<link href="assets/plugins/simplebar/css/simplebar.css" rel="stylesheet">
<link href="assets/plugins/perfect-scrollbar/css/perfect-scrollbar.css" rel="stylesheet">
<link href="assets/plugins/metismenu/css/metisMenu.min.css" rel="stylesheet">
<!-- loader-->
<link href="assets/css/pace.min.css" rel="stylesheet"/>
<script src="assets/js/pace.min.js"></script>
<!-- Bootstrap CSS -->
<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<link href="assets/css/bootstrap-extended.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap" rel="stylesheet">
<link href="assets/sass/app.css" rel="stylesheet">
<link href="assets/css/icons.css" rel="stylesheet">
<link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
<!-- Theme Style CSS -->
<link rel="stylesheet" href="assets/sass/dark-theme.css">
<link rel="stylesheet" href="assets/sass/semi-dark.css">
<link rel="stylesheet" href="assets/sass/bordered-theme.css">
<title>TOD Dashboard</title>
</head>
<body>
<!--wrapper-->
<div class="wrapper">
<!--sidebar wrapper -->
<?php include 'assets/php/nav.php'; ?>
<!--end sidebar wrapper -->
<!--start header -->
<header>
<div class="topbar">
<nav class="navbar navbar-expand gap-2 align-items-center">
<div class="mobile-toggle-menu d-flex"><i class='bx bx-menu'></i>
</div>
<div class="search-bar d-lg-block d-none" data-bs-toggle="modal" data-bs-target="#SearchModal">
<a href="avascript:;" class="btn d-flex align-items-center"><i class="bx bx-search"></i>Search</a>
</div>
<div class="top-menu ms-auto">
<ul class="navbar-nav align-items-center gap-1">
<li class="nav-item mobile-search-icon d-flex d-lg-none" data-bs-toggle="modal" data-bs-target="#SearchModal">
<a class="nav-link" href="avascript:;"><i class='bx bx-search'></i>
</a>
</li>
<li class="nav-item dark-mode d-none d-sm-flex">
<a class="nav-link dark-mode-icon" href="javascript:;"><i class='bx bx-moon'></i>
</a>
</li>
<li class="nav-item dropdown dropdown-large">
<a class="nav-link dropdown-toggle dropdown-toggle-nocaret position-relative" href="#" data-bs-toggle="dropdown"><span class="alert-count">7</span>
<i class='bx bx-bell'></i>
</a>
<div class="dropdown-menu dropdown-menu-end">
<a href="javascript:;">
<div class="msg-header">
<p class="msg-header-title">Notifications</p>
<p class="msg-header-badge">8 New</p>
</div>
</a>
<div class="header-notifications-list">
<a class="dropdown-item" href="javascript:;">
<div class="d-flex align-items-center">
<div class="user-online">
<img src="assets/images/avatars/avatar-1.png" class="msg-avatar" alt="user avatar">
</div>
<div class="flex-grow-1">
<h6 class="msg-name">Daisy Anderson<span class="msg-time float-end">5 sec
ago</span></h6>
<p class="msg-info">The standard chunk of lorem</p>
</div>
</div>
</a>
</div>
<a href="javascript:;">
<div class="text-center msg-footer">
<button class="btn btn-primary w-100">View All Notifications</button>
</div>
</a>
</div>
</li>
</ul>
</div>
<div class="user-box dropdown px-3">
<a class="d-flex align-items-center nav-link dropdown-toggle gap-3 dropdown-toggle-nocaret" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="assets/images/avatars/avatar-2.png" class="user-img" alt="user avatar">
<div class="user-info">
<p class="user-name mb-0"><?php echo isset($_SESSION['username']) ? htmlspecialchars($_SESSION['username']) : 'Guest'; ?></p>
<p class="designattion mb-0"><?php echo isset($_SESSION['role']) ? htmlspecialchars($_SESSION['role']) : 'N/A'; ?></p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-user fs-5"></i><span>Profile</span></a>
</li>
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-cog fs-5"></i><span>My Printers</span></a>
</li>
<li>
<div class="dropdown-divider mb-0"></div>
</li>
<li><a class="dropdown-item d-flex align-items-center" href="logout.php"><i class="bx bx-log-out-circle"></i><span>Logout</span></a>
</li>
</ul>
</div>
</nav>
</div>
</header>
<!--end header -->
<!--start page wrapper -->
<div class="page-wrapper">
<div class="page-content">
<!--start page content -->
<!--breadcrumb-->
<div class="page-breadcrumb d-none d-sm-flex align-items-center mb-3">
<div class="breadcrumb-title pe-3">User Settings</div>
<div class="ps-3">
<nav aria-label="breadcrumb">
<ol class="breadcrumb mb-0 p-0">
<li class="breadcrumb-item"><a href="javascript:;"><i class="bx bx-home-alt"></i></a>
</li>
<li class="breadcrumb-item active" aria-current="page">Add Printer</li>
</ol>
</nav>
</div>
</div>
<!--end breadcrumb-->
<div class="row">
<div class="col-lg-8 mx-auto">
<div class="card">
<div class="card-header px-4 py-3">
<h5 class="mb-0">Add New Printer</h5>
</div>
<div class="card-body p-4">
<form id="printerForm" method="post" action="addPrinter.php">
<!-- Printer Name -->
<div class="row mb-3">
<label for="printerName" class="col-sm-3 col-form-label">Printer Name</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="printerName" name="printerName" placeholder="Bambu X1 or P1P" required>
</div>
</div>
<!-- Printer IP -->
<div class="row mb-3">
<label for="printerIp" class="col-sm-3 col-form-label">Printer IP</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="printerIp" name="printerIp" placeholder="e.g., 192.168.1.100" required>
</div>
</div>
<!-- Serial Number -->
<div class="row mb-3">
<label for="serialNumber" class="col-sm-3 col-form-label">Serial Number</label>
<div class="col-sm-9">
<input type="text" class="form-control" id="serialNumber" name="serialNumber" placeholder="e.g., X1SN123456" required>
</div>
</div>
<!-- Printer Access Code -->
<div class="row mb-3">
<label for="accessCode" class="col-sm-3 col-form-label">Printer Access Code</label>
<div class="col-sm-9">
<input type="password" class="form-control" id="accessCode" name="accessCode" placeholder="Enter Printer Access Code" required>
</div>
</div>
<!-- Submit and Reset Buttons -->
<div class="row">
<label class="col-sm-3 col-form-label"></label>
<div class="col-sm-9">
<div class="d-md-flex d-grid align-items-center gap-3">
<button type="submit" class="btn btn-primary px-4">Add Printer</button>
<button type="reset" class="btn btn-light px-4">Reset</button>
</div>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
<!--end page content -->
</div>
</div>
<!--end page wrapper -->
<!--start overlay-->
<div class="overlay mobile-toggle-icon"></div>
<!--end overlay-->
<!--Start Back To Top Button-->
<a href="javaScript:;" class="back-to-top"><i class='bx bxs-up-arrow-alt'></i></a>
<!--End Back To Top Button-->
<footer class="page-footer">
<p class="mb-0">Copyright © 2024. All right reserved.</p>
</footer>
</div>
<!--end wrapper-->
<!-- search modal -->
<div class="modal" id="SearchModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen-md-down">
<div class="modal-content">
<div class="modal-header gap-2">
<div class="position-relative popup-search w-100">
<input class="form-control form-control-lg ps-5 border border-3 border-primary" type="search" placeholder="Search">
<span class="position-absolute top-50 search-show ms-3 translate-middle-y start-0 top-50 fs-4"><i class='bx bx-search'></i></span>
</div>
<button type="button" class="btn-close d-md-none" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
</div>
</div>
</div>
<!-- end search modal -->
<!-- Bootstrap JS -->
<script src="assets/js/bootstrap.bundle.min.js"></script>
<!--plugins-->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/plugins/simplebar/js/simplebar.min.js"></script>
<script src="assets/plugins/metismenu/js/metisMenu.min.js"></script>
<script src="assets/plugins/perfect-scrollbar/js/perfect-scrollbar.js"></script>
<script src="assets/plugins/apexcharts-bundle/js/apexcharts.min.js"></script>
<!--app JS-->
<script src="assets/js/app.js"></script>
<script src="assets/js/index.js"></script>
<script src="assets/plugins/peity/jquery.peity.min.js"></script>
<script>
$(".data-attributes span").peity("donut")
</script>
</body>
</html>

15
assets/php/envLoader.php Normal file
View File

@@ -0,0 +1,15 @@
<?php
function loadEnv($path) {
if (!file_exists($path)) {
throw new Exception('.env file not found.');
}
$lines = file($path, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
if (strpos($line, '=') !== false) {
list($key, $value) = explode('=', $line, 2);
$_ENV[$key] = trim($value);
}
}
}
?>

View File

@@ -0,0 +1,25 @@
<?php
include '/mnt/www-live/TechOdyssey_Designs_Dashboard/assets/php/session_check.php';
require '/mnt/www-live/TechOdyssey_Designs_Dashboard/assets/php/envLoader.php'; // Load envLoader from php/
loadEnv(__DIR__ . '/../../../.env'); // Go up three levels to root for .env
$clientId = $_ENV['ETSY_KEYSTRING'];
$redirectUri = $_ENV['ETSY_REDIRECT_URI'];
$scope = 'transactions_r';
$state = bin2hex(random_bytes(16));
session_start();
$_SESSION['oauth_state'] = $state;
// Authorization URL
$url = "https://www.etsy.com/oauth/connect?" . http_build_query([
'response_type' => 'code',
'client_id' => $clientId,
'redirect_uri' => $redirectUri,
'scope' => $scope,
'state' => $state
]);
header("Location: $url");
exit;
?>

View File

@@ -0,0 +1,33 @@
<?php
include '/mnt/www-live/TechOdyssey_Designs_Dashboard/assets/php/session_check.php';
require '/mnt/www-live/TechOdyssey_Designs_Dashboard/assets/php/envLoader.php'; // Load envLoader from php/
loadEnv(__DIR__ . '/../../../.env'); // Go up three levels to find .env
session_start();
if ($_GET['state'] !== $_SESSION['oauth_state']) {
die('Invalid state. Possible CSRF attack.');
}
$code = $_GET['code'];
$clientId = $_ENV['ETSY_KEYSTRING'];
$clientSecret = $_ENV['ETSY_SECRET'];
$redirectUri = $_ENV['ETSY_REDIRECT_URI'];
$data = [
'grant_type' => 'authorization_code',
'client_id' => $clientId,
'client_secret' => $clientSecret,
'code' => $code,
'redirect_uri' => $redirectUri
];
$ch = curl_init("https://api.etsy.com/v3/public/oauth/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$response = curl_exec($ch);
$tokens = json_decode($response, true);
file_put

View File

@@ -0,0 +1,27 @@
<?php
include '/mnt/www-live/TechOdyssey_Designs_Dashboard/assets/php/session_check.php';
require '/mnt/www-live/TechOdyssey_Designs_Dashboard/assets/php/envLoader.php'; // Load envLoader from php/
loadEnv(__DIR__ . '/../../../.env'); // Go up three levels to find .env
function refreshAccessToken() {
$tokens = json_decode(file_get_contents('etsyTokens.json'), true);
$refreshToken = $tokens['refresh_token'];
$data = [
'grant_type' => 'refresh_token',
'client_id' => $_ENV['ETSY_KEYSTRING'],
'client_secret' => $_ENV['ETSY_SECRET'],
'refresh_token' => $refreshToken
];
$ch = curl_init("https://api.etsy.com/v3/public/oauth/token");
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
$response = curl_exec($ch);
$newTokens = json_decode($response, true);
file_put_contents('etsyTokens.json', json_encode($newTokens));
echo "Token refreshed successfully.";
}
?>

View File

@@ -1,7 +1,7 @@
<?php <?php
session_start(); session_start();
if (!isset($_SESSION['user_id'])) { if (!isset($_SESSION['user_id'])) {
header("Location: /login.html"); header("Location: /login.php");
exit(); exit();
} }
?> ?>

View File

@@ -35,7 +35,7 @@
<div class="card-body p-sm-5"> <div class="card-body p-sm-5">
<div class="text-center mb-4"> <div class="text-center mb-4">
<img src="assets/images/logo-icon.png" width="60" alt=""> <img src="assets/images/logo-icon.png" width="60" alt="">
<h5>Syndron Admin</h5> <h5>TechOdyssey Designs Dashboard</h5>
<p>Please log in to your account</p> <p>Please log in to your account</p>
</div> </div>
<form id="loginForm" class="row g-3"> <form id="loginForm" class="row g-3">

View File

@@ -2,6 +2,6 @@
session_start(); session_start();
session_unset(); session_unset();
session_destroy(); session_destroy();
header("Location: /login.html"); header("Location: /login.php");
exit(); exit();
?> ?>

185
template.php Normal file
View File

@@ -0,0 +1,185 @@
<?php include 'assets/php/session_check.php'; ?>
<html lang="en" data-bs-theme="light">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!--favicon-->
<link rel="icon" href="assets/images/favicon-32x32.png" type="image/png">
<!--plugins-->
<link href="assets/plugins/vectormap/jquery-jvectormap-2.0.2.css" rel="stylesheet">
<link href="assets/plugins/simplebar/css/simplebar.css" rel="stylesheet">
<link href="assets/plugins/perfect-scrollbar/css/perfect-scrollbar.css" rel="stylesheet">
<link href="assets/plugins/metismenu/css/metisMenu.min.css" rel="stylesheet">
<!-- loader-->
<link href="assets/css/pace.min.css" rel="stylesheet"/>
<script src="assets/js/pace.min.js"></script>
<!-- Bootstrap CSS -->
<link href="assets/css/bootstrap.min.css" rel="stylesheet">
<link href="assets/css/bootstrap-extended.css" rel="stylesheet">
<link href="https://fonts.googleapis.com/css2?family=Roboto:wght@400;500&display=swap" rel="stylesheet">
<link href="assets/sass/app.css" rel="stylesheet">
<link href="assets/css/icons.css" rel="stylesheet">
<link href='https://unpkg.com/boxicons@2.1.4/css/boxicons.min.css' rel='stylesheet'>
<!-- Theme Style CSS -->
<link rel="stylesheet" href="assets/sass/dark-theme.css">
<link rel="stylesheet" href="assets/sass/semi-dark.css">
<link rel="stylesheet" href="assets/sass/bordered-theme.css">
<title>TOD Dashboard</title>
</head>
<body>
<!--wrapper-->
<div class="wrapper">
<!--sidebar wrapper -->
<?php include 'assets/php/nav.php'; ?>
<!--end sidebar wrapper -->
<!--start header -->
<header>
<div class="topbar">
<nav class="navbar navbar-expand gap-2 align-items-center">
<div class="mobile-toggle-menu d-flex"><i class='bx bx-menu'></i>
</div>
<div class="search-bar d-lg-block d-none" data-bs-toggle="modal" data-bs-target="#SearchModal">
<a href="avascript:;" class="btn d-flex align-items-center"><i class="bx bx-search"></i>Search</a>
</div>
<div class="top-menu ms-auto">
<ul class="navbar-nav align-items-center gap-1">
<li class="nav-item mobile-search-icon d-flex d-lg-none" data-bs-toggle="modal" data-bs-target="#SearchModal">
<a class="nav-link" href="avascript:;"><i class='bx bx-search'></i>
</a>
</li>
<li class="nav-item dark-mode d-none d-sm-flex">
<a class="nav-link dark-mode-icon" href="javascript:;"><i class='bx bx-moon'></i>
</a>
</li>
<li class="nav-item dropdown dropdown-large">
<a class="nav-link dropdown-toggle dropdown-toggle-nocaret position-relative" href="#" data-bs-toggle="dropdown"><span class="alert-count">7</span>
<i class='bx bx-bell'></i>
</a>
<div class="dropdown-menu dropdown-menu-end">
<a href="javascript:;">
<div class="msg-header">
<p class="msg-header-title">Notifications</p>
<p class="msg-header-badge">8 New</p>
</div>
</a>
<div class="header-notifications-list">
<a class="dropdown-item" href="javascript:;">
<div class="d-flex align-items-center">
<div class="user-online">
<img src="assets/images/avatars/avatar-1.png" class="msg-avatar" alt="user avatar">
</div>
<div class="flex-grow-1">
<h6 class="msg-name">Daisy Anderson<span class="msg-time float-end">5 sec
ago</span></h6>
<p class="msg-info">The standard chunk of lorem</p>
</div>
</div>
</a>
</div>
<a href="javascript:;">
<div class="text-center msg-footer">
<button class="btn btn-primary w-100">View All Notifications</button>
</div>
</a>
</div>
</li>
</ul>
</div>
<div class="user-box dropdown px-3">
<a class="d-flex align-items-center nav-link dropdown-toggle gap-3 dropdown-toggle-nocaret" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false">
<img src="assets/images/avatars/avatar-2.png" class="user-img" alt="user avatar">
<div class="user-info">
<p class="user-name mb-0"><?php echo isset($_SESSION['username']) ? htmlspecialchars($_SESSION['username']) : 'Guest'; ?></p>
<p class="designattion mb-0"><?php echo isset($_SESSION['role']) ? htmlspecialchars($_SESSION['role']) : 'N/A'; ?></p>
</div>
</a>
<ul class="dropdown-menu dropdown-menu-end">
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-user fs-5"></i><span>Profile</span></a>
</li>
<li><a class="dropdown-item d-flex align-items-center" href="javascript:;"><i class="bx bx-cog fs-5"></i><span>My Printers</span></a>
</li>
<li>
<div class="dropdown-divider mb-0"></div>
</li>
<li><a class="dropdown-item d-flex align-items-center" href="logout.php"><i class="bx bx-log-out-circle"></i><span>Logout</span></a>
</li>
</ul>
</div>
</nav>
</div>
</header>
<!--end header -->
<!--start page wrapper -->
<div class="page-wrapper">
<div class="page-content">
<!--start page content -->
<!--end page content -->
</div>
</div>
<!--end page wrapper -->
<!--start overlay-->
<div class="overlay mobile-toggle-icon"></div>
<!--end overlay-->
<!--Start Back To Top Button-->
<a href="javaScript:;" class="back-to-top"><i class='bx bxs-up-arrow-alt'></i></a>
<!--End Back To Top Button-->
<footer class="page-footer">
<p class="mb-0">Copyright © 2024. All right reserved.</p>
</footer>
</div>
<!--end wrapper-->
<!-- search modal -->
<div class="modal" id="SearchModal" tabindex="-1">
<div class="modal-dialog modal-dialog-centered modal-dialog-scrollable modal-fullscreen-md-down">
<div class="modal-content">
<div class="modal-header gap-2">
<div class="position-relative popup-search w-100">
<input class="form-control form-control-lg ps-5 border border-3 border-primary" type="search" placeholder="Search">
<span class="position-absolute top-50 search-show ms-3 translate-middle-y start-0 top-50 fs-4"><i class='bx bx-search'></i></span>
</div>
<button type="button" class="btn-close d-md-none" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
</div>
</div>
</div>
<!-- end search modal -->
<!-- Bootstrap JS -->
<script src="assets/js/bootstrap.bundle.min.js"></script>
<!--plugins-->
<script src="assets/js/jquery.min.js"></script>
<script src="assets/plugins/simplebar/js/simplebar.min.js"></script>
<script src="assets/plugins/metismenu/js/metisMenu.min.js"></script>
<script src="assets/plugins/perfect-scrollbar/js/perfect-scrollbar.js"></script>
<script src="assets/plugins/apexcharts-bundle/js/apexcharts.min.js"></script>
<!--app JS-->
<script src="assets/js/app.js"></script>
<script src="assets/js/index.js"></script>
<script src="assets/plugins/peity/jquery.peity.min.js"></script>
<script>
$(".data-attributes span").peity("donut")
</script>
</body>
</html>